其他分享
首页 > 其他分享> > 32、Scrapy框架_DownloadMiddleware

32、Scrapy框架_DownloadMiddleware

作者:互联网

1. Spider 下载中间件(Middleware)

Spider 中间件(Middleware) 下载器中间件是介入到 Scrapy 的 spider 处理机制的钩子框架,您可以添加代码来处理发送给 Spiders 的 response 及 spider 产生的 item 和 request

2. 激活一个下载DOWNLOADER_MIDDLEWARES

要激活一个下载器中间件组件,将其添加到 DOWNLOADER_MIDDLEWARES设置中,该设置是一个字典,其键是中间件类路径,它们的值是中间件命令

DOWNLOADER_MIDDLEWARES  =  { 
    'myproject.middlewares.CustomDownloaderMiddleware' : 543 ,
}

DOWNLOADER_MIDDLEWARES设置与DOWNLOADER_MIDDLEWARES_BASEScrapy中定义的设置(并不意味着被覆盖)合并, 然后按顺序排序,以获得最终的已启用中间件的排序列表:第一个中间件是靠近引擎的第一个中间件,最后一个是靠近引擎的中间件到下载器。换句话说,process_request() 每个中间件的方法将以增加中间件的顺序(100,200,300,...)process_response()被调用,并且每个中间件的方法将以降序调用

要决定分配给中间件的顺序,请参阅 DOWNLOADER_MIDDLEWARES_BASE设置并根据要插入中间件的位置选择一个值。顺序很重要,因为每个中间件都执行不同的操作,而您的中间件可能依赖于之前(或后续)正在使用的中间件

如果要禁用内置中间件(DOWNLOADER_MIDDLEWARES_BASE默认情况下已定义和启用的中间件 ),则必须在项目DOWNLOADER_MIDDLEWARES设置中定义它,并将“ 无” 作为其值。例如,如果您要禁用用户代理中间件

DOWNLOADER_MIDDLEWARES  =  { 
    'myproject.middlewares.CustomDownloaderMiddleware' : 543 ,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware' : None ,
}

最后,请记住,某些中间件可能需要通过特定设置启用

3. 编写你自己的下载中间件

每个中间件组件都是一个Python类,它定义了一个或多个以下方法

class scrapy.downloadermiddlewares.DownloaderMiddleware

任何下载器中间件方法也可能返回一个延迟

3.1 process_request(self, request, spider)

当每个request通过下载中间件时,该方法被调用

process_request()必须返回其中之一

参数:

3.2 process_response(self, request, response, spider)

当下载器完成http请求,传递响应给引擎的时候调用

4 使用代理

settings.py

PROXIES=[
    {"ip":"122.236.158.78:8118"},
    {"ip":"112.245.78.90:8118"}
]
DOWNLOADER_MIDDLEWARES = {
    #'xiaoshuo.middlewares.XiaoshuoDownloaderMiddleware': 543,
    'xiaoshuo.proxyMidde.ProxyMidde':100
}

创建一个midderwares

from xiaoshuo.settings import PROXIES
import random
class ProxyMidde(object):
    def process_request(self, request, spider):
            proxy = random.choice(PROXIES)
            request.meta['proxy']='http://'+proxy['ip']

写一个spider测试

from scrapy import Spider


class ProxyIp(Spider):
    name = 'ip'
    #http://www.882667.com/
    start_urls = ['http://ip.cn']

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

5 使用动态UA

# 随机的User-Agent
class RandomUserAgent(object):
    def process_request(self, request, spider):
        useragent = random.choice(USER_AGENTS)

        request.headers.setdefault("User-Agent", useragent)

标签:DownloadMiddleware,中间件,process,32,request,spider,Scrapy,MIDDLEWARES,response
来源: https://www.cnblogs.com/wangyanfu/p/15940310.html