一:pipeline的介绍
1.1使用pipeline:从pipeline的字典形式可以看出,pipeline可以有多个,而且确实pipeline能够自定义多个
1.2为什么需要多个pipeline:1:可能会有多个spider,不同的pipeline处理不同的item的内容 2:一个spider的内容可能要做不同的操作,比如存入不同的数据库中
注意:pipeline的权重越小优先级越高;pipeline中的process_Item方法名不能修改为其他的名称
二:logging模块的使用
2.1scrapy项目中:settings中设置LOG_LEVEL='WARNING';settings中设置LOG_FILE='./a.log'(设置日志保存的位置,设置会后端不会显示日志内容);import logging,实例化logger的方式在任何文件夹中使用logger输出内容
2.2普通项目中:import logging--logging.basicCinfig(...) #设置日志输出的样式,格式
实例化一个`logger=logging.getLogger(__name__)`
在任何py文件中调用logger即可
三:构造请求和腾讯爬虫
3.1实现翻页请求 next_page_url=respose.xpath("//a[text()='下一页']/@href").extrct()
while len(next_page_url)>0:
yield scrapy.Request(next_page_url,callback=self.parse)--scrapy.Request能构建一个requests,同时指定提取数据的callback函数
scrapy.Request知识点:
scrapy.Request(url,[,callback,method='GET',headers,body,cookies,meta,dont_fiter=False])
scrapy.Request常用参数为:
callback:指定传入的url交给哪个解析函数去处理
meta:实现不同的解析函数中传递数据,meta默认会携带部分信息,比如下载延迟,请求深度等
dont_filter:让scrpy的去重不会过滤当前url,scrpy默认有去重功能,对需要重复请求的url有重要用途
四:item的介绍和使用
class MyspiderItem(scrapy.Item):
name = scrapy.Field()
总的来说,可以把定义的MyspiderItem理解为一个字典
为什么scrapy要定义一个字典呢?
1.在获取到数据的时候,使用不同的Item来存放不同的数据
2.在把数据交给pipeline的时候,可以通过isinstance(item,MyspiderItem)来判断数据是属于那个Item,进行不同的数据(item)处理
五:scrapy shell的使用
5.1定义:Scrapy shell是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试xpath表达式
5.2response.url:当前响应的url地址;response.requests.url:当前响应对应的请求的url地址;response.headers:响应头;response.body:响应体,也就是html代码,默认是byte类型;response.requests.headers:当前响应的请求头