Python爬虫从入门到成妖之7-----Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子。
Downloader Middleware处理的过程主要在调度器发送 requests请求的时候以及网页将 response结果返回给 spiders的时候,所以从这里我们可以知道下载中间件是介于 Scrapy的 request/response处理的钩子,用于修改 Scrapy request和 response。

编写自己的下载器中间件

编写下载器中间件,需要定义以下一个或者多个方法的python类

为了演示这里的中间件的使用方法,这里创建一个项目作为学习,这里的项目是关于爬去 httpbin.org这个网站
scrapy startproject httpbintest 
cd httpbintest
scrapy genspider example example.com

创建好后的目录结构如下:

这里我们先写一个简单的代理中间件来实现ip的伪装
创建好爬虫之后我们讲httpbin.py中的parse方法改成:

def parse(self, response):
        print(response.text)

然后通过命令行启动爬虫:scrapy crawl httpbin

在最下面我们可以看到"origin": "114.250.88.66"
我们在查看自己的ip:

而我们要做就是通过代理中间件来实现ip的伪装,在middleares.py中写如下的中间件类:

class ProxyMiddleare(object):
    logger = logging.getLogger(__name__)
    def process_request(self,request, spider):
        self.logger.debug("Using Proxy")
        request.meta[‘proxy‘] = ‘http://127.0.0.1:9743‘
        return None

这里因为我本地有一个代理FQ地址为:http://127.0.0.1:9743

所以直接设置为代理用,代理的地址为日本的ip
然后在settings.py配置文件中开启下载中间件的功能,默认是关闭的

然后我们再次启动爬虫:scrapy crawl httpbin
从下图的输入日志中我们可以看书我们定义的中间件已经启动,并且输入了我们打印的日志信息,并且我们查看origin的ip地址也已经成了日本的ip地址,这样我们的代理中间件成功了

详细说明

class Scrapy.downloadermiddleares.DownloaderMiddleware

process_request(request,spider)

当每个request通过下载中间件时,该方法被调用,这里有一个要求,该方法必须返回以下三种中的任意一种:None,返回一个Response对象,返回一个Request对象或raise IgnoreRequest。三种返回值的作用是不同的。

None:Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用,该request被执行(其response被下载)。

Response对象:Scrapy将不会调用任何其他的process_request()或process_exception() 方法,或相应地下载函数;其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。

Request对象:Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。

raise一个IgnoreRequest异常:则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录。

process_response(request, response, spider)

process_response的返回值也是有三种:response对象,request对象,或者raise一个IgnoreRequest异常

