代理IP设置
时间:2023-02-10 18:30:01 | 来源:建站知识
时间:2023-02-10 18:30:01 来源:建站知识
本文分为如下部分
- 引言
- requests代理IP设置
- 免费代理IP
- 付费代理IP
- 代理ip池创建思路
引言
我们请求一个网页时,不仅携带着headers等信息,而且会带一个ip地址。如果你一直携带着同一个ip地址,去大量快速请求同一个域名下的网页,网站就会识别出这是同一个人(同一个ip)在大量请求他的网站,这时往往会把你的ip封掉,或者弹出验证码验证你是不是机器。
如果试一下用python不加任何约束,成百上千次地循环访问豆瓣电影页面,会发现一段时间后爬虫报错,无法抓取到信息。这时如果你用浏览器登录豆瓣的网站,也会发现登不进去,因为你这个ip已经被封掉了,无论用python还是浏览器请求都没有用。这时你如果换一个wifi,就又可以正常访问了。
这种反爬虫方式只有当你大规模抓取网页时才会出现,如果你只是想抓取豆瓣top250个电影信息,请求次数非常少,则只使用自己的一个ip就不会被封。
用python做爬虫时,要想绕过这道反爬虫机制,一般有两种方法
- 降低抓取速度。比如每两次请求之间间隔2秒,即设置
time.sleep(2)
(事先import time
)。(你user-agent等伪装得当的情况下,如果2秒请求一次,这是人手动也可以操作出来的,网站就不敢确定你是一个爬虫程序,只有统一个ip 1秒请求很多次,网站才会直接判断你是爬虫)有时设置随机sleep时间,防止网站识别出你访问时间太过均匀 - 可以设置代理IP,使用不断变化的IP来请求,这样就不会被判定为同一个人,请求非常快也无法被判定为爬虫。大量抓取时,如果不想以牺牲爬虫速度为代价获取数据,一般都要设置代理IP。
要想获得代理ip,主要有两种途径,一个是从免费代理ip网站上获得,另一个是购买付费代理。
就我个人而言,平时要抓取的数据大都在千或者万的级别,需要使用代理ip。但是爬虫只运行几个小时也就能结束了,因此我会选择按小时购买付费代理IP。如果数据量再大,需要跑几天几个月这种的,使用付费代理就比较贵了。
付费代理IP比较稳定,而且操作比较简单。下文我们就分别讲解付费代理IP和免费代理IP的设置。
requests代理IP设置
首先介绍一个网站
http://httpbin.org/ip
这是一个ip测试网站,你在浏览器打开这个网址,就可以看到你当前使用的ip,比如我的就是
如果你用requests请求的话,得到的也是浏览器中显示的内容,表示你这次请求时的IP
>>> import requests>>> r = requests.get('http://httpbin.org/ip')>>> print(r.text){ "origin": "59.77.43.8"}
如果你设置了一个代理ip的话,它就会显示你设置的ip,下面我们用requests实现代理IP设置
import requests>>> proxies = {... 'http': 'http://180.160.103.185:8118',... 'https': 'https://180.160.103.185:8118'... }>>> r = requests.get('http://httpbin.org/ip', proxies = proxies)>>> print(r.text){ "origin": "180.160.103.185"}
其中
1180.160.103.185:8118
就是我们要找的代理IP,前半部分
180.160.103.185
是ip,后半部分
8118
是端口(port),两者都要有。
上面代码读者运行多半会报错,因为这个代理ip在我写文章时有效,在读者看文章时多半会失效了,带着失效的ip访问则抛出异常。
下面我们来简单介绍从免费代理网站上获取代理ip。
免费代理IP
免费代理IP平台非常多,比如西刺、3464网等,他们的样子都是类似
其中代理ip地址和端口就是我们想要的值。我们可以从这里复制到我们上面的代码中,看这个ip是否有效。测试之后发现这些免费代理ip非常多是无效的(即携带它去requests会报错)
如果我们真的要基于免费代理IP进行大规模爬虫,不可能像上节那样一个个指定,需要使用爬虫不断从免费代理网站上抓取这些ip存到数据库中,并经常检验它们是否有效,将无效ip剔除。然后每次请求都自动从数据库中提取IP,构造
proxies
变量。这是代理ip池的维护问题,它的实现思路会在本文最后一节详细说。
那么我们如果不想自己建一个代理IP池,就不能用这些免费代理了吗?
当然不是。代理ip池也是有人造好了轮子,比如这个项目,可以看它的介绍,需要事先如何配置环境,然后就可以愉快地调用这些ip了。但是从免费代理网站上获得的IP质量一般比较低,很难保证从IP池中提取的IP都是有效的。如果不想再折腾一些异常处理,或者改进这个IP池,就选择付费IP吧。
除此之外,可以参考刚刚这个项目后面列出的同类项目
我们可以尝试这些项目哪一个的效果最好。而且这些项目的源代码也是学习构建代理ip池的绝佳材料。
其中这个项目实现了用scrapy抓取各大免费代理ip平台,如果不知道有哪些免费代理网站,可以看这个项目写了对哪些代理ip网站的爬虫
在我们配置好代理IP之后,可以先多次访问
https://httpbin.org/ip
这个网页,看是否每一次都使用的是不同ip,然后再去抓取目标网站。
付费代理IP
我们上文说过,如果不是非常大规模的抓取,又不想折腾异常处理,最好选用付费代理IP。
要想使用付费代理IP,首先我们需要知道市面上有哪些平台提供,哪个平台比较好,以及各个平台怎么用。
关于哪些平台提供,和各个平台的优缺点,已经有大佬总结好了,看下面这篇文章
爬虫代理哪家强?十大付费代理详细对比评测出炉!
这篇文章对站大爷、芝麻 HTTP 代理、太阳 HTTP 代理、讯代理、快代理、蘑菇代理、阿布云代理、全网代理、云代理、大象代理进行了对比评测。
下面我以阿布云和芝麻代理为例讲解付费代理的使用。
1.阿布云
直接进入官网,选择HTTP隧道,我一般使用的是动态版,看下面一张图
点击价格方案,选定后(要登录后) 立即购买,在里面对应位置选购隧道即可,见下面这张图
购买后可以看到这样的界面
这里有通行证书和通行密钥,需要在代码中填入。下面我们来讲一讲如何在python中调用这个代理IP。
在最开始的界面中选择接入指南,可以看到下面这个界面
这里说明了在各个软件中如何使用阿布云,我们以python的requests库为例来看一下(从下面这张图中可以看到,scrapy等也都是支持的)
我们可以看到,将刚刚获得的通行证书和通行密钥放在
proxyUser
和
proxyPass
两个变量中,最后构造出一个proxies作为
requests.get
的参数,带着这个参数请求网页即使用了代理IP。
使用阿布云时要注意(看阿布云的第一张图),它限制了每秒只能请求5次,所以我们要限制自己的爬虫速度,如果超过这个速度,要么购买更多次数,要么降低抓取速度。
2.芝麻代理
在芝麻代理的获取API选项中,可以先领取免费IP来看看这是怎么用的,选好配置后点击生成API链接,得到下图
点击打开链接可以看到
如果我们请求这个链接,可以得到上述内容。
>>> import requests>>> url = 'http://webapi.http.zhimacangku.com/getip?num=5&type=1&pro=&city=0&yys=0&port=1&pack=20005&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1®ions='>>> r = requests.get(url)>>> print(r.text)42.242.162.165:1246115.224.69.26:2314115.85.206.211:3012101.205.60.147:7135180.118.33.101:3217
芝麻代理没有像阿布云那么友好,没有提供配置代码 只是提供了ip,以API(上面那个链接)的形式发给我们,我们需要自己去构造proxies,用
requests.get(url, proxies = proxies)
进行请求即可
构造
proxies
的代码如下
>>> ip = '42.242.162.165:1246'>>> proxies = {'http': 'http://{}'.format(ip),... 'https': 'https://{}'.format(ip)}>>> proxies{'http': 'http://42.242.162.165:1246', 'https': 'https://42.242.162.165:1246'}
代理ip池创建思路
本节我们只是简单叙述代理ip池实现的原理,细节部分我会推荐一些资料供想深入了解的读者学习。
这里我们要搭建的代理ip池最好能像芝麻代理那样,提供一个API(那个链接),当请求这个API时,就会返回一个代理ip。这样获取会比从数据库中直接抽好。
下面给出一种ip代理池的实现思路
开启三个进程
- 爬虫程序,从免费代理网站上抓取ip,存储到队列中
- ip检测程序,不断对队列中的ip进行检测,将无法使用的ip去除
- API接口服务,便于IP调用
1.爬虫程序
因为免费IP的可用性都比较低,所以需要用爬虫抓取大量IP以备用。一般需要对多个免费的代理IP网站分别写一个请求、解析的函数,然后同时运行这些爬虫程序,将抓取到的IP整合到一起,存到数据库中,等待调用。一般数据库选择redis。
比如我们要抓取3个代理ip网站,可以先把3个爬虫代码跑一遍,将三个网站中所有ip都存到数据库中,然后sleep一段时间。时间到时对数据库中ip数量进行判断,如果数量依然很多,则不再抓取,再进入sleep;如果ip已经不够了,则在执行相同的爬虫,虽然是抓取和之前相同的网站,但是代理ip网站都是时刻更新的,这一次访问就会获得很多上一次没有得到的ip。总之就是隔一段时间将所有免费ip网站全爬一遍。
这个思路用代码呈现是这样的
while True: if 数量 < 阈值: crawl time.sleep(100)
2.ip检测程序
要新开一个进程,和上面爬虫进程同时运行,将数据库中的ip提取出来检验是否有效,将无效ip去除。检验的方法是用这个ip去访问一个网站,比如百度首页,看是否返回200等请求成功的状态码,如果返回失败的状态码,则要从数据库中去除这个ip。因为ip较多,检验时可以使用异步等方式加快速度。也是设置sleep,隔一段时间检测一次。
3.API接口服务
为了让IP更容易调用,要设计出一个类似网页的形式,请求一个URL就会获得一个IP。可以基于Flask框架,非常简单易上手。
下面推荐一些学习资源
对于基础读者,可以先看下面这篇文章
用Flask+Aiohttp+Redis维护动态代理池
这篇文章详细解释了一个代理ip池是如何构建起来的,有代码,有解释,非常适合初学者学习。
如果想对上面的ip池进行改进,可以参考其他代理ip池的项目,比如这个项目,还有它后面列出的其他项目
专栏信息
专栏主页:python编程
专栏目录:目录
爬虫目录:爬虫系列目录
版本说明:软件及包版本说明