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 ...
随机推荐
- Mac上搭建直播服务器Nginx+rtmp,实现手机推流、拉流
转载自http://www.cnblogs.com/jys509/p/5649066.html 简介 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网 ...
- OLE/COM Object Viewer
OLE/COM Object Viewer摘AutoIt Help The "OLE/COM Object Viewer" is a very handy tool to get ...
- nginx添加模块
[root@VM_0_3_centos nginx]# ./sbin/nginx -V nginx version: nginx/1.12.2 built by gcc 4.8.5 20150623 ...
- 莫比乌斯函数 && HDU-1695
莫比乌斯函数定义: $$\mu(d)=\begin{cases}1 &\text{d = 1}\\(-1)^r &\text{$d=p_1p_2...p_r,其中p_i为不同的素数$} ...
- vue文件中style标签的几个标识符
.vue文件中style标签的几个标识符 在人生就要绝望的时候, 被编辑器所提示的一个scopedSlots所拯救. 卧槽, 写到最后才发现这个属性的具体卵用. 详情见最后解决办法. 问题背景 问题由 ...
- Java图解
java虚拟机 JVM运行过程: java开发工具包 java入门图解1 java入门图解2 java入门图解3 java入门图解4
- [在读]webkit技术内幕
看了一点点,还不适合目前的我看,搁置.
- AJPFX关于集合的几种变量方式
package com.java.test; import java.util.ArrayList;import java.util.Enumeration;import java.util.Iter ...
- AJPFX浅谈Java性能优化之finalize 函数
★finalize 函数的调用机制 俺经常啰嗦:“了解本质机制的重要性”.所以今天也得先谈谈 finalize 函数的调用机制.在聊之前,先声明一下:Java虚拟机规范,并没有硬性规定垃圾回收该不该搞 ...
- hihocoder1078 线段树的区间修改
思路: 线段树区间更新.注意这里是把一个区间的所有数全部赋值为一个新的值. 实现: #include <bits/stdc++.h> using namespace std; ; ], l ...