最近在思考如何将爬取职位信息从requests调用的方式转化为Scrapy框架,因为爬取的数据较多,而且目标页面的url是有规律的。 比如这个:https://www.monster.com/jobs/search?q=&where=Wyoming&page=5&rd=100 参数where就是可以进行随机填充来进行爬取的。 第一个要解决的就是ip问题,查找了很多资料,发现最好的更换动态ip的方式就是在settings.py,middlewares.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请求的方式就告一段落了哦!