我们接着来应对反爬虫,当我们使用一个IP连续访问一个网站的时候,很容易被这个网站封掉,运气不好,你的IP就永远的被这个网站给封了,那么这时我们有两种处理方法:
第一种是访问一会儿,延迟一会;第二种就是构建一个代理IP池,延迟比较简单,下面我把构建IP池的步骤,以及筛选出可用IP的一系列操作整理出来。
首先我们找到可以免费获取IP的网站(毕竟白嫖才是真香)
http://www.66ip.cn/
可以看到这里有一个免费HTTP获取,我们先获取10个,点进去,页面解析,得到一个URL
http://www.66ip.cn/mo.php?sxb=&tqsl=10&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea=
可以看到tqsl=10,这里就是我们刚才所点的10条,后面想获取更多,就可以把这个值调整的大一些
from urllib import request
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import re
ge = UserAgent()
url = 'http://www.66ip.cn/mo.php?sxb=&tqsl=100&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea='
head = {'User-Agent':ge.random}
req = request.Request(url,headers=head)
req = request.urlopen(req)
con = req.read().decode('gb2312')
obj = BeautifulSoup(con, 'html5lib')
listip = [item for item in obj.stripped_strings if re.match(r'\d', item)]
validips = []
for ip in listip:
print(ip)
ip = {'http': ip}
proxy = request.ProxyHandler(ip)
opener = request.build_opener(proxy)
url = 'http://www.baidu.com'
headinfo = {'User-Agent': ge.random}
reqhd = request.Request(url, headers=headinfo)
try:
req = opener.open(reqhd)
except Exception as e:
print ('invalid ip:', ip, e)
if req.code == 200:
validips.append(ip)
print(len(validips))
for ip in validips:
print(ip)
这里将每一个得到的IP直接访问百度,状态码为200的就是合格的,这时我们就加入到目标队列里,然后我们就可以用这些IP去访问网站了;
运行结果如下