Scrapy框架学习(二)—-Item Pipeline(管道)和Scrapy Shell
Item Pipeline(管道)
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item进行处理。
每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是Item Pipeline的典型应用:
验证爬取的数据(检查爬取的数据是否包含某些字段,数据清洗)
查重(重复的数据丢弃)
将爬取的结果保存到文件或数据库
编写Item Pipeline类
在pipelines.py文件中定义一个Pipeline类,同时必须实现下面的方法:
process_item(self,item,spider)
每个item pipeline组件都需要调用该方法,这个方法必须返回一个Item对象,或是抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件处理。
代码如下:
import json
class BaiduPipeline(object):
def process_item(self, item, spider):
"""
处理item的方法,处理业务逻辑,保存数据,返回item
:param item: 是items.py中定义item类
:param spider: 是spiders目录中定义的Spider类
:return: 返回需要的item数据(经过清洗,业务逻辑处理后的item数据)
"""
print(spider) # 输出 <BaiDuSpider 'baidu' at 0x2133caee358>
print(type(spider)) # 输出 <class 'scrapydemo.spiders.baidu_spider.BaiDuSpider'>
print(spider.name) # 输出 baidu
print(item) # 输出 {'title': '百度一下'}
print(type(item)) # 输出 <class 'scrapydemo.items.BaiduItem'>
with open('baidu.json', 'w') as f:
jsondata = json.dumps(dict(item))
f.write(jsondata)
return item
Pipeline 除此之外还可以实现以下方法:
open_spider(self, spider)
当spider被开启是调用该方法。
spider参数:被开启的spider对象
close_spider(self, spider)
当spider被关闭时,这个方法被调用
spider参数:被关闭的spider对象
在settings配置Item Pipeline
在settings.py
文件中,将ITEM_PIPELINES
,注释打开,将我们编写的Item Pipeline配置好。
ITEM_PIPELINES = {
# 我们写好的Pipeline的路径,300表示优先级,范围(0-1000),越小级别越高
'scrapydemo.pipelines.BaiduPipeline': 300,
}
Scrapy Shell
Scrapy shell是一个交互终端,在未启动spider的情况下尝试及调试你的爬取代码。其本意是用来测试提取数据的代码。不过也可以将其当做正常的Python终端,在上面测试任何的Python代码。
该终端是用来测试XPath或CSS表达式,查看他们的工作方式及爬取的网页中提取的数据。该终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。
启动终端
进入项目的根目录,执行下面的命令,启动shell,以"http://www.baidu.com"
为例,如下:
scrapy shell “http://www.baidu.com”
命令执行后,结果如下图:
在我们执行scrapy shell url
命令后,Scrapy终端根据下载页面会自动创建一些方便使用的对象和可用的快捷命令,如:
可用的对象:
crawler
:当前的Crawler的对象spider
:处理URL的spider。request
:最近获取到的页面的Request对象。response
:包含最近获取到的页面的Response
对象。scrapy
:scrapy 模块 (包含 scrapy.Request, scrapy.Selector等)settings
:当前Scrapy项目的settings.py
可用的快捷命令:
shelp()
:打印可用对象及快捷命令的帮助列表fetch(request_or_url)
:根据给定的url
或request
获取到一个response
,并更新相关的对象view(response)
:在本机的浏览器打开给定的response
。会在response
的body
中添加一个<base>tag
,使得外部链接(例如图片及css
)能正常显示。
eg:
当我们执行scrapy shell "http://www.baidu.com"
命令时,通过response对象调用selector,在调用xpath()。输出xpath查询结果。
print(response.selector.xpath("//title"))
# 输出结果:[<Selector xpath='//title' data='<title>百度一下</title>'>]
除此之外,我们也可以通过response.selector.css()
来解析响应的页面数据。
Scrapy还提供了快捷方式,如:response.xpath()
,response.css()
。
eg:
print(response.xpath("//title"))
# 输出结果:[<Selector xpath='//title' data='<title>百度一下</title>'>]
Selector选择器
Scrapy Selector内置XPath和CSS Selector表达式机制
Selector
有四个基本的方法,最常用的还XPath
xpath()
:传入xpath
表达式,返回该表达式所对应的所有节点的Selector list
列表。ectract()
:序列化该节点为Unicode
字符串,并返回list。css()
:传入CSS
表达式,返回该表达式所对应的所有节点的selector list
列表,语法同BeautifulSoup4
。re()
:根据传入的正则表达式对数据进行提取,返回Unicode
字符串list
列表。
eg:
# 获取 title 标签的值
print(response.xpath("//title/text()")[0].extract())
# 输出: 百度一下