未分类

DownloaderMiddlewares(下载器中间件)Scarpy的新版本能自动生成下载器中间件,一般不用自己去重写下载器中间件是引擎和下载器之间通信的中间件。在这个中间件中我们可以设置代理、更换请求头等来达到反反爬虫的目的。要写下载器中间件,可以在下载器中实现两个方法..process_request(self,request,spider):这个方法是在请求发送之前会执行process_response(self,request,response,spider),这个方法是数据下载到引擎之前执行process_request(self,request,spider)这个方法是在请求发送之前会执行参数:request:发送请求的request对象。spider:发送请求的spider对象返回值:已经激活中间件,process_response()方法则会在每个response返回时被调用。返回None:Scrapy将继续处理该请求,执行其他中间件中的相应方法,直到合适的下载器处理函数被调用。返回Response对象:Scrapy将不会调用任何其他的process.request方法,将直接返回这个response对象。返回Request对象:不再使用之前的request对象去下载数据,而是根据现在返回的request对象返回数据。如果这个方法中抛出了异常,则会调用process.exception方法。process_response(self,request,response,spider)这个方法是在收到相应时执行参数:request:request对象。response:待处理的response对象。spider:splder对象。返回值:返回Response对象:会将这个新的Response对象传给其他中间件处理。返回Request对象:下载器链被切断,返回的Request会重新被下载器调度请求。如果抛出一个异常,那么调用request的errback方法,如果没有指定这个方法,那么会抛出一个异常。随机请求头请求头网站:http://www.useragentstring.com/pages/useragentstring.php?typ=Browser开启下载中间件#Enableordisabledownloadermiddlewares#Seehttps://docs.scrapy.org/en/latest/topics/downloader-middleware.htmlDOWNLOADER_MIDDLEWARES={'headersApp.middlewares.HeadersappDownloaderMiddleware':543,}设置随机请求头在middlewares.py里编辑DownloaderMiddleware()类classHeadersappDownloaderMiddleware(object):HEADERS=['Mozilla/5.0(iPhone;CPUiPhoneOS11_0likeMacOSX)AppleWebKit/604.1.38(KHTML,likeGecko)Version/11.0Mobile/15A372Safari/604.1','Mozilla/5.0(WindowsNT6.1;WOW64;rv:40.0)Gecko/20100101Firefox/40.1','Mozilla/5.0(WindowsNT6.1;WOW64;Trident/7.0;AS;rv:11.0)likeGecko','Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.9.2.21pre)GeckoK-Meleon/1.7.0','Mozilla/4.0(compatible;MSIE6.0;WindowsXP5.1)Lobo/0.98.4','Mozilla/5.0(Windows;U;WindowsNT6.1;en-US;rv:1.9.2.28)Gecko/20120410Firefox/3.6.28']defprocess_request(self,request,spider):importrandomrequest.headers['User-Agent']=random.choice(self.HEADERS)returnNone关于换IP看这里

未分类

讯代理动态转发#讯代理动态转发源码importrequestsimporthashlibimporttimeclassIP(object):def__init__(self,orderno,secret):self.orderno=ordernoself.secret=secretdefHeaders(self):timestamp=str(int(time.time()))#计算时间戳planText='orderno='+self.orderno+','+'secret='+self.secret+','+'timestamp='+timestamp#‘订单号’‘接口’‘时间戳’拼接出字符串string=planText.encode()#需要MD5加密需要转码md5_string=hashlib.md5(string).hexdigest()#planText拼接出的字符串进行MD5()sign=md5_string.upper()#转成大写auth='sign='+sign+'&'+'orderno='+self.orderno+'&'+'timestamp='+timestamp#‘加密的字符串’‘订单号’‘时间戳’拼接字符串headers=auth#认证的头部returnheadersif__name__=='__main__':#注意不同的网站,修改不同的httpip=IP('订单号','secret')proxy={'http':'http://forward.xdaili.cn:80'}headers={'Proxy-Authorization':ip.Headers()}print(headers)r=requests.get(url="http://httpbin.org/ip",headers=headers,proxies=proxy).json()print(r)随机IP开启下载中间件#Enableordisabledownloadermiddlewares#Seehttps://docs.scrapy.org/en/latest/topics/downloader-middleware.htmlDOWNLOADER_MIDDLEWARES={'IpApp.middlewares.IpappDownloaderMiddleware':543,}Spider源码classIpspiderSpider(scrapy.Spider):name='ipSpider'allowed_domains=['httpbin.org']start_urls=['http://httpbin.org/ip']defparse(self,response):print(response.text)yieldRequest(url=self.start_urls[0],dont_filter=True)设置随机IP在middlewares.py里编辑DownloaderMiddleware()类fromIpApp.xundailiimportIPclassIpappDownloaderMiddleware(object):defprocess_request(self,request,spider):ip=IP('订单号','secret')headers=ip.Headers()proxy='http://forward.xdaili.cn:80'request.headers['Proxy-Authorization']=headersrequest.meta['proxy']=proxyreturnNone测试结果小错误提示当使用认证类代理是出现找不到Proxy-Authorization的头部信息原因:scrapy会自动去掉Proxy-Authorization解决:进入scrapy的源码路径:scrapy\core\downloader\handlers\http11.py注释掉:#ifisinstance(agent,self._TunnelingAgent):#headers.removeHeader(b'Proxy-Authorization')或者使用框架提供的下载中间件```关于下载中间件的了解