Scrapy爬虫框架 通过下载器中间件进行添加代理和更换UA

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Scrapy爬虫框架 通过下载器中间件进行添加代理和更换UA
中间件:1.下载中间件 2.爬虫中间件
 
作用:系在中间件是处于引擎和下载器之间。批量拦截请求和响应。
拦截请求:1.请求头的伪装 2.添加代理
拦截响应:篡改响应数据(无用)。

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()方法中去。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Scrapy爬虫框架 通过下载器中间件进行添加代理和更换UA》 发布于2020-03-08

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

1 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册