一、建立IP代理池的思路:
当你是爬虫的时候,访问过于频繁难免会出现IP被屏蔽的情况,单个本地IP不足以进行大规模抓取,也不想买付费代理,所以搭建IP代理池是非常必要的。想法如下:
图1
二、建立IP代理池的步骤:
爬代理IP:搜索选择代理IP网站,选择免费代理;代码如下:# _ * _编码:UTF-8 _ * _
#由张杰开发
#创作时间:2020年12月29日17:58
#文件名:爬网代理IP。巴拉圭
#开发工具:PyCharm
导入请求
进口lxml.html
导入操作系统
标题={ 0
用户代理' : ' Mozilla/5.0(Windows NT 10.0;Win64x64)applebwebkit/537.36(KHTML,像Gecko)Chrome/87 . 0 . 4280 . 88 Safari/537.36’
}
URL _ list=[' http://www . xici daili.com/nn/% r ' % I代表范围(1,10)中的I]
ip_list=[]
对于url_list:中的url
r=requests.get(url,headers=headers)
etree=lxml . html . from string(r . text)
IPS=etree . XPath('//tr[@ class=' odd ']')
对于ips:中的ip
IP=ip.xpath('//td/text()')
ip=IP[0] ':' IP[1]
ip_list.append(ip)
f=打开(' ip.txt ',' wb ')
f.write(','。加入(ip_list)。编码(' utf-8 ')
F.close(验证代理ip:通过网络访问验证代理IP的可用性和访问速度,从ip.txt文件中提取之前爬取的代理IP地址,分别尝试代理IP访问一个网站的主页,只保留响应时间在2秒以内的IP,保存在qip.txt中,代码如下:
# _*_编码:UTF-8 _*_
#发展作者:关中老玉米
#创作时间:2020年12月29日18:27
#文件名:身份验证代理IP。巴拉圭
#开发工具:PyCharm
导入请求
ip_list=open('ip.txt ')。读取()。拆分(',')
标题={ 0
用户代理' : ' Mozilla/5.0(Windows NT 6.1;Win64x64)applebwebkit/537.36(KHTML,像Gecko)Chrome/59 . 0 . 3071 . 115 Safari/537.36’
}
q
Url='https://www.baidu.com' #使用百度测试IP是否可以正常上网。
我在IP _ list: #设置超时为2秒,超时为不可用的IP。
r=requests.get(url,代理={'http': 'http://' ip[i]},标头=标头,超时=2)
if r.text:
qip.append(qip[i])
else:
继续
f=打开(' quality_ip.txt ',' wb ')
f.write(','。加入(quality_ip)。编码(' utf-8 ')
F.close()使用代理IP:建立IP代理池后,使用代理IP有两种方式。
# _*_编码:UTF-8 _*_
#由张杰开发
#创作时间:2020年12月31日18:03
#文件名:使用代理IP。巴拉圭
#开发工具:PyCharm
# (1)使用随机IP,代码如下:
随机导入
导入请求
ip_list=open('quality_ip.txt ')。读取()。拆分(',')
标题={ 0
用户代理' : ' Mozilla/5.0(Windows NT 10.0;Win64x64)applebwebkit/537.36(KHTML,像Gecko)Chrome/87 . 0 . 4280 . 88 Safari/537.36’
}
url='http://******** '
r=requests.get(url,代理={ ' http ' : ' http://' random . choice(IP _ list)},headers=headers)
# (2)由于自由代理时间限制短,后续抓取任务容易失败,所以当出现访问错误(响应码不等于200)时,更改IP,代码如下:
ip_list=open('qip.txt ')。读取()。拆分(',')
标题={ 0
用户代理' : ' Mozilla/5.0(Windows NT 10.0;Win64x64)applebwebkit/537.36(KHTML,像Gecko)Chrome/87 . 0 . 4280 . 88 Safari/537.36’
}
对于ip_list:中的ip
对于范围内的I(len(URL _ list)):
r=requests.get(url_list[i],代理={'http': 'http://' ip},标头=标头)
if r.status_code!=200:
Break教材不易编写,希望能帮助更多感兴趣的学习者,让工作学习顺利进行;请关注并转发。以后会有更多的源代码分享给更多的学习者使用。非常感谢
作者:关中老玉米
日期:2020年12月31日