如果其返回一个Response(可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。

如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。

如果其抛出一个 IgnoreRequest 异常,则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。

这里我们写一个简单的例子还是上面的项目,我们在中间件中继续添加如下代码:

然后在spider中打印状态码:

这样当我们重新运行爬虫的时候就可以看到如下内容

process_exception(request, exception, spider)

当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时,Scrapy调用 process_exception()。

process_exception() 也是返回三者中的一个: 返回 None 、 一个 Response 对象、或者一个 Request 对象。

如果其返回 None ,Scrapy将会继续处理该异常,接着调用已安装的其他中间件的 process_exception() 方法,直到所有中间件都被调用完毕,则调用默认的异常处理。

如果其返回一个 Response 对象,则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。

如果其返回一个 Request 对象, 则返回的request将会被重新调用下载。这将停止中间件的 process_exception() 方法执行,就如返回一个response的那样。 这个是非常有用的,就相当于如果我们失败了可以在这里进行一次失败的重试,例如当我们访问一个网站出现因为频繁爬取被封ip就可以在这里设置增加代理继续访问,我们通过下面一个例子演示

scrapy genspider google www.google.com 这里我们创建一个谷歌的爬虫,

然后启动scrapy crawl google,可以看到如下情况:

这里我们就写一个中间件,当访问失败的时候增加代理
首先我们把google.py代码进行更改,这样是白超时时间设置为10秒要不然等待太久,这个就是我们将spider里的时候的讲过的make_requests_from_url,这里我们把这个方法重写,并将等待超时时间设置为10s

这样我重新启动爬虫:scrapy crawl google,可以看到如下:

这里如果我们不想让重试,可以把重试中间件关掉:

这样设置之后我们就把失败重试的中间件给关闭了,设置为None就表示关闭这个中间件,重新启动爬虫我们也可以看出没有进行重试直接报错了

我们将代理中间件的代理改成如下,表示遇到异常的时候给请求加上代理,并返回request,这个样就会重新请求谷歌

重新启动谷歌爬虫,我们可以看到,我们第一次返回我们打印的日志信息GET Exception,然后加上代理后成功访问了谷歌,这里我的代理是日本的代理节点,所以访问到的是日本的谷歌站

原文地址:https://www.cnblogs.com/edeny/p/9856270.html

时间: 2024-10-10 10:17:41

Python爬虫从入门到成妖之7-----Scrapy框架中Download Middleware用法的相关文章

Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以从这里我们可以知道下载中间件是介于Scrapy的request/response处理的钩子,用于修改Scrapy request和response. 编写自己的下载器中间件 编写下载器中间件,需要定义以下一个或者多个方法的python类 为了演示这里的中间件的使用方法,这里创建一个项目作为学习,这里

Python爬虫从入门到放弃 之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以从这里我们可以知道下载中间件是介于Scrapy的request/response处理的钩子,用于修改Scrapy request和response. 编写自己的下载器中间件 编写下载器中间件,需要定义以下一个或者多个方法的python类 为了演示这里的中间件的使用方法,这里创建一个项目作为学习,这里

Python爬虫从入门到成妖之3-----Scrapy框架的命令行详解

创建爬虫项目 scrapy startproject 项目名 例子如下: E:\crawler>scrapy startproject test1 New Scrapy project 'test1', using template directory 'd:\\python36\\lib\\site-packages\\scrapy\\templates\\project', created in: E:\crawler\test1 You can start your first spide

Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法

原文地址https://www.cnblogs.com/zhaof/p/7196197.html 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或者被丢弃而不再进行处理 item pipeline的主要作用: 清理html数据 验证爬取的数据 去重并丢弃 讲爬取的结果保存到数据库中或文件中 编写

Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法

Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTML上.CSS是一门将HTML文档样式化语言,选择器由它定义,并与特定的HTML元素的样式相关联. XPath选择器 常用的路径表达式,这里列举了一些常用的,XPath的功能非常强大,内含超过100个的内建函数.下面为常用的方法 nodeName 选取此节点的所有节点 / 从根节点选取 // 从匹配选

python爬虫小小白入门

python爬虫小小白入门 学习目标: 爬虫基本思想 python爬虫常用包,官方文档,用途,安装方法,常用方法. 简单爬虫实例--从W3Cschool爬取C语言教程文本 python环境:: Anaconda3, spyder, windows10 一.基本思想 爬虫就是从网页上抓取你想要的内容,主要分为三个步骤.首先需要仔细分析目标页面内容,知道你想要的内容:文字,图片,视频在HTML中的哪个标签里,然后通过爬虫代码向服务器发起请求,得到HTML页面内容,最后把目标内容解析出来. 分析目标页

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

18、python网路爬虫之Scrapy框架中的CrawlSpider详解

CrawlSpider的引入: 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效) CrawlSpider的简介: CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著的功能就是"

Python爬虫怎么入门-让入门更快速,更专注

经常有同学私信问,Python爬虫该怎么入门,不知道从何学起,网上的文章写了一大堆要掌握的知识,让人更加迷惑. 我也浏览了下网上关于怎么Python爬虫入门的文章,发现有的还在教人用urllib来发送http请求,这真是有点误人子弟了.本文也不提倡刚开始去学习第三方爬虫框架,我想把要学习的知识简化一些,让入门更快速,更专注. Python爬虫入门:技能 真要说Python爬虫需要具备什么知识,那就是你得会Python,哈哈. 其他的知识就是你能熟练运用Python的几个第三方库,当然你具备一点h