Python爬虫——打造个人IP代理池_python

 


import urllib.request
import urllib
import requests
import re
import time
import random

proxys = []

def show_interface():
    choice=input("请选择功能:1.显示可用代理;2.显示可用代理并生成文本;3.退出系统:")
    return choice

def get_proxyIP():
    ip_title=[]#IP列表
    try:
        page_num=input('想要爬取多少个代理IP页面(注:每个页面包含100个IP地址,输入数值大于等于2,小于等于705):')
        if int(page_num)<2 or int(page_num)>705:
            print(">>>>>已经说明清楚了,再乱输的是傻逼   o -_-)=○)°O°) 给你一拳!")
            return ip_title
        else:
            for i in range(1,int(page_num)):
                url='http://www.xicidaili.com/nt/'+str(i)
                headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"}
                request=urllib.request.Request(url=url,headers=headers)
                response=urllib.request.urlopen(request)
                content=response.read().decode('utf-8')
                pattern=re.compile('<td>(\d.*?|HTTP|HTTPS)</td>')
                ip_page=re.findall(pattern,str(content))
                ip_title.extend(ip_page)
                time.sleep(random.choice(range(1,3)))
            print('代理IP地址              ','\t','端口','\t','类型','\t\t\t','存活时间','\t\t','验证时间')
            for i in range(0,len(ip_title),5):
                if len(ip_title[i])<14 and len(ip_title[i])>10:
                    print(ip_title[i],'           ','\t',ip_title[i+1],'\t',ip_title[i+2],'\t\t\t',ip_title[i+3],'\t\t',ip_title[i+4])
                elif len(ip_title[i])<=10:
                    print(ip_title[i], '             ', '\t', ip_title[i + 1],'\t', ip_title[i + 2],'\t\t\t', ip_title[i + 3],'\t\t',ip_title[i+4])
                else:
                    print(ip_title[i],'          ','\t',ip_title[i+1],'\t',ip_title[i+2],'\t\t\t',ip_title[i+3],'\t\t',ip_title[i+4])
            return ip_title
    except ValueError:
        print(">>>>>已经说明清楚了,再乱输的是傻逼   o -_-)=○)°O°) 给你一拳!")
        return ip_title

proxy_ip=open('proxy_ip.txt','w')#新建文档存储有效IP

def effective_IP(ip_title):
    socket.setdefaulttimeout(5)#设置全局超时时间
    url='https://www.cnblogs.com/sjzh/p/5990152.html'
    try:
        for i in range(0,len(ip_title),5):
            ip={ip_title[i+2]:ip_title[i]+":"+ip_title[i+1]}
            proxy_support=urllib.request.ProxyHandler(ip)
            opener=urllib.request.build_opener(proxy_support)
            opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64)')]
            urllib.request.install_opener(opener)
            res=urllib.request.urlopen(url).read()
            print(ip_title[i]+':'+ip_title[i+1],'is OK')
            proxy_ip.write('%s\n'%str('\''+ip_title[i+2]+'\''+':'+'\''+ip_title[i]+':'+ip_title[i+1]+'\''))#写入IP
        print('总共爬取了'+str(len(ip_title)/5)+'个有效IP')
    except Exception as e:
        print(i,e)

