Scrapy中使用下载中间件,需要编写一个Downloader Middlewares和我们编写一个pipeline一样,定义一个类,然后在settings中开启。默认情况在middlewares.py文件中是存在下载中间件和爬虫中间件的,这里我们不用可以删掉,这篇文章主要介绍下载中间件的使用。
我们可以精简一下middlewares.py文件中代码,修改后如下:
class Myspider1DownloaderMiddleware:
def process_request(self, request, spider):
return None
def process_response(self, request, response, spider):
return response
def process_exception(self, request, exception, spider):
pass
这里对于数据的抓取不多介绍,只介绍下载中间件的使用。
from scrapy import signals
class Myspider1DownloaderMiddleware:
# 拦截所有请求
# 参数request就是拦截到的请求
# 参数spider:表示爬虫文件中爬虫类实例化好的对象
# ---spider作用可以实现中间件和爬虫类之间的数据交换
def process_request(self, request, spider):
# request.headers 返回的是一个字典,表示的就是拦截到请求的请求头信息
# request.headers['User-Agent']='xxxx'
print(request.headers)
print('I am process_request()!')
return None
# 拦截所有响应
def process_response(self, request, response, spider):
print('I am process_response()!')
return response
# 拦截所有异常的请求对象
def process_exception(self, request, exception, spider):
print('I am process_exception()!')
# 拦截到异常的请求,需要对异常的请求进行修正,需要将修正后的请求进行重新发送
# 一般来说,代理操作可以写在这里
request.meta['proxy']='http://ip:port' # 使用代理实现修正操作
return request # 将修正后的请求重新发送
使用总结- process_request():每次发起请求,请求就会被该方法拦截到
- process_reqponse():只要返回一个响应,就会被该方法拦截到
- process_exception():只要有异常的请求,就会被该方法拦截到。该方法负责对异常的请求进行修正,且使用return request将修正后的对象进行重新发送。
class RandomUserAgent(object):
def process_request(self,request,spider):
useragent=random.choice(USER-AGENT)
request.headers["User-Agent"]=user_agent
添加自定义的UserAgent,给request的headers赋值class PorxyMiddlewares(object):
def process_request(self,request,spider):
request.meta["proxy"]="http://1.1.1.1:888"
添加代理,需要在request的meta信息中添加proxy字段。代理的形式:协议+ip地址+端口
下载器中间件存在middlewares文件中,它按照优先级被调用。当request从引擎向下载器传递时,数字小的下载器中间件先执行,数字大的后执行;当下载器将response向引擎传递时,数字大的下载器中间件先执行,数字小的后执行。scrapy提供了一套基本的下载器中间件:
{
# Engine side
'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100, #爬虫协议
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300, #http认证
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350, #下载超时中间件
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400, #默认的headers
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500, #user-agent中间件
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550, #调试
'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560, #ajax抓取
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580, #网页数据刷新
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590, #http压缩
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600, #重定向
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700, #cookies
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,# 代理
'scrapy.downloadermiddlewares.stats.DownloaderStats': 850, #下载状态码
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900, #http缓存
# Downloader side
}
也可以直接定义两个类,RandomUA负责更换UA,ProxyMiddlewares用来添加代理:
import random
class RandomUA():
def __init__(self):
self.user_agent=[
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11,'
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)',
]
def process_request(self,request,spider):
request.headers['User-Agent']=random.choice(self.user_agent) #随机选择user-agent
#请求的时候随机添加user-agent
class ProxyMiddlewares():
proxy_list=[
'http://183.166.124.43:9999',
'http://113.195.45.96:9999',
'http://123.52.96.10:9999',
'http://175.44.109.133:9999',
'http://175.42.128.13:9999',
] #找免费的代理测试
def process_request(self,request,spider):
ip=random.choice(self.proxy_list)
request.meta['proxy']=ip
需要在settings.py文件中注册我们自定义的中间件,然后才能使用。这种方式有点不妥,如果我们的请求不添加代理就可以成功,添加代理会还可能出现超时,这就明显就是无用功。还是建议把添加代理的操作写到process_exception()方法中去。
声明:1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
评论(1)