python-关于代理IP的测试
之前在网上找到代理IP和端口,填在浏览器中代理服务器设置选项中,总是不能成功联网。
今天想试试端口转发,先是用windows自带的netsh
netsh interface portproxy add v4tov4 listenport=80 listenaddress=myserver connectport=80 connectaddress=www.baidu.com netsh interface portproxy show all netsh interface portproxy delete v4tov4 listenport=80 listenaddress=myserver protocol=tcp
测试发现只能转发TCP,而不能转发http
又找到PortMap1.6,真的也很好用,也可实现http端口转发。但发现不符合我的需求,我是想找网的代理IP,用于访问网站。最后在这里https://blog.csdn.net/qq_45097959/article/details/97303034?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
import requests from lxml import etree import time from multiprocessing import Pool import multiprocessing import sys def get_single(url): #爬出单页上的所有代理ip r=requests.get(url,headers=head) if r.status_code==503: print('由于爬取次数过多,你的Ip已经被封') sys.exit(0) content=etree.HTML(r.text) ip=content.xpath('//table[@id="ip_list"]/tr/td[2]/text()') duankou=content.xpath('//table[@id="ip_list"]/tr/td[3]/text()') for i in range(0,len(ip)): ip_list.append(ip[i]+":"+duankou[i]) def input_urls(): #防止ip被封每三秒访问一页 for i in range(1,21): get_single(url+str(i)) print('爬取第'+str(i)+'页\r',end="") time.sleep(3) def verify_ips(ip,ip_valid_list): #验证代理ip poxie="http://"+ip proxies={ 'http':poxie, 'https':poxie } try: requests.get('https://www.baidu.com',headers=head,proxies=proxies,timeout=3) ip_valid_list.append(ip) except Exception as e : print(e) ip_list=[] url="https://www.xicidaili.com/nn/" head={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'} if __name__ == "__main__": print( """ 程序结束后会在当前文件夹生成一个ip_proxies_valid.txt文件, 防止ip被封,控制爬取频率 """ ) mlist=multiprocessing.Manager() ip_valid_list=mlist.list() input_urls() print("总共爬取到"+str(len(ip_list))+"个ip,接下来准备验证ip有效性") print("验证倒计时3s") time.sleep(1) print("验证倒计时2s") time.sleep(1) print("验证倒计时1s") time.sleep(1) print("开始验证!") p=Pool(15) for ip in ip_list: p.apply_async(verify_ips,(ip,ip_valid_list)) #多进程验证 p.close() p.join() f=open('ip_proxies_valid.txt','a') for ip in ip_valid_list: #写入txt文件 f.write(ip) if ip!=ip_valid_list[-1]: f.write('\n') f.close() print("完成")
抓取2000多个IP,经验证仅5个有效。
填入浏览器的代理服务器设置中,可以成功访问。从baidu.com查找myip,显示为广东的IP。
终于明白以前为什么总不成功!因为有效IP太少了,手工选的基本上是失效的!
——