多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
爬虫在频繁访问一个页面的时候,如果请求头一直保持一致,那么很容易被服务器发现,从而禁止这个请求头的访问。下面通过自定义中间件来实现随机的选择一个请求头。 <br/> 步骤如下: <br/> **1. 在`settings.py`做如下配置** (1)你可以在 http://www.useragentstring.com/pages/useragentstring.php?typ=Browser 找到大量的User-Agent; (2)你可以访问 http://httpbin.org/user-agent 直接测试你使用的浏览器的User-Agent。 ```python # User-Agent池 USER_AGENTS = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 Camino/1.5.1" ] # 启动自定义中间件 DOWNLOADER_MIDDLEWARES = { # 自定义中间件: 权重,权重越小,优先被调用 # CareerstencentDownloaderMiddleware在项目创建的时候就自动创建好了 'CareersTencent.middlewares.CareerstencentDownloaderMiddleware': 543, 'CareersTencent.middlewares.RandomUserAgentMiddleware': 544, } ``` <br/> **2. 在`middlewares.py`中自定义一个中间类** ```python class RandomUserAgentMiddleware(object): def process_request(self, request, spider): """ 定义process_request方法,方法名不能自定义哦. 当每个Request对象经过中间件时会被调用,优先级越高的中间件,越先调用; 该方法应该返回以下对象: None、Response、Request、抛出IgnoreRequest异常 :return: (1)返回None: scrapy会继续执行其他中间件相应的方法; (2)返回Response对象: scrapy不会再调用其他中间件的process_request 方法,也不会去发起下载,而是直接返回该Response对象 (3)返回Request对象: scrapy不会再调用其他中间件的process_request() 方法,而是将其放置调度器待调度下载 (4)如果这个方法抛出异常,则会调用process_exception方法 """ # 随机请求头 user_agent = random.choice(spider.settings['USER_AGENTS']) request.headers['User-Agent'] = user_agent return None def process_response(self, request, response, spider): """ 当每个Response经过中间件会被调用,优先级越高的中间件,越晚被调用, 与process_ request()相反; 该方法返回以下对象: Response、Request、抛出IgnoreRequest异常。 :return: (1)返回Response对象: scrapy会继续调用其他中间件的process_response方法; (2)返回Request对象:停止中间器调用,将其放置到调度器待调度下载; (3)抛出IgnoreRequest异常: Request.errback会被调用来处理函数,如果没有处理,它将会被忽略且不会写进日志。 """ # 经测试,请求头是随机的 print(request.headers['User-Agent']) return response ```