Scrapy框架随机请求头

Downloader Middlewares (下载器中间件)

Scarpy 的新版本能自动生成 下载器中间件,一般不用自己去重写

下载器中间件是引擎和下载器之间通信的中间件。在这个中间件中我们可以设置代理、更换请求头等来达到反反爬虫的目的。要写下载器中间件,可以在下载器中实现两个方法..

  • process_request(self, request, spider):这个方法是在请求发送之前会执行
  • process_ response(self , request, response, spider),这个方法是数据下载到引擎之前执行

process_request(self, request, spider)

这个方法是在请求发送之前会执行

参数:
  • request:发送请求的request对象。
  • spider:发送请求的spider对象
返回值:

已经激活中间件, process_ response()方法 则会在每个response返回时被调用。

  • 返回None:Scrapy将继续处理该请求,执行其他中间件中的相应方法,直到合适的下载器处理函数被调用。
  • 返回Response对象: Scrapy将不会调用任何其他的process. request方法,将直接返回这个response对象
  • 返回Request对象:不再使用之前的request对象去下载数据,而是根据现在返回的request对象返回数据。如果这个方法中抛出了异常,则会调用process.exception方法

process_response(self, request, response, spider)

这个方法是在收到相应时执行

参数:
  • request: request对象。
  • response:待处理的response对象。
  • spider: splder对象。
返回值:
  • 返回Response对象:会将这个新的Response对象传给其他中间件处理。
  • 返回Request对象:下载器链被切断,返回的Request会重新被下载器调度请求。
  • 如果抛出一个异常,那么调用request的errback 方法,如果没有指定这个方法,那么会抛出一个异常。

随机请求头

请求头网站:
http://www.useragentstring.com/pages/useragentstring.php?typ=Browser

开启下载中间件

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
   'headersApp.middlewares.HeadersappDownloaderMiddleware': 543,
}

设置随机请求头

在 middlewares.py 里编辑 DownloaderMiddleware() 类

class HeadersappDownloaderMiddleware(object):

    HEADERS = [
        'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.21pre) Gecko K-Meleon/1.7.0',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows XP 5.1) Lobo/0.98.4',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.28) Gecko/20120410 Firefox/3.6.28 '
    ]
    def process_request(self, request, spider):

        import random
        request.headers['User-Agent'] = random.choice(self.HEADERS)
        return None

关于换IP看这里

发表评论 / Comment

用心评论~