if __name__=='__main__':
    print('                                                                                                                      ')
    print('                                                                                                                      ')
    print('        ◆◆     ◆◆◆◆◆             ◆◆◆◆◆◆◆◆◆◆◆◆◆◆                                                  ')
    print('        ◆◆      ◆◆  ◆◆◆              ◆    ◆◆    ◆      ◆          ◆◆◆◆        ◆◆◆◆◆◆◆          ')
    print('        ◆◆        ◆      ◆◆            ◆    ◆      ◆      ◆           ◆◆◆           ◆◆◆◆◆◆◆◆      ')
    print('      ◆◆◆        ◆      ◆◆◆          ◆    ◆◆◆◆◆◆◆◆◆            ◆◆            ◆◆    ◆◆◆◆      ')
    print('      ◆◆◆◆◆◆◆◆◆◆◆◆◆◆          ◆    ◆      ◆      ◆            ◆◆            ◆◆      ◆◆◆      ')
    print('    ◆◆◆          ◆◆                    ◆    ◆      ◆      ◆            ◆◆            ◆◆    ◆◆◆◆      ')
    print('    ◆◆◆          ◆◆                ◆◆◆◆◆◆◆    ◆    ◆◆            ◆◆            ◆◆◆◆◆◆◆        ')
    print('    ◆  ◆          ◆◆                    ◆    ◆◆◆◆◆◆◆◆◆            ◆◆            ◆◆◆◆◆◆          ')
    print('        ◆          ◆◆                    ◆            ◆                    ◆◆            ◆◆                  ')
    print('        ◆            ◆◆                  ◆            ◆                    ◆◆            ◆◆                  ')
    print('        ◆            ◆◆      ◆          ◆    ◆◆◆◆◆◆◆◆◆            ◆◆            ◆◆                  ')
    print('        ◆            ◆◆◆  ◆◆          ◆◆◆        ◆                ◆◆◆◆◆      ◆◆◆◆◆◆              ')
    print('        ◆              ◆◆  ◆◆        ◆◆◆◆        ◆                                                          ')
    print('        ◆                ◆◆◆◆    ◆◆◆◆  ◆◆◆◆◆◆◆◆◆◆◆                                                ')
    print('        ◆                  ◆◆                                                                                      ')
    print('')
    print('')
    choice = show_interface()
    while True:
        if choice=='1':
            get_proxyIP()
            i=input(">>>>>还想继续使用该系统?(Y/N):")
            if i=='Y' or i=='y':
                choice=show_interface()
            else:
                print('>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ')
                break

        if choice=='2':
            ip_title=get_proxyIP()
            effective_IP(ip_title)
            i = input(">>>>>还想继续使用该系统?(Y/N):")
            if i == 'Y' or i == 'y':
                choice = show_interface()
            else:
                print('>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ')
                break
        if choice=='3':
            print('>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ')
            break
 import requests
import parsel
import time

def check_ip(proxies_list):
    """检测ip的方法"""
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

    can_use = []
    for proxy in proxies_list:
        try:
            response = requests.get('http://www.baidu.com', headers=headers, proxies=proxy, timeout=0.1)  # 超时报错
            if response.status_code == 200:
                can_use.append(proxy)
        except Exception as error:
            print(error)
    return can_use
import requests
import parsel

# 1、确定爬取的url路径,headers参数
base_url = 'https://www.kuaidaili.com/free/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

# 2、发送请求 -- requests 模拟浏览器发送请求,获取响应数据
response = requests.get(base_url, headers=headers)
data = response.text
# print(data)

# 3、解析数据 -- parsel  转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
# 3、1 转换python可交互的数据类型
html_data = parsel.Selector(data)
# 3、2 解析数据
parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr') # 返回Selector对象
# print(parse_list)

# 免费 IP  {"协议":"IP:port"}
# 循环遍历,二次提取
proxies_list = []
for tr in parse_list:
    proxies_dict = {}
    http_type = tr.xpath('./td[4]/text()').extract_first()
    ip_num = tr.xpath('./td[1]/text()').extract_first()
    port_num = tr.xpath('./td[2]/text()').extract_first()
    # print(http_type, ip_num, port_num)

    # 构建代理ip字典
    proxies_dict[http_type] = ip_num + ':' + port_num
    # print(proxies_dict)
    proxies_list.append(proxies_dict)

print(proxies_list)
print("获取到的代理ip数量:", len(proxies_list), '个')

# 检测代理ip可用性
can_use = check_ip(proxies_list)
print("能用的代理:", can_use)
print("能用的代理数量:", len(can_use))

Python爬虫——打造个人IP代理池_编程_02