python之scrapy框架中间件,请求头,IP代理及fake-useragent使用,及面试中正向代理、反向代理区别

一、scrapy 中间件
  • 什么下载器中间件?
    引擎与下载器之间的一个组件,一个爬虫可以有很多下载器中间件
  • 为什么要使用下载器中间件功能
    全局修改Scrapy request和response
  • scrapy 下载器中间件:
    编辑文件middleware.py文件
  • 编写处理方法
    处理请求 process_request(self, request, spider)
    添加:用户头 添加IP代理等功能
  • 配置settings
    在settings文件中配置DOWNLOADER_MIDDLEWARES参数
  • 为什么模拟用户头、IP代理?
    一句话:为了反反爬
二、自定义UA池构建自己的请求
  • from Douban.settings import USER_AGENT_LIST
    import random
    
    class RandomUserAgent(object):
        # 定义一个中间键类
        # 用户代理
        def process_request(self, request, spider):
            # 检验一下请求头
            # print(request.headers['User-Agent'])
            # 获取一个请求头
            ua = random.choice(USER_AGENT_LIST)
            # 设置请求头代理
            request.headers['User-Agent'] = ua
    
  • setting配置

    DOWNLOADER_MIDDLEWARES = {
       # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
       #注册请求头用户代理
       'Douban.middlewares.RandomUserAgent': 543,
    }
    
    #自定义请求头,用户代理(自定)
    USER_AGENT_LIST =[
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HCI0449; .NET CLR 1.0.3705) ",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; i-NavFourF; .NET CLR 1.1.4322) ",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; "
    ]
    
    请求头(用户)代理 随机)
    定一个中间键类,重写process_request(self,request, spider)方法
    对request的处理进行相应的配置,并把配置好以后
    并把响应的类注册到setting文件中
    
    参数[request,spider],并检验请求头。Print(request.headers[‘User-Agent’])
    需要在setting中DOWNLOADER_MIDDLEWARES(自定义中间键)配置
    
    查看用户是用哪个代理请求头,在爬虫中parse_item方法下这里
    print(response.request.headers[‘User-Agent’]
    
三、 使用第三方库构建UA池
  • useragent 基本用法
    调用库 fake-useragent
    安装:pip install fake_useragent
    导入:from fake_useragent import UserAgent
    headers = {"User-Agent": UserAgent().chrome}
    print(UserAgent().ie)      #随机打印ie浏览器任意版本
    print(UserAgent().firefox) #随机打印firefox浏览器任意版本
    print(UserAgent().chrome)  #随机打印chrome浏览器任意版本
    print(UserAgent().random)  #随机打印任意厂家的浏览器
    ``
    
  • class RandomUserAgentMiddleware(object):
        def __init__(self,crawler):
            super(RandomUserAgentMiddleware, self).__init__()
            self.ua = UserAgent()
            self.ua_type = crawler.settings.get('RANDOM_UA_TYPE','random')
     
        @classmethod
        def from_crawler(cls,crawler):
            return cls(crawler)
     
        def process_request(self,request,spider):
     
            def get_ua():
                return getattr(self.ua,self.ua_type)
            request.headers.setdefault('User-Agent',get_ua()
    
  • setting配置
    DOWNLOADER_MIDDLEWARES = {
       'liebiao.middlewares.MyCustomDownloaderMiddleware': 543,
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    }
    
    RANDOM_UA_TYPE= 'random'
    
  1. 通过crawler.settings.get来获取配置文件中的配置,如果没有配置则默认是random,如果配置了IE或者chrome等就会获取到相应的配置
  2. 在process_request方法中我们嵌套了一个get_ua方法,get_ua其实就是为了执行ua.ua_type
  3. 但是这里无法使用self.ua.self.us_type,所以利用了getattr方法来直接获取,最后通过request.heasers.setdefault来设置User-Agent
  4. 通过上面的配置我们就实现了每次请求随机更换User-Agent
    转https://blog.csdn.net/javakklam/article/details/79984126
四、随机切换IP代理
  • 让目标服务器以为不是同一个客户端在请求,防止因为ip发送过多而被反爬。防止我们的真实ip被泄露,防止被追究责任

    from scrapy import signals
    import random
    import base64
    from Douban.settings import PROXY_LIST
    
    class RandomProxy(object):
        def process_request(self, request, spider):
            # 随机取出一个代理ip
            proxy = random.choice(PROXY_LIST)
            
            # 判断是否为人民币玩家
            if 'user_passwd' in proxy:
                #把账号密码转换为b64编码格式(字符串先变成bytes类型)必须字符串转为bytes
                b64_data = base64.b64encode(proxy['user_passwd'].encode())
                # 设置账号密码认证                     认证方式   编码之后的账号密码
                request.headers['Proxy-Authorization'] = 'Basic ' + b64_data.decode()
                # 设置代理
    
            else:
                # 免费代理不用认证
                request.meta['proxy'] = proxy['ip_port']
    
  • settings中设置

    DOWNLOADER_MIDDLEWARES = {
       # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
       #注册ip代理
        # 'Douban.middlewares.RandomProxy': 544,
    }
    
    ip代理(自定)
     PROXY_LIST = [
         {'ip_port': '121.232.148.85:9000'},
         {'ip_port': '115.223.235.157:9000'},
    		#收费的ip, 端口    用户名   密码
         {"ip_port": "ip:port", "user_passwd": "user:passwd"}
    ]
    
    
    在setting中定义代理,
    并将其导入到middlewares中
    随机获取一个随机用户代理random.choice(),
    设置一个用户头代理request.headers[‘User-Agent’] = 随机获取的代理,
    
五、正向代理与反向代理的区别

这里写图片描述

  • 正向代理:
    它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求
    在天朝用浏览器访问 www.google.com 时,被残忍的拒绝了,于是你在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。

  • 反向代理:
    隐藏了真实的服务端,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

    eg:拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。

    两者的区别在于代理的对象不一样:
    正向代理代理的对象是客户端,反向代理代理的对象是服务端

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风华浪浪

讨个老婆本呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值