1、下载中间件

下载中间件是scrapy提供用于用于在爬虫过程中可修改Request和Response,用于扩展scrapy的功能

1.1 使用方法:

  • 在middlewares中自定义一个Download Middlewares类,然后在settings中开启Download Middlewares,并将自定义的类添加进去默认方法:

2、处理请求与响应的两个方法

  1. process_request(self,request,spider):
  2. 当每个request通过下载中间件时,该方法被调用
  3. process_response(self,request,response,spider):
  4. 当下载器完成http请求,传递响应给引擎的时候调用

2.1 process_request(request, spider)

当每个Request对象经过下载中间件时会被调用,优先级越高的中间件,越先调用;该方法应该返回以下对象:None/Response对象/Request对象/抛出IgnoreRequest异常;有None,可以没有返回值

  • 返回None:scrapy会继续执行其他中间件相应的方法;
  • 返回Response对象:scrapy不会再调用其他中间件的process_request方法,也不会去发起下载,而是直接返回该Response对象
  • 返回Request对象:scrapy不会再调用其他中间件的process_request()方法,而是将其放置调度器待调度下载
  • 如果这个方法抛出异常,则会调用process_exception方法

2.2 process_response(request, response, spider)

当每个Response经过下载中间件会被调用,优先级越高的中间件,越晚被调用,与process_request()相反;该方法返回以下对象:Response对象/Request对象/抛出IgnoreRequest异常。没有None,必须要有返回值

  • 返回Response对象:scrapy会继续调用其他中间件的process_response方法;
  • 返回Request对象:停止中间器调用,将其放置到调度器待调度下载;
  • 抛出IgnoreRequest异常:Request.errback会被调用来处理函数,如果没有处理,它将会被忽略且不会写进日志。

3、随机请求头中间件

爬虫在频繁访问一个页面的时候,这个请求如果一直保持一致。那么很容易被服务器发现,从而禁止掉这个请求头的访问。因此我们要在访问这个页面之前随机的更改请求头,这样才可以避免爬虫被抓。随机更改请求头,可以在下载中间件实现。在请求发送给服务器之前,随机的选择一个请求头。这样就可以避免总使用一个请求头;

测试请求头网址: http://httpbin.org/user-agent

  1. # 在middlewares.py文件中自定义的两个类
  2. class RandomUserAgent(object):
  3. def process_request(self,request,spider):
  4. useragent = random.choice(spider.settings['USER_AGENTS'])
  5. request.headers['User-Agent'] = useragent
  6. class CheckUserAgent(object):
  7. def process_response(self,request,response,spider):
  8. print(request.headers['User-Agent'])
  9. return response
  1. # settings文件开启下载中间件
  2. DOWNLOADER_MIDDLEWARES = {
  3. 'user_agent.middlewares.UserAgentDownloaderMiddleware': 543,
  4. 'user_agent.middlewares.RandomUserAgent': 544,
  5. }

随机请求头

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

  1. # settings文件中添加
  2. USER_AGENT = [
  3. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
  4. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0",
  5. "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:77.0) Gecko/20100101 Firefox/77.0",
  6. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
  7. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582",
  8. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19577",
  9. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
  10. "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"
  11. ]

4、下载中间件中设置代理ip

  1. class RandomUserAgent(object):
  2. def process_request(self, request, spider):
  3. # 设置代理ip
  4. request.meta['proxy'] = 'http://36.248.132.216:9999'
  5. return None