python selenium 代理ip,python用随机代理ip访问网页
前言:我经常抓取网站,总怕突然返回一个不是200的状态码。要么是网络不好,要么是我被倒爬了。不过大部分网站都挺“友好”的,只是难免会被网站屏蔽ip,于是就想到了yxdsb说的代理IP池。大家学习学习,自己来一个完整的。好了,我们开始吧。
思路1:分析网页获取ip 2:确定ip是否有效3:访问代理ip 1:存储数据2:读取数据/使用数据汇总附录A:完整代码B:附上部分数据。
思考
IP代理池的建立和使用需要实现以下功能
找到合适的网站代理ip (Westthorn Proxy)解析网页获取ip判断ip是否有效读写数据。1.解析网页以获得ip分析。如下,我们知道ip信息存在于tr标签中。首先,使用xpath解析网页。代码如下:root . XPath(//tr[@ class= ]/tr[@ class= odd ]。
然后处理每个tr块并解析出我们需要的信息。我需要它的ip地址、端口号和服务器类型,代码如下
IP _ address=tr . XPath( TD[2]/text())[0]# IP地址IP _ port=tr . XPath( TD[3]/text())[0]# IP端口号IP _ protocol=tr . XPath( TD[6]/text://{ }:{ } 。format (ip _ protocol,ip _ address,ip _ port)这样我们就得到我们需要的IP,但是大部分可能都没用,所以我们要一个一个的验证,然后就是下一步:判断ip是否有效。
二。判断ip是否有效。我会用百度的网站(https://www.baidu.com/)来验证,通过访问网站返回的状态码来确认ip是否有效。代码如下所示
response=requests . get(URL= https://www . Baidu . com/,headers=headers,proxies=proxies,time out=30)if response . status _ code==200:print(Proxies,OK )返回TRUE ELSE:返回FALSE注:Proxies是一个字典,格式为:{服务器类型:完整IP}
三。访问代理ip (I)用有效的ip数据保存数据,当然我们要保存。想想我们的目的是什么:发出紧急声音,为什么要用:放很多代理IP,哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦
# add data def write _ Excel(Excel filepath,Values):data=open pyxl . load _ workbook(Excel文件路径)table=data . activen rows=table . max _ row #获取行数#注意,行和列下标是针对range中的I(1,Len(values) 1): # row针对range中的J(1,Len(Values[I-1])1):# column table . cell(nrows I,J)。value=values[I-1][j-1]data . save(Excel文件路径)(2)我们是真正的读取/使用数据的人。如果你保存了数据,你必须使用它。不用也可以等它坏掉。这里写一个函数返回一个ip_list,方便下次使用代理ip。代码如下:
# read excel def read _ excel (excel文件路径,sheet name):workbook=open pyxl . load _ workbook(excel filepath)sheet=workbook[sheet name]# print(sheet . rows[0]。value) ip_list=[]用于工作表中的行。rows: IP _ list.append ([row [0]。值,第[1]行。value]) return IP _ list [1:] #构建并使用简单代理IP池。虽然比较初级,但现阶段应该够用了,以后会逐步完善。你喜欢这个代码吗
附录A.完整代码来自lxml import etreeimport openpyxlheaders={ User-Agent : Mozilla/5.0(Windows NT 10.0;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/78。0 .3904 .108 Safari/537.36 } excel文件路径= IP _ file。xlsx 工作表名称=工作表1 #获取IP def getinfo(URL):html=requests。get(URL=URL,headers=headers,time out=30)# print(html。状态代码)root=etree .HTML(html.content) ip_list=[] #测试:仅爬取每页前五ip,真正爬取时可放宽对于根中的tr。XPath(//tr[@ class= ]//tr[@ class= odd ])[1:5]:IP _ address=tr。XPath( TD[2]/text())[0]# IP地址IP _ port=tr。XPath( TD[3]/text())[0]# IP端口号IP _协议=tr。XPath( TD[6]/text())[0]# IP网络协议ip={}://{}:{} .格式(ip协议,ip地址,ip端口)代理={ip协议:ip} #有用则收录起来if verify _ IP(代理):IP _ list。append([IP _ protocol,IP])write _ excel(excel file path=excel file path,values=ip_list) #写入数据# 验证互联网协议(互联网协议的缩写)有效def verify _ IP(代理):响应=请求。获取(URL= https://www。百度一下。com/,头=头,代理=代理,超时=30)如果响应。status _ code==200:print(代理, OK )返回True else:返回错误#追加填写数据def write_excel(excelFilePath,values):data=open pyxl。load _ workbook(excel file path)table=data。活动nrows=表。最大行数获得行数# 注意行列下标是从一开始的对于范围内的I(1,len(值)1): #行对于范围(1、len(值[i - 1]) 1中的j:#列table.cell(nrows i,j).value=values[I-1][j-1]数据。保存(excel文件路径)#写入超过表头def write _ excel _ title(excel file path,sheetName,datas):index=len(datas)workbook=open pyxl .工作簿()工作表=工作簿。活动工作表。title=范围(0,index)中I的工作表名称:范围(0,len(datas[I])中j的工作表名称:sheet。cell(row=I 1,column=j 1,value=str(datas[I][j]))工作簿。保存(excel文件路径)打印(表头写入成功!)# 读出excel def read _ excel(excel file path,工作表名称):workbook=open pyxl。load _ workbook(excel file path)sheet=workbook[工作表名称]# print(sheet。第[0]行.value) ip_list=[],用于床单。行:IP _ list。追加([行[0].值,第[1]行.值])返回ip_list[1:] #剔除表头# 翻页def nextPage(url_model): #获取前10页的代理范围(1,10)中我的IP:URL=URL _ model。格式(I)getinfo(URL)if _ _ name _ _= _ _ main _ _ :# URL模式化URL _ model _ list=[ https://www。西祠戴笠。com/nn/{ } ,#国内高匿代理https://www.xicidaili.com/nt/{} ,#国内普通代理https://www.xicidaili.com/wn/{} ,#国内安全超文本传输协议代理https://www.xicidaili.com/wt/{} ,#国内超文本传送协议(超文本传输协议的缩写)代理] # 写入表格标题重置表格write _ excel _ title(excel file path=excel file path,sheetName=sheetName,datas=[[Http/https , ip_address]]) 多线程实现,四个网站同步爬取,尚未完成 下一页(url_model_list[0])下一页(url _模型_列表[1])下一页(url _模型_列表[2])下一页(url_model_list[3]) #代理互联网协议(互联网协议的缩写)的使用ip_list:打印(ip) B中互联网协议(Internet Protocol的缩写)的IP _ list=read _ excel(excel file path=excel file path,sheetName=sheetName)附上部分数据本来是想着附上所有数据来着的,但一来数据太大,二来这个代理互联网协议(互联网协议的缩写)的有效期更新太快,附上部分代码,仅供参考,大家多多包含
[["HTTP "、" HTTP "、" HTTP://117。69 .200 .21:9999"]["HTTPS "、" HTTPS "、" https://182。35 .83 .20:9999"]["http "、" http "、" http://117。95 .195 .110:9999"]["http "、" http "、" http://27。43 .184 .101:9999"]["http "、" http://114。239 .2 .162:808"]["http "、" http://182。35 .87 .41:9999"]["http "、" http://182。35 .81 .182:9999"]["https "、" https "
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。