代理IP设置

本文分为如下部分

引言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设置

首先介绍一个网站

这是一个ip测试网站,你在浏览器打开这个网址,就可以看到你当前使用的ip,比如我的就是

如果你用requests请求的话,得到的也是浏览器中显示的内容,表示你这次请求时的IP

>>> import requests >>> r = requests.get() >>> print(r.text) { "origin": "59.77.43.8" }

如果你设置了一个代理ip的话,它就会显示你设置的ip,下面我们用requests实现代理IP设置

import requests >>> proxies = { ... http: :8118, ... https: :8118 ... } >>> r = requests.get(, 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之后,可以先多次访问这个网页,看是否每一次都使用的是不同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 = ?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&regions= >>> r = requests.get(url) >>> print(r.text) 42.242.162.165:1246 115.224.69.26:2314 115.85.206.211:3012 101.205.60.147:7135 180.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: :1246, https: :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编程

专栏目录:目录

爬虫目录:爬虫系列目录

版本说明:软件及包版本说明