1、下载中间件
下载中间件是scrapy提供用于用于在爬虫过程中可修改Request和Response,用于扩展scrapy的功能
1.1 使用方法:
- 在middlewares中自定义一个Download Middlewares类,然后在settings中开启Download Middlewares,并将自定义的类添加进去默认方法:
2、处理请求与响应的两个方法
process_request(self,request,spider):
当每个request通过下载中间件时,该方法被调用
process_response(self,request,response,spider):
当下载器完成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
# 在middlewares.py文件中自定义的两个类
class RandomUserAgent(object):
def process_request(self,request,spider):
useragent = random.choice(spider.settings['USER_AGENTS'])
request.headers['User-Agent'] = useragent
class CheckUserAgent(object):
def process_response(self,request,response,spider):
print(request.headers['User-Agent'])
return response
# settings文件开启下载中间件
DOWNLOADER_MIDDLEWARES = {
'user_agent.middlewares.UserAgentDownloaderMiddleware': 543,
'user_agent.middlewares.RandomUserAgent': 544,
}
随机请求头
请求头大全网址:http://www.useragentstring.com/pages/useragentstring.php?typ=Browser
# settings文件中添加
USER_AGENT = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:77.0) Gecko/20100101 Firefox/77.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"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",
"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",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
"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"
]
4、下载中间件中设置代理ip
class RandomUserAgent(object):
def process_request(self, request, spider):
# 设置代理ip
request.meta['proxy'] = 'http://36.248.132.216:9999'
return None