最近在思考如何将爬取职位信息从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('\r\n'):
        #         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('\r\n'):
            ipPool.append('http://' + ip)

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