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太少了,手工选的基本上是失效的!

——

猜你喜欢

转载自www.cnblogs.com/pu369/p/12402679.html