我们在随机爬取某个网站的时候,比如对网站发出成千上万次的请求,如果每次访问的ip都是一样的,就很容易被服务器识别出你是一个爬虫。因此在发送请求多了之后我们就要设置ip代理池来随机更换我们的ip地址,使服务器不那么容易去识别。那么如何在scrapy框架中如何设置ip代理池呢?
事先声明:在阅读本文之前,要对python爬虫和scrapy框架有一定的了解!!!
本篇文章是在我之前写过的一篇名为《在scrapy框架中如何随机更换请求头达到反爬的目的》(https://blog.csdn.net/liumengqi11/article/details/112929481)的基础上写的,这两篇文章都是针对scrapy框架下反爬的,最好是先看那篇文章再来看这个!!!
-
首先,我们先了解一下比较有名的几家代理服务商:
* 芝麻代理:http://h.zhimaruanjian.com/getapi/
* 太阳代理:http://http.taiyangruanjian.com/
* 快代理:http://www.kuaidaili.com/
* 讯代理:http://www.xdaili.cn/
* 蚂蚁代理:http://www.mayidaili.com/
* 极光代理:http://www.jiguangdaili.com/
这里我们以芝麻代理为例,登陆芝麻代理官网,注册账户每天即可领取20个免费代理,选择提取数量,ip协议选择HTTPS,数据格式选择json,选择属性为ip port,城市任意,端口位数选择端口位数随机,ip去重选择360天去重,运营商选择不限,最后生成api链接。复制链接在新的浏览器窗口打开,可看到的形式类似如下(这里我选择了两个代理ip,后面在middlewares.py
中会用到):
{"code":0,"data":[{"ip":"27.42.209.154","port":4234},{"ip":"119.115.97.140","port":4245}],"msg":"0","success":true}
-
上篇文章是用以下三条命令在cmd中执行,建立名为
downloadmiddleware
的scrapy框架,里面包含一个名为httpbin
的Spider:
scrapy startproject downloadmiddleware
cd downloadmiddleware
scrapy genspider httpbin httpbin.org
这次我们多建立一个名为ipproxy
的Spider,命令如下:
scrapy genspider ipproxy httpbin.org
-
用pycharm打开此文件,可看到文件的框架如图片左侧(这里我又建立一个run.py文件,代码如图片右侧,方便整个框架的运行,这节课主要是测试ip代理池,所以我就把更换user-agent的给注释掉了):
-
ipproxy.py代码如下:
import scrapy class IpproxySpider(scrapy.Spider): name = 'ipproxy' allowed_domains = ['httpbin.org'] start_urls = ['http://httpbin.org/ip'] def parse(self, response): print('=' * 30) print(response.text) print('='*30) yield scrapy.Request(self.start_urls[0], dont_filter=True)
-
middlewares.py的代码如下:
from scrapy import signals from itemadapter import is_item, ItemAdapter from fake_useragent import UserAgent import random class UserAgentDownloadMiddleware(object): # UserAgent的 def process_request(self,request,spider): ua = UserAgent() # print(ua.random) user_agent_str = ua.random # print(user_agent_str) request.headers['User-Agent'] = user_agent_str class IPProxyDownloadMiddleware(object): # ip代理池的 PROXIES = [ {"ip": "27.42.209.154", "port": 4234}, {"ip": "119.115.97.140", "port": 4245} ] # 这个就是ip代理复制过来的 def process_request(self,request,spider): proxy = random.choice(self.PROXIES) proxy_url = "http://" + proxy["ip"] + ":" + str(proxy["port"]) request.meta['proxy'] = proxy_url
-
settings.py中依旧要更改机器人协议,延迟参数,设置user-agent,唯一不同的是对middlewares的设置需要加一条,具体如下:(参照左面的行数更容易找打对应位置哦):
-
最后运行一下,可以看出现在使用的就是我们的代理ip:
❤❤❤微博小白,希望大家批评指正❤❤❤