【Scrapy框架设置UA池与代理池】 -- 2019-08-09 11:05:53

原文: http://106.13.73.98/__/142/

先来张Scrapy框架图压压惊


在这里插入图片描述

下载中间件(Downloader Middlewares)是位于Scrapy引擎和下载器之间的一层组件。

它的作用是:

  1. 在引擎将请求传递给下载器的过程中,下载中间件可以对请求进行一系列的处理。比如设置User-Agent设置代理IP等。
  2. 在下载器将Response传递给引擎的过程中,下载中间件可以对响应进行一系列的处理。比如进行gzip解压等。

下面将使用下载中间件来实现UA池与代理池


我们一般使用下载中间件处理请求,一般会对请求设置随机的User-Agent、代理IP。目的在于防止被爬取网站的反爬虫策略。

基本步骤如下:

  1. 在中间件中拦截请求.
  2. 对拦截到的请求进行篡改User-Agent设置代理IP.
  3. 在配置文件中启用下载中间件DOWNLOADER_MIDDLEWARES.

中间件文件middlewares.py代码如下:

import random
from fake_useragent import UserAgent  # UA库,我们这里就使用它来做UA池


# 这个便是下载中间价
class BlogDownloaderMiddleware(object):

    # 我们先定义好代理池
    http = ['http://218.60.8.83:3129', 'http://59.44.247.194:9797']
    https = ['https://85.62.30.211:8080', 'https://101.248.64.68:8080']
    # http://www.goubanjia.com 提供很好的代理ip

    def process_request(self, request, spider):
        """
        这是下载中间件中 拦截请求 的方法
        :param request: 拦截到的请求
       """
       # print(request)  # <GET https://www.baidu.com/s?wd=ip>

       ua = UserAgent(use_cache_server=False).random  # 生成随机UA
       request.headers['User-Agent'] = ua  # 将生成的UA写入请求头中

       # 判断请求是超文本传输协议,还是安全套接字超文本传输协议,并对其使用对应的代理池
       request.meta['proxy'] = random.choice(getattr(self, request.url.split(':')[0]))

       return None


    def process_response(self, request, response, spider):
       """这是下载中间件中 拦截响应 的方法"""
       print(response)  # <200 https://www.baidu.com/s?wd=ip>
       return response

最后在配置文件settings.py中启用下载中间件:

# 开启下载中间件
DOWNLOADER_MIDDLEWARES = {
   'blog.middlewares.BlogDownloaderMiddleware': 543,
}

原文: http://106.13.73.98/__/142/

猜你喜欢

转载自www.cnblogs.com/gqy02/p/11325921.html