我们的这个爬虫设计来爬取京东图书(jd.com)。
scrapy框架相信大家比较了解了。里面有很多复杂的机制,超出本文的范围。
1、爬虫spider
tips:
1、xpath的语法比较坑,但是你可以在chrome上装一个xpath helper,轻松帮你搞定xpath正则表达式
2、动态内容,比如价格等是不能爬取到的
3、如本代码中,评论爬取部分代码涉及xpath对象的链式调用,可以参考
#-*- coding: utf-8 -*-
#import scrapy # 可以用这句代替下面三句,但不推荐
from scrapy.spiders importSpiderfrom scrapy.selector importSelectorfrom scrapy importRequestfrom scrapy.linkextractors.lxmlhtml importLxmlLinkExtractorfrom jdbook.items import JDBookItem #如果报错是pyCharm对目录理解错误的原因,不影响
classJDBookSpider(Spider):
name= "jdbook"allowed_domains= ["jd.com"] #允许爬取的域名,非此域名的网页不会爬取
start_urls =[#起始url,这里设置为从最大tid开始,向0的方向迭代
"http://item.jd.com/11678007.html"]#用来保持登录状态,可把chrome上拷贝下来的字符串形式cookie转化成字典形式,粘贴到此处
cookies ={}#发送给服务器的http头信息,有的网站需要伪装出浏览器头进行爬取,有的则不需要
headers ={#'Connection': 'keep - alive',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'}#对请求的返回进行处理的配置
meta ={'dont_redirect': True, #禁止网页重定向
'handle_httpstatus_list': [301, 302] #对哪些异常返回进行处理
}defget_next_url(self, old_url):'''description: 返回下次迭代的url
:param oldUrl: 上一个爬去过的url
:return: 下次要爬取的url'''
#传入的url格式:http://www.heartsong.top/forum.php?mod=viewthread&tid=34
list = old_url.split('/') #用等号分割字符串
old_item_id = int(list[3].sp