Python爬虫-Scrapy-CrawlSpider与ItemLoader
一、CrawlSpider
根据官方文档可以了解到, 虽然对于特定的网页来说不一定是最好的选择, 但是 CrwalSpider 是爬取规整的网页时最常用的 spider, 而且有很好的可塑性.
除了继承自 Spider 的属性, 它还拓展了一些其他的属性. 对我来说, 最常用的就是 rules 了.
爬虫一般来说分为垂直爬取和水平爬取, 这里拿 猫眼电影TOP100 举例. 垂直爬取就是从目录进入到内容详情后爬取, 即从当前页进入某一影片的详情页面; 水平爬取就是从这一页目录翻到下一页目录后爬取, 即从当前页到排名第十一至二十的页面. 不论是哪一种爬取, 都离不开 url, 即你想要去到的页面的链接, 而 rules 就为我们提供了一套提取链接的规则, 以及得到链接后应该怎么做.
来看一下 rules 中 Rule 的定义, class scrapy.spiders.
Rule
(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None), 这里也只说我自己经常用到的.
1. link_extractor:
class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths=(), tags=('a', 'area'), attrs=('href',), canonicalize=False, unique=True,
process_value=None, deny_extensions=None, restrict_css=(), strip=True)
提取链接的规则在这里定义, 并且提取出链接后会生成一个 scrapy.Request 对象. allow里是正则表达式, 过滤掉不符合要求的链接; restrict_xpath 和 restrict_css定义获取链接的区域.
2. callback:
回调函数, 请求得到相应后用什么方法处理, 和 Request 中的 callback 一样, 但是此处以字符串形式表示而不是方法引用.
3. follow:
请求得到响应后是否继续用本套rules规则来提取链接. 布尔值类型, 如果callback为None, 则默认为True, 否则为False.
这里的 rules 功能类似于 Spider类里的 parse() 方法, 请求 start_urls 中的链接, 并且返回新的 Request.
二、ItemLoader
Items 为抓取的数据提供了容器, 而 Item Loaders 提供填充容器的机制, 并且其API更加便捷好用.
之前用 Spider 类的时候, 一般都是直接使用 scrapy.item 的, 当网页高度规整的时候我们改用了 CrawlSpider 类. 当获取到高度规整的数据时, 我们想要进行处理, 这时候 Item Loader 就发挥其作用了.
定义: class scrapy.loader.ItemLoader(item=None, selector=None, response=None, parent=None, **context)
item: 自己定义的容器.
selector: Selector 对象, 提取填充数据的选择器.
response: Response 对象, 可以构造选择器的响应, 因为 scrapy 里的响应可以直接使用 xpath 或 css, 这里把它当成选择器也差不多.
ItemLoader 的使用:
from scrapy.loader import ItemLoader
from qoutes.items import QuoteItem
import time def parse_item(self, response):
quotes = response.css('.quote')
for quote in quotes:
loader = ItemLoader(item=QuoteItem(), selector=quote)
loader.add_css('author', '.author::text')
loader.add_css('tags', '.tag::text')
loader.add_xpath('text', './/*[@class="tag"]/text()')
loader.add_value('addtime', time.ctime())
yield loader.load_item()
相较于 Item 的字典类使用方法, ItemLoader 显得更简单明了, 这样的代码有着更好的可维护性以及自描述性.
这里有两个小问题特别说一下, 是我自己刚开始使用 ItemLoader 时犯的错.
第一个就是, 使用 ItemLoader 后不需要调用 extract() 了, item里的值类型为 list.
第二个就是, 当页面中有多个 item, 循环遍历时是使用 selector='你的选择器'. 如果使用 response='你的响应' 的话, 你会发现返回的 item 内容要么出错要么重复.
处理器: 结合数据以及对数据进行格式化和清洗的函数
例:
上图中的 "unicode" 应替换为 "str".
对我来说, 最常用就是 MapCompose 搭配匿名函数, 可以更加灵活的处理数据. MapCompose 和 Python 内置的 map 类似, 根据所给函数来遍历处理可迭代对象中的每个值.
使用方法也挺简单, 只需要在编写填充机制的时候加上处理器即可, 如: loader.add_css('tags', '.tag::text', MapCompose(str.title)).
定义 ItemLoader 的子类:
就我而言, 定义子类最大的意义就是可以对每个已获得的数据使用指定的处理器.
刚刚说过, ItemLoader 会对 xpath 或 css 提取出来的结果做出类似 extract() 的处理, 所以结果都会以列表的形式返回. 有时候列表里就一个以字符串形式表示的值, 我们希望直接得到字符串, 这时可以使用处理器 TakeFirst(), 返回列表第一个非空值, 类似于 extract_first(). 如果所有的结果要做这样的处理, 那在编写填充机制的时候依次添加处理器就显得过于麻烦了. 此时我们就可以定义一个 ItemLoader 的子类.
通过重写 default_input_processor 和 default_input_processor 便可以达到目的.
例:
class NewLoader(ItemLoader):
default_input_processor = TakeFirst()
default_output_processor = str.title()
需要注意的是处理器执行的顺序, 最先执行编写填充机制时加的处理器, 接着是 default_input_processor, 然后是defualt_output_processor.
所有的处理在使用之前都需要导入.
以上便是我目前对 Scrapy 中 CrawlSpider 与 ItemLoader 的了解.
Python爬虫-Scrapy-CrawlSpider与ItemLoader的更多相关文章
- python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)
操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...
- python爬虫Scrapy(一)-我爬了boss数据
一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...
- python爬虫scrapy项目详解(关注、持续更新)
python爬虫scrapy项目(一) 爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&st ...
- [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...
- python爬虫scrapy框架——爬取伯乐在线网站文章
一.前言 1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...
- Python爬虫Scrapy框架入门(0)
想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...
- Python 爬虫-Scrapy爬虫框架
2017-07-29 17:50:29 Scrapy是一个快速功能强大的网络爬虫框架. Scrapy不是一个函数功能库,而是一个爬虫框架.爬虫框架是实现爬虫功能的一个软件结构和功能组件集合.爬虫框架是 ...
- python爬虫scrapy学习之篇二
继上篇<python之urllib2简单解析HTML页面>之后学习使用Python比较有名的爬虫scrapy.网上搜到两篇相应的文档,一篇是较早版本的中文文档Scrapy 0.24 文档, ...
- python爬虫scrapy命令工具学习之篇三
命令行工具(Command line tools) 全局命令 startproject settings runspider shell fetch view version 项目命令 crawl c ...
随机推荐
- 手机测试用例-wap测试用例
Software Test Case P/F comment tester test time P/F comment tester ID 功能描述 操作步骤 预期结果 备注 wap_001 wap ...
- 怎么让普通用户达到root用户也可以拥有权限修改文件(CentOS系统)
为什么会提出这个问题呢? 答:因为啊,比如我们在大数据集群搭建的时候,经常会需要配置环境变量,如/etc/profile.那么,问题来了,每次必须得都切换到root用户才能,但是呢,如何可以在普通用户 ...
- kettle 导入xml 资源文件
Repository | ExploreRight click the root node of the repositorySelect Import objects from an XML fil ...
- Web | 解决中文乱码
设定文件的编码格式在head中添加 <head> <meta http-equiv="Content-Type" content="text/html; ...
- 用JS改变页面中b标签的样式啊 样式的等
用JS改变页面中b标签的样式啊 样式的等 ,实际上是在标签内加上样式 ,用媒体查询的话 ,不能生效 <!DOCTYPE html> <html lang="en&qu ...
- 【SCOI2016】Day1 模拟
2018.8.16 8:00~11:06 先看t1,成功读错题... 以为是一个字符串的所有后缀都得在计划表里,否则权值就得是$n^2$ 然后花了一个小时多一点写了一个错误的做法 然后没有分 才发现看 ...
- 递推DP URAL 1244 Gentlemen
题目传送门 /* 题意:给出少了若干卡片后的总和,和原来所有卡片,问少了哪几张 DP:转化为少了的总和是否能有若干张卡片相加得到,dp[j+a[i]] += dp[j]; 记录一次路径,当第一次更新的 ...
- 基于CentOS 7.2个人网盘的实现
首先使用YUM安装依赖环境: [root@sishen ~]#yum install python python-setuptools python-imaging python-ldap pytho ...
- 06.NopCommerce配置邮箱账户
NopCommerce如果配置让用户注册为通过邮箱注册,并且注册后激活邮箱才可登录,那么我们需要对NopCommerce的邮箱账户进行配置,用来发送邮件用.当然邮件还有很多其他用途,比如发送用户订阅的 ...
- [转]List of Visual Studio Project Type GUIDs
本文转自:http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs There isn' ...