Python爬虫爬取豆瓣不同分类书籍详细信息
2.爬虫代码的组成
因为豆瓣上是有反爬的,我搜了很久也没有彻底解决,但是现在基本上一天搜集近万条图书信息是没有问题的。代码主要分为以下三部分:
-
user.py 这部分是用来写UserAgent的,这个UserAgent就是一个用户代理,每个浏览器都会有的,爬虫如果不加这个UserAgent,会被网页默认为不通过浏览器来访问,认为是机器,就会限制访问,这里请求头部分最好加上信息完整一点比较好,我这里是只加了UserAgent的 proxy.py 这部分用来存动态代理的ip信息,因为有的网站当你用同一个ip获取大量数据以后且速度很快,也会认为这是机器在进行操作,而不属于用户的正常访问,此时ip被禁,就连访问网页也不能了,所以得使用动态代理,让网站认为是不同的ip访问,免费的代理网站有好几个,在这里推荐一下我用的两个 链接1: .https://www.xicidaili.com/nn/ 链接2: . http://www.kuaidaili.com/free/inha/6 后面的6是网页代理的第六页,改变数字也就是不同的页,每一页都有15个代理ip,可根据需要选用 searchBook.py 这部分是用来写爬虫的详细代码了,就不细说了 ,在代码里都给了注释
3.代码实现
user.py
proxy.py(代理二选一即可)
#快代理 import requests from lxml.html import etree url = http://www.kuaidaili.com/free/inha/6#快代理 data =requests.get(url) html = etree.HTML(data.text) #找xpath ip_xpath = //*[@id="list"]/table/tbody/tr/td[1]/text() port_xpath = //*[@id="list"]/table/tbody/tr/td[2]/text() http_or_https_xpath =//*[@id="list"]/table/tbody/tr/td[4]/text() #匹配内容 ip_list = rp_html.xpath(ip_xpath) port_list = rp_html.xpath(port_xpath) http_or_https_list = rp_html.xpath(http_or_https_xpath) #进行组合 list_zip = zip(ip_list,port_list,http_or_https_list) proxy_dict= { } proxy_list = [] for ip,port,http_or_https in list_zip: proxy_dict[http_or_https] = f{ip}:{port} proxy_list.append(proxy_dict) proxy_dict = { } #西刺代理 # import re # # import requests # from bs4 import BeautifulSoup # # import user # # import random # # # def getListProxies(): # session = requests.session() # headers = {User-Agent: user.getuser()} # proxies = random.choice(proxy_list) # page = session.get("http://www.xicidaili.com/nn/2", headers = headers,proxies = proxies)#西刺代理 # soup = BeautifulSoup(page.text, lxml) # # proxyList = [] # taglist = soup.find_all(tr, attrs={class: re.compile("(odd)|()")}) # for trtag in taglist: # tdlist = trtag.find_all(td) # proxy = {http: tdlist[1].string + : + tdlist[2].string} # # proxyList.append(proxy) # # 设定代理ip个数 # if len(proxyList) >= 20: # break # # return proxyList
searchBook.py
4.运行结果
控制台打印输出可以方便观察爬虫是否意外停止和起到检测程序运行作用,代码最后将信息以json格式保存。当然如果需要保存图片和和将信息写进数据库也是可以实现的。这是第一次使用python写个爬虫,写个博客记录一下。