• 关于Scrapy框架的更换ip以及写入流程


    最近在思考如何将爬取职位信息从requests调用的方式转化为Scrapy框架,因为爬取的数据较多,而且目标页面的url是有规律的。 比如这个:https://www.monster.com/jobs/search?q=&where=Wyoming&page=5&rd=100 参数where就是可以进行随机填充来进行爬取的。 第一个要解决的就是ip问题,查找了很多资料,发现最好的更换动态ip的方式就是在settings.pymiddlewares.py做一点小小的改变。 首先应该在 settings.py里放置一个计数的字典和ip代理池:

    count = {'count': 0} 
    ipPool = []

    然后在middlewares.py里进行最关键的一步更改,请找到你的下载中间件,我这里的类名叫做:class TutoiralDownloaderMiddleware,不要找成SpiderMiddleware哦! 在类里找到 process_request 方法,这里我个人的理解就是每次请求时都会进行调用,所以可以在这里更改ip:

            # 更换单独一个
            request.meta['proxy'] = 'http://你的ip'
    
            # # 随机选中一个ip
            # ip = random.choice(ipPool)
            # print('当前ip', ip, '-----', count['count'])
            # # 更换request的ip----------这句是重点
            # request.meta['proxy'] = ip
            # # 如果循环大于某个值,就清理ip池,更换ip的内容
            # if count['count'] > 50:
            #     print('-------------切换ip------------------')
            #     count['count'] = 0
            #     ipPool.clear()
            #     ips = requests.get(你的api)
            #     for ip in ips.text.split('
    '):
            #         ipPool.append('http://' + ip)
            # # 每次访问,计数器+1
            # count['count'] += 1
            return None

    这里给大家展示了他的用法,实际就是request.meta去改变proxy这个参数。你可以单独用一个ip,也可以去调你的获取ip的接口。未进行注释的地方就是单独用一个ip,注释了的代码块就是动态更换ip,那写到这里大家一定很奇怪,settings里的

    ipPool 是空的,那代码运行到
    ip = random.choice(ipPool)这里不就报错了吗?
    那么现在就揭晓谜底,那就是请大家在爬虫文件里,重写一下
    start_requests方法!
        def start_requests(self):
            # 第一次请求发起前先填充一下ip池
            ips = requests.get(你的api)
            for ip in ips.text.split('
    '):
                ipPool.append('http://' + ip)

    到这里,我们的动态构建ip请求的方式就告一段落了哦!



  • 相关阅读:
    32-数据链路层,PPP协议
    31-NAT
    30-安全技术,ACL
    ensp实验:配置DHCP
    29-应用层,DHCP协议
    ensp实验:配置stp
    28-STP,选举过程、端口状态、计时器、拓扑变化
    27-交换机,STP
    26-交换机,GVRP
    Manually APK Downgrade for split apks
  • 原文地址:https://www.cnblogs.com/abc1997/p/15343974.html
Copyright © 2020-2023  润新知