内容介绍

本章将要介绍一下如何使用代理ip解决反爬虫的禁ip的问题,并扩展了解一下代理ip池的构建与adsl服务器的使用。

代理ip初探

如何获取自己的ip

下面,我们先来看一下如何获取自己的ip地址。我们直接在百度上搜索ip,或者通过http://www.ip138.com/这个网站就可以。比如说我现在的ip如下:

ip作为一个身份信息,一般是不会变的,想要改变自己的ip的方法就是找代理了。

所谓代理,其实就是比如说我们要访问一个网页,但这个时候我们不自己去访问,而是告诉代理我们想要访问什么,然后代理用自己的ip去访问,再返回给我们。这样网站其实拿到的不是我们的真实ip,而是代理的ip。

python中使用代理ip

免费的代理ip有很多,虽然这种网站都不会提供太多的代理ip。我们这里以西刺代理的免费ip为例,看看在python中如何使用代理ip。

首先打开http://www.xicidaili.com/nn/,可以看到这里有很多代理ip。

这里可以根据当日的情况挑选一个ip,我这里选择了139.129.207.72:808这个代理。然后我们编写代码,调用ip138的接口,查看一下自己使用代理后的ip是否改变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
from bs4 import BeautifulSoup
def parse_ip(content):
soup = BeautifulSoup(content, "html.parser")
print(soup.body.get_text())
resp = requests.get("http://2018.ip138.com/ic.asp")
parse_ip(resp.content.decode("gbk"))
print("\n改变ip后:")
proxies = {"http": "http://139.129.207.72:808"} # 需要改成在西刺代理上看到的可用代理ip
resp2 = requests.get("http://2018.ip138.com/ic.asp", proxies=proxies)
parse_ip(resp2.content.decode("gbk"))

可以看到使用前,我的ip还是北京的ip,使用后变成了山东的ip了。

构建代理ip池

在使用代理ip时,我们一般都会去花钱买一些可用的ip或者是购买包月服务。但实际上,买来的ip并不是都能用的,而且大多时候是很多都不能用,不能用比例非常之高。

代理ip池的目标其实就是要验证那些能用,哪些不能用,如果可用,就把可用的ip放到一个“池子”里。等我们爬虫程序需要ip的时候,从“池子”里拿就好了。

这里我们不会去自己写一个代理ip池子,而是举一个例子:比如说我们想要爬取链家网的房价数据。

Validator编写

我们需要首先写一个验证器validator来验证ip是否可用。比如说在之前爬链家的时候,如果ip被禁了之后,就会跳转到一个验证的页面,让我们点击倒着的房子进行验证,其实也就是验证码了。这种ip的话就是算不可用的。

当然,还有超时、不可连接等等的情况。

validator的代码类似下面这样:

1
2
3
4
5
6
7
8
9
10
11
def validate_lianjia(proxy_url):
proxies = {"http": proxy_url}
try:
resp = requests.get("http://bj.lianjia.com/", proxies=proxies, timeout=20) # 20秒超时
content = resp.decode("utf-8")
if "请点击倒着的房屋" in content:
return False
else:
return True
except:
return False

代理ip池运行流程

有了validator,我们就可以拿买来或者爬来的代理ip去验证了。如果validator返回为true,就是可用的。我们把可用的ip放到“池子”里,这个“池子”可以是数据库,也可以是本地文件。只要爬虫程序能拿到就好了。

当然,我们会有一些更新策略,比如说多久判断一次池子里面的代理。是否要剔除池子里的数据。

这块我们就不深入展开了。

开源代理ip池

当然也有开发者开发的免费代理ip池,其实就是先去各大代理ip网站爬一些代理来,然后再验证,提供一个Http的接口。

比如说这个:https://github.com/awolfly9/IPProxyTool。当时笔者在大学的时候想爬链家,但是不舍得买代理ip,然后就用的这个库搞的代理ip爬的链接网的房价数据。

一个简单粗暴的方法:adsl服务器

自我感觉代理ip还是一种比较麻烦的方法,下面介绍的adsl服务器就会很简单粗暴了。

adsl服务器其实就是拨号上网服务器,它每拨一次号,就获取一个新的IP。

所以,在adsl服务器上换ip的话,就像下面一样,两行代码搞定。

1
2
3
4
import os
os.system("ifdown ppp0") # 先断网
os.system("ifup ppp0") # 再联网

因为每次换ip都需要断网然后再联网。所以如果是并发的爬虫,在adsl服务器上会变得很难管理。如果我们的爬虫是单线程爬取的,adsl服务器的体验还是不错的。

如果想体验adsl服务器,最好自己租一个月练练手就知道怎么用了,一般价格在100以内/每月。