Scrapy框架深入

Selector选择器

对用爬取信息的解析,我们在之前已经知道了正则re、Xpath、Beautiful Soup和PyQuery。而Scrapy还给我们提供自己的数据解析方法,即Selector(选择器)。Selector(选择器)是基于lxml来构建的,支持XPath、CSS选择器以及正则表达式,功能全面,解析速度和准确度非常高。
Selector(选择器)模块的使用有两种方式。
直接使用:
Selector(选择器)是一个可以独立使用模块。 直接导入模块,就可以实例化使用。比如:
from scrapy import Selector
content=“My html

Hello Word!


selector = Selector(text=content)
print(selector.xpath(’/html/head/title/text()’))

Scrapy shell:
我们借助于Scrapy shell来模拟请求的过程,然后把一些可操作的变量传递给我们,如request、response等。
Xpath选择器:
response.selector属性返回内容相当于response的body构造了一个Selector对象。
Selector对象可以调用xpath()方法实现信息的解析提取。
在xpath()后使用getall()或extract()可以返回所有的元素结果。
若xpath()有问题,那么getall()会返回一个空列表。
在xpath()后使用get()或extract_first()可以返回第一个元素结果。
CSS选择器:
基本与上面的xpath类似
css中获取属性:a.css("::attr(href)").extract_first()
css中获取内容:a.css("::text").extract_first()
3.5 正则匹配:
比如: response.selector.re("<a .?>(.?)")

Spiders的使用

在Scrapy中,要抓取网站的链接配置、抓取逻辑、解析逻辑里其实都是在Spider中配置的。Spider要做的事就是有两件: 定义抓取网站的动作 和 解析爬取下来的网页 。
Spider运行流程:
整个抓取循环过程如下所述:
以初始的URL初始化Request,并设置回调函数。请求成功时Response生成并作为参数传给该回调函数。
在回调函数内分析返回的网页内容。返回结果两种形式,一种为字典或Item数据对象;另一种是解析到下一个链接。
如果返回的是字典或Item对象,我们可以将结果存入文件,也可以使用Pipeline处理并保存。
如果返回Request,Response会被传递给Request中定义的回调函数参数,即再次使用选择器来分析生成数据Item。
Spider类分析:

Spider 类继承自 scrapy.spiders.Spider .
Spider 类这个提供了 start_requests() 方法的默认实现,读取并请求 start_urls 属性,并调用 parse()
方法解析结果。
Spider 类的属性和方法:
name :爬虫名称,必须唯一的,可以生成多个相同的Spider实例,数量没有限制。
allowed_domains : 允许爬取的域名,是可选配置,不在此范围的链接不会被跟进爬取。
start_urls : 它是起始URL列表,当我们没有实现start_requests()方法时,默认会从这个列表开始抓取。
custom_settings : 它是一个字典,专属于Spider的配置,此设置会覆盖项目全局的设置,必须定义成类变量。
crawler :它是由from_crawler()方法设置的,Crawler对象包含了很多项目组件,可以获取settings等配置信息。
settings : 利用它我们可以直接获取项目的全局设置变量。
start_requests() : 使用start_urls里面的URL来构造Request,而且Request是GET请求方法。
parse() : 当Response没有指定回调函数时,该方法会默认被调用。
closed() : 当Spider关闭时,该方法会调用。

Downloader Middleware的使用
在Downloader Middleware的功能十分强大:可以修改User-Agent、处理重定向、设置代理、失败重试、设置Cookies等。
Downloader Middleware在整个架构中起作用的位置是以下两个。
在Scheduler调度出队列的Request发送给Doanloader下载之前,也就是我们可以在Request执行下载前对其进行修改。
在下载后生成的Response发送给Spider之前,也就是我们可以生成Resposne被Spider解析之前对其进行修改。
自定义Downloader Middleware中间件:

我们可以通过项目的DOWNLOADER_MIDDLEWARES变量设置来添加自己定义的Downloader Middleware。
其中Downloader Middleware有三个核心方法:
process_request(request,spider)
process_response(request,response,spider)
process_exception(request,exception,spider)
当每个request通过下载中间件时,该方法被调用,这里有一个要求,该方法必须返回以下三种中的任意一种: None ,返回一个 Response对象 、 返回一个Request对象 或 raise IgnoreRequest 。三种返回值的作用是不同的。
None :Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(downloadhandler)被调用,该request被执行(其response被下载)。
Response对象 :Scrapy将不会调用任何其他的process_request()或process_exception() 方法,或相应地下载函数;其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。
Request对象 :Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。
raise一个IgnoreRequest异常 :则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则requesterrback(Request.errback)方法会被调用。如果没有代码处理抛出的异常,则该异常被忽略且不记录。
SpiderMiddleware中间件
Spider中间件是介入到Scrapy的spider处理机制的钩子框架,可以添加代码来处理发送给 Spiders 的response及spider产生的item和request。
激活spider中间件:
要启用spider中间件,您可以将其加入到 SPIDER_MIDDLEWARES 设置中。 该设置是一个字典,键位中间件的路径,值为中间件的顺序(order)。
样例:
SPIDER_MIDDLEWARES = {
‘myproject.middlewares.CustomSpiderMiddleware’: 543,}

SPIDER_MIDDLEWARES 设置会与Scrapy定义SPIDER_MIDDLEWARES_BASE 设置合并(但不是覆盖), 而后根据(order)进行排序,最后得到启用中间件的有序列表: 第一个中间件是最靠近引擎的,最后一个中间件是最靠近spider的。
关于如何分配中间件的顺序请查看 SPIDER_MIDDLEWARES_BASE 设置,而后根据您想要放置中间件的位置选择一个值。 由于每个中间件执行不同的动作,您的中间件可能会依赖于之前(或者之后)执行的中间件,因此顺序是很重要的。
如果您想禁止内置的(在 SPIDER_MIDDLEWARES_BASE 中设置并默认启用的)中间件, 您必须在项目的SPIDER_MIDDLEWARES 设置中定义该中间件,并将其值赋为 None 。 例如,如果您想要关闭off-site中间件:最后,请注意,有些中间件需要通过特定的设置来启用。更多内容请查看相关中间件文档。
6.2 编写自己的spider中间件
编写spider中间件十分简单。每个中间件组件是一个定义了以下一个或多个方法的Python类:
来自类:class scrapy.contrib.spidermiddleware.SpiderMiddleware

process_spider_input(response, spider)

当response通过spider中间件时,该方法被调用,处理该response。
process_spider_input() 应该返回 None 或者抛出一个异常。
如果其返回 None ,Scrapy将会继续处理该response,调用所有其他的中间件直到spider处理该response。
如果其跑出一个异常(exception),Scrapy将不会调用任何其他中间件的 process_spider_input() 方法,并调用request的errback。 errback的输出将会以另一个方向被重新输入到中间件链中,使用 process_spider_output()方法来处理,当其抛出异常时则带调用 process_spider_exception() 。
参数:
response (Response 对象) – 被处理的response
spider (Spider 对象) – 该response对应的spider
Scrapy框架的配置Settings
Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。
参考文档:http://scrapychs.readthedocs.io/zh_CN/1.0/topics/settings.html#topics-settings-ref
Scrapy爬虫扩展中的日志处理
如何使scrapy爬取信息不打印在命令窗口中:
运行命令
scrpay crawl spider_name -s LOG_FILE=all.log
Scrapy中的日志处理
Scrapy提供了log功能,可以通过 logging 模块使用
可以修改配置文件settings.py,任意位置添加下面两行代码
LOG_FILE = “mySpider.log”
LOG_LEVEL = “INFO”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值