大家好,我是讯享网,大家多多关注。
一.网页检查
西祠代理网下的国内高隐藏部分是一个很简单的get请求,唯一改变的是url:
第一页的网址是:https://www.xicidaili.com/nn/1
第二页的网址是:https://www.xicidaili.com/nn/2
界面如下,非常规整友好。让我们开始写代码。
私人菜鸟007获取本案源代码!
#定义一个main函数def main(): #输入一个固定参数URL = ‘ https://www.xicidaili.com/nn/’start _页面= int(输入(‘ N请输入起始页码:’))end_page = int(输入(‘ N请输入结束页码:’))items = [] #为范围内的页面(start _ page,end _ page+1)建立一个将任意页面爬行到某一页面的循环:print(‘ N { }页面开始爬行’。format(page)) #拼接的网页url_new = url+str(page)+’/’ #请求的网页,获取响应-实现响应= req_res (URL _ new) #通过构造函数解析响应:req _ RES-实现items = parse_res (response,items) #休眠5s time.sleep(2) print(‘ Page n {}结束抓取’。format(page))# Save data df = PD . data frame(items)df . to _ CSV(‘ IP _ data . CSV ‘,index = false,sep = ‘,’,encoding =’ utf-8-sig’) print(‘)
2.拼接URL
这一步只需要一行代码,所以直接写在main函数里。
# splice URL URL _ new = URL+str(page)+’/’
3.请求网页并获得响应。
主函数要尽量简洁,复杂的代码要通过定义函数来实现。这里第二步(即请求网页)和第三步(即获取响应)的代码比较多,是通过建立函数:req_res来实现的由于已经引入了urllib库,所以这里使用的是requests库。代码如下:
#构建请求函数并返回响应def req_res(url): #构建请求函数的第一步——构建头信息user _ agent = [“Mozilla/5.0(兼容;MSIE 9.0Windows NT 6.1三叉戟/5.0)”、“Mozilla/4.0(兼容;MSIE 8.0Windows NT 6.0Trident/4.0)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 6.0)”、“Mozilla/4.0(兼容;MSIE 6.0Windows NT 5.1)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1傲游2.0)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1腾讯旅行者4.0)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1世界)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1Avant浏览器)”、“Mozilla/4.0(兼容;MSIE 7.0Windows 5.1)”,]user _ agent = random . choice(user _ agent)headers = { ‘ user-agent ‘:user _ agent } #构建请求函数的第二步——构建代理池#本文是对代理池进行爬网,这里省略#发起请求,Get response = requests . Get(URL,headers = headers)。text # return response返回响应
4.解析函数
获得响应后,就该解析响应了。这也是通过建立函数来实现的。还是用bs4。
代码如下:
#构建一个解析函数,返回数据(字典格式)def parse _ res (response,items): soup = bs (response) #首先取出所有存储所需数据的地方-< tr & gt;& lt/tr & gt;tr _ list = soup . select(‘ # IP _ list & gt;Tr’)[1:] #通过遍历Tr列表取出所需数据——这里把所有的演示都取出来了,实际上只需要tr _ list中tr的ip地址和端口:# get IP address IP _ add = tr . select(‘ TD ‘)[1]。text # get port port = tr . select(‘ TD ‘)[2]。text # get server address server _ add = tr . select(‘ TD ‘)。[3].text.strip() #获取匿名信息anonymous _ type = tr . select(‘ TD ‘)[4]。text # Get http type http _ type = tr . select(‘ TD ‘)[5]。Text #获取连接速度SPEED SPEED = tr . select(‘ TD ‘)[6]SPEED = SPEED . div . attrs[‘ title ‘][:-1]#获取连接时间time _ co = tr . select(‘ TD ‘)[7]time _ co = time _ co . div . attrs[‘ title ‘][:-1]#采集时间_ ar = tr。选择(‘ TD’) [8]。text #采集验证时间_ pr = tr。选择(‘ TD’) [9]。text #将上述数据输入字典item = {‘IP address’: ip_add,’ port’: port,Server address’: server_add,’匿名信息’:anonymous_type,’ type’: http_type,’连接速度’:速度,’连接时间’:time_co,’ lifetime’: time_ar,’验证时间’:time _ pr} items.append(
5.保存数据
这里的代码也比较少,直接写在main函数里。
#以CSV格式保存数据df = PD . data frame(items)df . to _ CSV(‘ IP _ data . CSV ‘,index = false,sep = ‘,’,encoding =’ UTF-8-sig’)
6.完全码
这样一个完整的抓取代理IP的程序代码就完成了。完整的代码如下:
导入请求导入熊猫as PD从bs4导入随机导入时间导入美汤as bs #构建请求函数并返回响应def req_res(url): #构建请求函数的第一步——构建头信息user _ agent = [“Mozilla/5.0(兼容;MSIE 9.0Windows NT 6.1三叉戟/5.0)”、“Mozilla/4.0(兼容;MSIE 8.0Windows NT 6.0Trident/4.0)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 6.0)”、“Mozilla/4.0(兼容;MSIE 6.0Windows NT 5.1)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1傲游2.0)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1腾讯旅行者4.0)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1世界)”、“Mozilla/4.0(兼容;MSIE 7.0Windows NT 5.1Avant浏览器)”、“Mozilla/4.0(兼容;MSIE 7.0Windows 5.1)”,]user _ agent = random . choice(user _ agent)headers = { ‘ user-agent ‘:user _ agent } #构建请求函数的第二步——构建代理池#本文是对代理池进行爬网,这里省略#发起请求,Get response = requests.get (URL,headers = headers)。text # return response return response #构建解析函数,并返回数据(字典格式):def parse _ res (response,items): soup = bs (response) #先取出所需数据的所有存储位置-< tr & gt;& lt/tr & gt;tr _ list = soup . select(‘ # IP _ list & gt;Tr’)[1:] #通过遍历Tr列表取出所需数据——这里把所有的演示都取出来了,实际上只需要tr _ list中tr的ip地址和端口:# get IP address IP _ add = tr . select(‘ TD ‘)[1]。text # get port port = tr . select(‘ TD ‘)[2]。text # get server address server _ add = tr . select(‘ TD ‘)。[3].text.strip() #获取匿名信息anonymous _ type = tr . select(‘ TD ‘)[4]。text # Get http type http _ type = tr . select(‘ TD ‘)[5]。Text #获取连接速度SPEED SPEED = tr . select(‘ TD ‘)[6]SPEED = SPEED . div . attrs[‘ title ‘][:-1]#获取连接时间time _ co = tr . select(‘ TD ‘)[7]time _ co = time _ co . div . attrs[‘ title ‘][:-1]#采集时间_ ar = tr。选择(‘ TD’) [8]。text #采集验证时间_ pr = tr。选择(‘ TD’) [9]。text #将上述数据输入字典item = {‘IP address’: ip_add,’ port’: port,Server address’: server_add,’ anonymous information ‘:anonymous _ type,’ type’: http_type,’ connection speed’: speed,’ connection time’: time_co,’ survival time’: time_ar,Verification time ‘:time _ pr } items . append(item)# return data return items #定义一个主函数def main(): #输入一个固定参数URL = ‘ https://www.xicidaili.com/nn/’start _ page = int(‘ N请输入起始页码:’)end _ page = int (input(‘) n请输入结束页码:’))items = [] #建立一个循环,将任意页面搜索到范围内的页面(start _ page,end _ page+1): print (‘ Page n {}开始搜索’。 format(page)) #拼接的网页url_new = url+str(page)+’/’ #请求的网页,获取响应-实现响应= req_res (URL _ new) #通过构造函数解析响应:req _ RES-实现items = parse_res (response,items) #休眠5s time.sleep(2) print(‘ Page n {}结束抓取’。format(page))# Save data df = PD . data frame(items)df . to _ CSV(‘ IP _ data . CSV ‘,index = false,sep = ‘,’,encoding =’ utf-8-sig’) print(‘)
第三,爬成绩
运行上面的代码,Westthorn Agent每页显示100条IP消息。这里以抓取前50页的5000条IP消息为例。结果如下:
打开本地保存的CSV文件,如下所示。可以看到,5000条信息全部被成功抓取。
四。IP验证
虽然IP被拿下来了,但还不能确定能不能用。其实代理IP一般都是收费的,免费的东西自然不好。不出意外的话,被拿下的IP大部分无法使用,需要验证。
这里提供了两种方法:
1.用python。由于使用了第二种方法,这里只提供第一种方法的想法。使用requests库的代理方法访问一个网页,通过判断请求的响应码是否为200(这里要加一个响应时间)来判断ip是否可用。如果响应代码是200,则保留它,否则丢弃它。显然,这种方法是浪费时间。
2.安装完成后,可以使用一款名为花穗代理的软件,直接批量检查抓取的IP是否可用。在这里,该软件用于检查刚刚爬下来的5000个IP。
首先通过下面的代码传递刚刚爬下来的数据:导出IP地址和端口信息,保存为txt格式(这个软件识别txt)。代码如下。
导入pandas为PD data = PD . read _ CSV(r ‘ c: Users zhche Desktop IP _ data . CSV ‘,sep= ‘,’,encoding = ‘ utf-8-SIG ‘)lists = data . values . to list()for list:IP = list[0]port = list[4]proxy = str(IP)+’:’+str(port)with open(‘ IP . txt ‘,’ a ‘,encoding = ‘ utf-8 ‘)as f:f . write(proxy+’ n ‘)
运行后,找到本地保存的txt,如下所示:
然后,将txt文件导入代理软件,点击“全部验证”,结果如下。
没有错,5000个IP中只有3个能用,得出了一个合理的结论——便宜但不好。
所以我们通常需要用数量来代替这个不足,通过抓取几万个IP来搜索几个有用的。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/37289.html