• scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)


    上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent、随机代理。


    一、随机UA

    分析:构建随机UA可以采用以下两种方法

    • 我们可以选择很多UserAgent,形成一个列表,使用的时候通过middleware获取到settings.py文件中的配置,然后进行随机选择
    • 使用第三方库fake-useragent,这个库可以方便的生成一个随机UA,使用起来也很方便

    本篇我们使用第二种方式来构建随机UA

    • 安装第三方库fake_useragent,使用命令pip install fake-useragent


    • 生成ua的方式很简单

    from fake_useragent import UserAgent
    
    ua = UserAgent(verify_ssl=False)  #正常不需要这个参数,如果无法获取请添加这个参数
    print(ua.random)

    下面开始项目代码的编写

    • 在middlewares.py文件中,我们对scrapy默认的UserAgentMiddleware进行改写

    
    
    from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware   #导入默认的UA中间件的类
    from fake_useragent import UserAgent

    class
    LagouUserAgentMiddleware(UserAgentMiddleware): #新建一个拉钩网的UA中间件类继承自默认的类 def process_request(self, request, spider): request.headers.setdefault(b'User-Agent', UserAgent(verify_ssl=False).random) #设置一个随机的UA print('当前ua %s' % request.headers['User-Agent']) #打印出来看一下
    • 把我们在lagou_c.py文件中custom_settings中的UA注释掉

    • 这样UA就设置好了,还需要到settings.py文件中把它激活

    DOWNLOADER_MIDDLEWARES = {
        #'lagou.middlewares.LagouDownloaderMiddleware': 543,   #有注释,是未激活的中间件
        'lagou.middlewares.LagouUserAgentMiddleware': 333,   #优先级是333,自己随便设置,数字越小代表优先级越高
    }
    • 我们运行一下爬虫,看下结果,可以看到UA在随机的更换

     二、随机代理

    分析:构建随机代理可以采用以下两种方法

    • 我们可以选择很多proxy,形成一个列表,使用的时候通过middleware获取到settings.py文件中的配置,然后进行随机选择
    • 构建一个随机代理池,通过middleware对随机代理进行设置

    这里我们采用第二种方式,网上有别人构建的代理池,我就直接拿来用了,毕竟重复造轮子的时间,你可以用来做很多其他事情了。

    我这里使用的是阿里云ECS服务器Centos 7,本地windows操作一样

    • 首先使用git命令下载仓库(没有git的去下载一个,这个必学,可以简单理解为git本地仓库,github远程仓库,本地的可以上传,远程的可以下载)

      git clone https://github.com/Python3WebSpider/ProxyPool.git

    • 进入到PrxxyPool文件夹,然后再进入proxypool文件夹

    • 编辑里面的setting.py文件,修改TEST_URL = 'http://www.lagou.com',这么做的目的就是让这些代理去请求拉勾网,如果成功就说明这个代理有效

    • 我们接下来把这个代理池运行起来,在run.py文件目录下,运行run.py程序

    • 可以看到代理自动获取并且在测试可用性,我们可以打开浏览器,看下获取一个随机代理,如果是远程服务器,地址为ip:5555/random (ip为远程服务器ip),如果是阿里云服务器需要设置安全组,放开5555端口。


     

    现在开始编写我们的爬虫代码

    • 在middlewares.py文件,新增一个LagouProxyMiddleware类

    import requests
    from requests.exceptions import ConnectionError

    class LagouProxyMiddleware(object):
        def __init__(self,proxy_url):
    self.proxy_url = proxy_url

    def get_random_proxy(self):
    ’‘’
    使用requests获取代理
    ‘’‘
    try:
    response = requests.get(self.proxy_url)
    if response.status_code == 200:
    random_proxy = response.text
    return random_proxy
    except ConnectionError:
    return False

    def process_request(self, request, spider):
    if request.meta.get('retry_times'): #如果重试次数为0,就使用默认的ip地址进行页面爬取,否则使用代理
    random_proxy = self.get_random_proxy()
    if random_proxy:
    uri = 'https://{}'.format(random_proxy)
    print('当前代理为{}'.format(request.meta['proxy']))
    request.meta['proxy'] = uri #设置随机代理

    @classmethod
    def from_crawler(cls,crawler):
    ’‘’
    类函数,使用crawler来获取settings中的PROXY_URL,也就是生成随机代理的url
    ‘’‘
    settings = crawler.settings
    return cls(
    proxy_url=settings.get('PROXY_URL')
    )
    • 在settings.py中激活这个中间件,并且定义PROXY_URL

    DOWNLOADER_MIDDLEWARES = {
        #'lagou.middlewares.LagouDownloaderMiddleware': 543,
        'lagou.middlewares.LagouUserAgentMiddleware': 333,
        'lagou.middlewares.LagouProxyMiddleware': 444,
    }
    
    PROXY_URL = 'http://localhost:5555/random'  #哪台设备运行的代理池,就把localhost修改为那台设备的ip,本机不用修改

    至此我们就完成了随机UA和随机代理的设置,老规矩,运行下爬虫。当然,因为本地ip没有被封,所以一直就会使用本地ip,不会使用代理ip,毕竟免费的代理慢。

     

  • 相关阅读:
    Android核心分析 ---- 电话系统之GSMCallTacker
    Android核心分析 ----- Android电话系统之RIL-Java
    Android核心分析 ------ 电话系统之rilD
    Android核心分析 ----- Android电话系统-概述篇
    AndroidRuntime 流程
    关于++和--运算符的理解
    使用eclips开发java时的闪退问题
    Android--控件的滑动事件
    Running Hero.
    软件工程第三次大作业分工说明
  • 原文地址:https://www.cnblogs.com/sjfeng1987/p/10033225.html
Copyright © 2020-2023  润新知