Python使用requests xpath 并开启多线程爬取西刺代理ip实例
我就废话不多说啦,大家还是直接看代码吧!
importrequests,random fromlxmlimportetree importthreading importtime angents=[ "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;AcooBrowser;.NETCLR1.1.4322;.NETCLR2.0.50727)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0;AcooBrowser;SLCC1;.NETCLR2.0.50727;MediaCenterPC5.0;.NETCLR3.0.04506)", "Mozilla/4.0(compatible;MSIE7.0;AOL9.5;AOLBuild4337.35;WindowsNT5.1;.NETCLR1.1.4322;.NETCLR2.0.50727)", "Mozilla/5.0(Windows;U;MSIE9.0;WindowsNT9.0;en-US)", "Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Win64;x64;Trident/5.0;.NETCLR3.5.30729;.NETCLR3.0.30729;.NETCLR2.0.50727;MediaCenterPC6.0)", "Mozilla/5.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0;WOW64;Trident/4.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;.NETCLR1.0.3705;.NETCLR1.1.4322)", "Mozilla/4.0(compatible;MSIE7.0b;WindowsNT5.2;.NETCLR1.1.4322;.NETCLR2.0.50727;InfoPath.2;.NETCLR3.0.04506.30)", "Mozilla/5.0(Windows;U;WindowsNT5.1;zh-CN)AppleWebKit/523.15(KHTML,likeGecko,Safari/419.3)Arora/0.3(Change:287c9dfb30)", "Mozilla/5.0(X11;U;Linux;en-US)AppleWebKit/527+(KHTML,likeGecko,Safari/419.3)Arora/0.6", "Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.2pre)Gecko/20070215K-Ninja/2.1.1", "Mozilla/5.0(Windows;U;WindowsNT5.1;zh-CN;rv:1.9)Gecko/20080705Firefox/3.0Kapiko/3.0", "Mozilla/5.0(X11;Linuxi686;U;)Gecko/20070322Kazehakase/0.4.5", "Mozilla/5.0(X11;U;Linuxi686;en-US;rv:1.9.0.8)GeckoFedora/1.9.0.8-1.fc10Kazehakase/0.5.6", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11", "Mozilla/5.0(Macintosh;IntelMacOSX10_7_3)AppleWebKit/535.20(KHTML,likeGecko)Chrome/19.0.1036.7Safari/535.20", "Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;fr)Presto/2.9.168Version/11.52", ] defget_all_xici_urls(start_num,stop_num): xici_urls=[] fornuminrange(start_num,len(stop_num)+1): xici_http_url='http://www.xicidaili.com/wt/' xici_http_url+=str(num) xici_urls.append(xici_http_url) print('获取所有待爬取xiciurl已完成...') returnxici_urls defget_all_http_ip(xici_http_url,headers,proxies_list): try: all_ip_xpath='//table//tr/child::*[2]/text()' all_prot_xpath='//table//tr/child::*[3]/text()' response=requests.get(url=xici_http_url,headers=headers) html_tree=etree.HTML(response.text) ip_list=html_tree.xpath(all_ip_xpath) port_list=html_tree.xpath(all_prot_xpath) #print(ip_list) #print(prot_list) new_proxies_list=[] forindexinrange(1,len(ip_list)): #print('http://{}:{}'.format(ip_list[index],port_list[index])) proxies_dict={} proxies_dict['http']='http://{}:{}'.format(str(ip_list[index]),str(port_list[index])) new_proxies_list.append(proxies_dict) proxies_list+=new_proxies_list returnproxies_list exceptExceptionase: print('发生了错误:url为',xici_http_url,'错误为',e) if__name__=='__main__': start_num=int(input('请输入起始页面:').strip()) stop_num=int(input('请输入结束页面:').strip()) print('开始爬取...') t_list=[] #容纳需要使用的西刺代理ip proxies_list=[] #使用多线程 xici_urls=get_all_xici_urls(start_num,stop_num) forxici_get_urlinxici_urls: #随机筛选一个useragent headers={'User-Agent':random.choice(angents)} t=threading.Thread(target=get_all_http_ip,args=(xici_get_url,headers,proxies_list)) t.start() t_list.append(t) forjint_list: j.join() print('所有需要的代理ip已爬取完成...') print(proxies_list) print(len(proxies_list))
补充知识:python爬取xici的免费代理、并验证(重点、清楚)
网上爬取xici的帖子很多,但是验证都说的不是很清楚,这里我会认真给大家解释
这里我写了一个代理类proxy,写了四个方法(个人写法不必在意),get_user_agent(得到随机use-agent,请求头中最重要的一个)、get_proxy(爬取代理IP)、test_proxy(验证代理可用性)、store_txt(将可用的代理保存到txt文件中。
1.爬取:headers是请求头,choice是可以选择是爬取Http代理还是https代理,first、end为开始和结束的页码(结束不包含最后一页)
defget_proxy(self,headers,choice='http',first=1,end=2): """ 获取代理 :paramchoice: :paramfirst:开始爬取的页数 :paramend:结束爬取的后一页 :return: """ ip_list=[] base_url=None #选择爬取的网站,一个是http、一个是https的 ifchoice=='http': base_url='http://www.xicidaili.com/wt/' elifchoice=='https': base_url='http://www.xicidaili.com/wn/' #控制页码用正则匹配,并将爬取的IP和端口号用:链接 forninrange(first,end): actual_url=base_url+str(n) html=requests.get(url=actual_url,headers=headers).text pattern='(\d+\.\d+\.\d+\.\d+)\s*(\d+)' re_list=re.findall(pattern,html) forip_portinre_list: ip_port=ip_port[0]+':'+ip_port[1] ip_list.append(ip_port) returnip_list \s*2.验证:网上大部分是用request直接请求一个网址看是否通过或者看状态码是否是200,但是有一个问题是即使你设置了代理IP。可能会通过,但通过的不是用你设置的代理IP而是用你自己公网下的IP(大部分时候我们用ifconfig查询的是我们所在局域网下的IP,及私网IP)。
linux下你可以用这些命令的其中任何一个查看你的公网IP:
curlicanhazip.com
curlifconfig.me
curlcurlmyip.com
curlip.appspot.com
curlipinfo.io/ip
curlipecho.net/plain
curlwww.trackip.net/i注意:那这样要怎么办,其实我们可以向上述命令一样先用你爬下的代理IP访问http://icanhazip.com/,它可以返回你电脑发送请求时的公网IP(此时如果你设置代理IP了就会是返回你所发送请求的代理IP),然后你将它爬取下来(直接获取返回的值的文本就可以了),并和你发送请求时的代理IP作比较,如果不相等说明此代理IP不能用,因为虽然你设置了代理Ip,但是电脑在你代理IP请求不同的情况下,直接又使用了你公网的IP去请求,当然成功了,但不代表你的代理IP可以用。如果相等,那就证明此网站就是你所用的代理IP访问请求成功的,所以此IP可用。
deftest_proxy(self,ip_port,choice='http'): """ 测试代理是否能用 :paramip_port: :paramchoice: :return: """ proxies=None #这个网站可以返回你公网下的IP,如果你加代理请求后,返回的就是你代理的IP(这样做是防止你虽然用的是代理IP,但实际是用你自己的公网IP访问的请求) tar_url="http://icanhazip.com/" #获取随机User-agent user_agent=self.get_user_agent() #将user-agent放在headers中 headers={'User-Agent':user_agent} #选择验证的是http、还是https ifchoice=='http': proxies={ "http":"http://"+ip_port, } elifchoice=='https': proxies={ "https":"https://"+ip_port, } try: #将IP从IP和端口号连起来的分出来 thisIP="".join(ip_port.split(":")[0:1]) res=requests.get(tar_url,proxies=proxies,headers=headers,timeout=8) #爬取下来返回的值,一定要用strip去除空格 proxyIP=res.text.strip() #三个状态,如过直接通不过,那就返回false,如果通过但是不是代理的IP,也返回false ifproxyIP==thisIP: returnproxyIP else: returnFalse except: returnFalse最后附上整段代码:
importrequests importre importrandom importcodecs fromurllibimportparse classproxy: """ 代理类 """ def__init__(self): pass defget_user_agent(self): """ 得到随机user-agent :return: """ user_agents=[ "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;AcooBrowser;.NETCLR1.1.4322;.NETCLR2.0.50727)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0;AcooBrowser;SLCC1;.NETCLR2.0.50727;MediaCenterPC5.0;.NETCLR3.0.04506)", "Mozilla/4.0(compatible;MSIE7.0;AOL9.5;AOLBuild4337.35;WindowsNT5.1;.NETCLR1.1.4322;.NETCLR2.0.50727)", "Mozilla/5.0(Windows;U;MSIE9.0;WindowsNT9.0;en-US)", "Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Win64;x64;Trident/5.0;.NETCLR3.5.30729;.NETCLR3.0.30729;.NETCLR2.0.50727;MediaCenterPC6.0)", "Mozilla/5.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0;WOW64;Trident/4.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;.NETCLR1.0.3705;.NETCLR1.1.4322)", "Mozilla/4.0(compatible;MSIE7.0b;WindowsNT5.2;.NETCLR1.1.4322;.NETCLR2.0.50727;InfoPath.2;.NETCLR3.0.04506.30)", "Mozilla/5.0(Windows;U;WindowsNT5.1;zh-CN)AppleWebKit/523.15(KHTML,likeGecko,Safari/419.3)Arora/0.3(Change:287c9dfb30)", "Mozilla/5.0(X11;U;Linux;en-US)AppleWebKit/527+(KHTML,likeGecko,Safari/419.3)Arora/0.6", "Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.2pre)Gecko/20070215K-Ninja/2.1.1", "Mozilla/5.0(Windows;U;WindowsNT5.1;zh-CN;rv:1.9)Gecko/20080705Firefox/3.0Kapiko/3.0", "Mozilla/5.0(X11;Linuxi686;U;)Gecko/20070322Kazehakase/0.4.5", "Mozilla/5.0(X11;U;Linuxi686;en-US;rv:1.9.0.8)GeckoFedora/1.9.0.8-1.fc10Kazehakase/0.5.6", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11", "Mozilla/5.0(Macintosh;IntelMacOSX10_7_3)AppleWebKit/535.20(KHTML,likeGecko)Chrome/19.0.1036.7Safari/535.20", "Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;fr)Presto/2.9.168Version/11.52", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/536.11(KHTML,likeGecko)Chrome/20.0.1132.11TaoBrowser/2.0Safari/536.11", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.1(KHTML,likeGecko)Chrome/21.0.1180.71Safari/537.1LBBROWSER", "Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;WOW64;Trident/5.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E;LBBROWSER)", "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;QQDownload732;.NET4.0C;.NET4.0E;LBBROWSER)", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.84Safari/535.11LBBROWSER", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.1;WOW64;Trident/5.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E)", "Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;WOW64;Trident/5.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E;QQBrowser/7.0.3698.400)", "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;QQDownload732;.NET4.0C;.NET4.0E)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SV1;QQDownload732;.NET4.0C;.NET4.0E;360SE)", "Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;QQDownload732;.NET4.0C;.NET4.0E)", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.1;WOW64;Trident/5.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E)", "Mozilla/5.0(WindowsNT5.1)AppleWebKit/537.1(KHTML,likeGecko)Chrome/21.0.1180.89Safari/537.1", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.1(KHTML,likeGecko)Chrome/21.0.1180.89Safari/537.1", "Mozilla/5.0(iPad;U;CPUOS4_2_1likeMacOSX;zh-cn)AppleWebKit/533.17.9(KHTML,likeGecko)Version/5.0.2Mobile/8C148Safari/6533.18.5", "Mozilla/5.0(WindowsNT6.1;Win64;x64;rv:2.0b13pre)Gecko/20110307Firefox/4.0b13pre", "Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:16.0)Gecko/20100101Firefox/16.0", "Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.11(KHTML,likeGecko)Chrome/23.0.1271.64Safari/537.11", "Mozilla/5.0(X11;U;Linuxx86_64;zh-CN;rv:1.9.2.10)Gecko/20100922Ubuntu/10.10(maverick)Firefox/3.6.10" ] user_agent=random.choice(user_agents) returnuser_agent defget_proxy(self,headers,choice='http',first=1,end=2): """ 获取代理 :paramchoice: :paramfirst:开始爬取的页数 :paramend:结束爬取的后一页 :return: """ ip_list=[] base_url=None ifchoice=='http': base_url='http://www.xicidaili.com/wt/' elifchoice=='https': base_url='http://www.xicidaili.com/wn/' forninrange(first,end): actual_url=base_url+str(n) html=requests.get(url=actual_url,headers=headers).text pattern='(\d+\.\d+\.\d+\.\d+)(\d+)' re_list=re.findall(pattern,html) forip_portinre_list: ip_port=ip_port[0]+':'+ip_port[1] ip_list.append(ip_port) returnip_list deftest_proxy(self,ip_port,choice='http'): """ 测试代理是否能用 :paramip_port: :paramchoice: :return: """ proxies=None #这个网站可以返回你公网下的IP,如果你加代理请求后,返回的就是你代理的IP(这样做是防止你虽然用的是代理IP,但实际是用你自己的公网IP访问的请求) tar_url="http://icanhazip.com/" user_agent=self.get_user_agent() headers={'User-Agent':user_agent} ifchoice=='http': proxies={ "http":"http://"+ip_port, } elifchoice=='https': proxies={ "https":"https://"+ip_port, } try: thisIP="".join(ip_port.split(":")[0:1]) res=requests.get(tar_url,proxies=proxies,headers=headers,timeout=8) proxyIP=res.text.strip() ifproxyIP==thisIP: returnproxyIP else: returnFalse except: returnFalse defstore_txt(self,choice='http',first=1,end=2): """ 将测试通过的ip_port保存为txt文件 :paramchoice: :paramfirst: :paramend: :return: """ user_agent=self.get_user_agent() headers={'User-Agent':user_agent} ip_list=self.get_proxy(headers=headers,choice=choice,first=first,end=end) withcodecs.open("Http_Agent.txt",'a','utf-8')asfile: forip_portinip_list: ip_port=self.test_proxy(ip_port,choice=choice) print(ip_port) ifip_port: file.write('\''+ip_port+"\'\n") 以上这篇Python使用requestsxpath并开启多线程爬取西刺代理ip实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
热门推荐
- 返回顶部
- 514930285
- czq8825@qq.com