ua池和代理池
程序员文章站
2022-10-19 18:28:45
下载中间件 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件。 作用: (1)引擎将请求传递给下载器过程中, 下载中间件可以对请求进行一系列处理。比如设置请求的 User-Agent,设置代理等 (2)在下载器完成将Response传递给引擎中, ......
下载中间件
下载中间件(downloader middlewares) 位于scrapy引擎和下载器之间的一层组件。
作用:
(1)引擎将请求传递给下载器过程中, 下载中间件可以对请求进行一系列处理。比如设置请求的 user-agent,设置代理等
(2)在下载器完成将response传递给引擎中,下载中间件可以对响应进行一系列处理。比如进行gzip解压等。
我们主要使用下载中间件处理请求,一般会对请求设置随机的user-agent ,设置随机的代理。目的在于防止爬取网站的反爬虫策略。
ua池:user-agent池
作用:尽可能多的将scrapy工程中的请求伪装成不同类型的浏览器身份。
操作流程:
1.在下载中间件中拦截请求
2.将拦截到的请求的请求头信息中的ua进行篡改伪装
3.在配置文件中开启下载中间件
代码展示:
#导包 from scrapy.contrib.downloadermiddleware.useragent import useragentmiddleware import random #ua池代码的编写(单独给ua池封装一个下载中间件的一个类) class randomuseragent(useragentmiddleware): def process_request(self, request, spider): #从列表中随机抽选出一个ua值 ua = random.choice(user_agent_list) #ua值进行当前拦截到请求的ua的写入操作 request.headers.setdefault('user-agent',ua) user_agent_list = [ "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.1 " "(khtml, like gecko) chrome/22.0.1207.1 safari/537.1", "mozilla/5.0 (x11; cros i686 2268.111.0) applewebkit/536.11 " "(khtml, like gecko) chrome/20.0.1132.57 safari/536.11", "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.6 " "(khtml, like gecko) chrome/20.0.1092.0 safari/536.6", "mozilla/5.0 (windows nt 6.2) applewebkit/536.6 " "(khtml, like gecko) chrome/20.0.1090.0 safari/536.6", "mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.1 " "(khtml, like gecko) chrome/19.77.34.5 safari/537.1", "mozilla/5.0 (x11; linux x86_64) applewebkit/536.5 " "(khtml, like gecko) chrome/19.0.1084.9 safari/536.5", "mozilla/5.0 (windows nt 6.0) applewebkit/536.5 " "(khtml, like gecko) chrome/19.0.1084.36 safari/536.5", "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1063.0 safari/536.3", "mozilla/5.0 (windows nt 5.1) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1063.0 safari/536.3", "mozilla/5.0 (macintosh; intel mac os x 10_8_0) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1063.0 safari/536.3", "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1062.0 safari/536.3", "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1062.0 safari/536.3", "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1061.1 safari/536.3", "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1061.1 safari/536.3", "mozilla/5.0 (windows nt 6.1) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1061.1 safari/536.3", "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 " "(khtml, like gecko) chrome/19.0.1061.0 safari/536.3", "mozilla/5.0 (x11; linux x86_64) applewebkit/535.24 " "(khtml, like gecko) chrome/19.0.1055.1 safari/535.24", "mozilla/5.0 (windows nt 6.2; wow64) applewebkit/535.24 " "(khtml, like gecko) chrome/19.0.1055.1 safari/535.24" ]
代理池
作用:尽可能多的将scrapy工程中的请求的ip设置成不同的。
操作流程:
1.在下载中间件中拦截请求
2.将拦截到的请求的ip修改成某一代理ip
3.在配置文件中开启下载中间件
代码展示:
#批量对拦截到的请求进行ip更换 #单独封装下载中间件类 class proxy(object): def process_request(self, request, spider): #对拦截到请求的url进行判断(协议头到底是http还是https) #request.url返回值:http://www.xxx.com h = request.url.split(':')[0] #请求的协议头 if h == 'https': ip = random.choice(proxy_https) request.meta['proxy'] = 'https://'+ip else: ip = random.choice(proxy_http) request.meta['proxy'] = 'http://' + ip #可被选用的代理ip proxy_http = [ '153.180.102.104:80', '195.208.131.189:56055', ] proxy_https = [ '120.83.49.90:9000', '95.189.112.214:35508', ]