崔庆才python3爬虫-13章 Scrapy框架的使用-Spider的用法和Downloader Middleware 的用法
1 | 在 Scrapy中,要抓取网站的链接配置、抓取逻辑、解析逻辑里其实都是在Spider中配置的。在前一节实例中,我们发现抓取逻辑也是在Spider中完成的。本节我们就来专门了解一下Spider的基本用法。 |
Spider的用法
Spider运行流程
1 | 在实现Scrapy爬虫项目时,最核心的类便是Spider类了, 它定义了如何爬取某个网站的流程和解析方式。 简单来讲, Spider要做的事就是如下两件: |
Spider类分析
1 | 在上一节的例子中,我们定义的Spider是继承自 scrapy.spiders.Spider, scrapy.spiders.Spider |
1 | scrapy.spiders.Spider这个类提供了 start_requests()方法的默认实现,读取并请求start_urls属性,并根据返回的结果调用parse()方法解析结果。它还有如下一些基础属性。 |
1 | name: 爬虫名称,是定义Spider名字的字符串。Spider的名字定义了 Scrapy如何定位并初始化Spider,它必须是唯一的。不过我们可以生成多个相同的Spider实例,数量没有限制。 |
1 | 除了基础属性, Spider还有一些常用的方法。 |
1 | 以上内容可能不太好理解。不过不用担心,后面会有很多使用这些属性和方法的实例。通过这些实例,我们慢慢熟练掌握它们。 |
Using errbacks to catch exceptions in request processing
1 | import scrapy |
Accessing additional data in errback functions
1 | def parse(self, response): |
DOWNLOAD_TIMEOUT
1 | Default: 180 |
DUPEFILTER_CLASS
1 | Default: 'scrapy.dupefilters.RFPDupeFilter' |
Settings per-spider
1 | Spiders (See the Spiders chapter for reference) can define their own settings that will take precedence and override the project ones. They can do so by setting their custom_settings attribute: |
Downloader Middleware 的用法
1 | Downloader Middleware即下载中间件,它是处于Scrapy的Request和 Response之间的处理模块。 |
1 | 也就是说,Downloader Middleware在整个架构中起作用的位置是以下两个。 |
使用说明
1 | 需要说明的是, Scrapy其实已经提供了许多Downloader Middleware, 比如负责失败重试、自动重定向等功能的Middleware,它们被DOWNLOADER_MIDDLEWARES_BASE变量所定义。 |
1 | DOWNLOADER_MIDDLEWARE_BASE和DOWNLOADER_MIDDLEWARE列表里的会最终一起排序 |
核心方法
1 | Scrapy内置的Downloader Middleware为Scrapy提供了基础的功能,但在项目实战中我们往往需要单独定义Downloader Middleware |
process_request(request, spider)
1 | Request被 Scrapy引擎调度给Downloader之前,process_request()方法就会被调用,也就是在Request从队列里调度出来到Downloader下载执行之前 ,我们都可以用 process_request()方法对Request进行处理。方法的返回值必须为None,Response对象,Request对象之一,或者抛出IgnoreRequest |
process_response(request, response, spider)
1 | Downloader执行Request下载之后,会得到对应的Response。Scrapy引擎便会将Response发送给Spider进行解析。在发送之前,我们都可以用process_response()方法来对Response进行处理。方法的返回值必须为Request对象、Response对象之一,或者抛出IgnoreRequest异常。 |
process_exception(request, exception, spider)
1 | 当Downloader或process_request()方法抛出异常时,例如抛出 IgnoreRequest异常,process_exception()方法就会被调用。方法的返回值必须为None、Response对象、Request对象之一。 |
项目实战
1 | 新建一个项目,命令如下所示: |
1 | 接下来我们修改 start_urls为 :[http://httpbin.org/get] |
(使用process_request)设置USER_AGENT
1 | 接下来运行此Spider,执行如下命令: |
1 | 我们观察一下Headers, Scrapy发送的Request使用的User-Agent是(Scrapy/lda+httpW/scrapy.org), |
1 | 在from_crawler()方法中,首先尝试获取settings里面USER_AGENT,然后把USER_AGENT传递给_init_()方法进行初始化,其参数就是user_agent。如果没有传递USER_AGENT参数就默认设置为Scrapy字符串。我们新建的项目没有设置USER_AGENT,所 这里的user_agent变量就是Scrapy接下来,在 process_request()方法中,将user-agent变量设置为headers变量的一个属性,这样就成功设置了User-Agent 因此,User-Agent 就是通过此 Downloader Middleware 的 process_request()方法设置的。 |
1 | 第一种方法非常简单,我们只需要在setting.py里面加一行USER_AGENT的定义即可: |
1 | 在 middlewares.py 里面添加一个RandomUserAgentMiddleware 的类,如下所示: |
1 | 不过,要使之生效我们还需要再去调用这个Downloader Middleware 在 settings.py中,将DOWNLOADER_MIDDLEWARES取消注释,并设置成如下内容: |
1 | 接下来我们重新运行Spider,就可以看到User-Agent被成功修改为列表中所定义的随机的一个User-Agent了 : |
使用process_response()
1 | 另外,Downloader Middleware还有process_response()方法。 Downloader对Request执行下载之后会得到Response,随后Scrapy引擎会将Response发送回Spider进行处理。但是在Response被发送给Spider之前,我们同样可以使用process_response()方法对Response进行处理。 |
process_exception
1 | 因此要想对Response进行后处理,就可以借助于process_response()方法。 |
1 | 本节讲解了Downloader Middleware的基本用法。此组件非常重要,是做异常处理和反爬处理的核心。后面我们会在实战中应用此组件来处理代理、 Cookies等内容。 |
没有伞的孩子,必须努力奔跑!
Typewriter Mode** 已开启。
可以在视图菜单中关闭
不再显示关闭