<>写在前面


因为爬虫被禁ip这样的反扒真的很凶,但自从建了一个代理ip池以后,反反扒就可以跟的上节奏。当然你也可以上网上各种代理平台自己付费。这些平台当然很方便提供api调用,还不用自己验证。但你不想付费的话,可以看看下面这个国外的开源项目,我是从某网站的评论信息里找到的,下面操作均是基于该网站:
https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list
<https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list>
头信息和全局变量:
import json import telnetlib import requests proxy_url =
'https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list'
<>获取代理的json信息

先打开:https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list
<https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list>
,如果你打不开的话请等下再试,毕竟是个开源的项目,访问人数很多吧。如下图所示:


很明显每一行是一个json数据,但整个页面你拿到的也不过是字符串而已,每一行末都换行,也就是说每一行末都有"\n",那么思路很清晰,用requests获得整个页面的text(字符串),然后用
split('\n') 将每一行分割之后组成的列表,便利这个列表用json.loads()方法,将每一行的字符串转换为json对象,最后取值。
response = requests.get(proxy_url) proxies_list = response.text.split('\n')
for proxy_str in proxies_list: proxy_json = json.loads(proxy_str) host =
proxy_json['host'] port = proxy_json['port'] type = proxy_json['type']
<>验证代理ip是否有效

可以选择在requests请求一个特定的网页,参考相应参数判断是否(200)有效。也可以用telnetlib
库里的Telnet来判断是否成功。如果遇到不成功的ip,需要等待10秒。当然你也可以更改timeout的值,但如果你改的越小,你的ip池就越小。
import telnetlib def verify(ip,port,type): proxies = {} try: telnet = telnetlib
.Telnet(ip,port=port,timeout=10) except: print('unconnected') else: print(
'connected successfully') proxies['type'] = type proxies['host'] = ip proxies[
'port'] = port
<>建立代理ip池


建立代理ip池有两种思路,一种是动态的,一种是固定的。动态的是多线程操作:主线程爬取,另一个线程来获取代理ip。注意,代理ip的线程需要先运行,然后主线程爬取的时候才可以挂上proxy。在这里不介绍这一种,因为一遍爬取,一遍验证是非常慢的,如果遇到不成功的ip,需要等待10秒。可能你会误以为爬虫死掉。


介绍第二种,建立固定的,首先是你要对你的地址足够有信心,也可以频繁的更新ip池来保证有效性。好处是在调用的时候比较方便,而且该网站会不间断的连接失败,可能是访问人数太多,但里面的代理信息不是很容易荡掉,所以我更倾向于保存到json文件里。将代理ip的信息,type,host,port保存到字典里,再用
json.dumps()方法将字典改为json数据,方便调用。
with open('verified_proxies.json','a+') as f: f.write(proxiesJson + '\n') print
("已写入:%s" % proxies)
总代码:
import json import telnetlib import requests import random proxy_url =
'https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list' #
proxyList = [] def verify(ip,port,type): proxies = {} try: telnet = telnetlib.
Telnet(ip,port=port,timeout=3) except: print('unconnected') else:
#print('connected successfully') # proxyList.append((ip + ':' + str(port),type))
proxies['type'] = type proxies['host'] = ip proxies['port'] = port proxiesJson
= json.dumps(proxies) with open('verified_proxies.json','a+') as f: f.write(
proxiesJson+ '\n') print("已写入:%s" % proxies) def getProxy(proxy_url): response =
requests.get(proxy_url) proxies_list = response.text.split('\n') for proxy_str
in proxies_list: proxy_json = json.loads(proxy_str) host = proxy_json['host']
port= proxy_json['port'] type = proxy_json['type'] verify(host,port,type) if
__name__== '__main__': getProxy(proxy_url)
运行效果,将严重成功的写入文件,结果可在当前路径下查看verified_json.json文件:


<>requests代理ip配置

这里测试用到一个网站:http://icanhazip.com <http://icanhazip.com>
,这个网站会返回当前请求的ip地址,来测试代理ip是否配置成功。
import requests url = 'http://icanhazip.com' proxy = { "http":
"35.224.248.29:3128", } response = requests.get(url,proxies=proxy) print(
response.text)
运行结果为:35.224.248.29