python 3 爬虫获取可用ip地址(小白)

        前几天刚刚把正则表达式看了一些,也是只是稍微懂了一点点,所以想要写一个简单的程序试一下。然后就想到了以前在找免费的代理的时候有好多不能用的,所以就尝试着写了一个这样的爬虫程序,写的不是很好,写的很复杂,等以后再去写简洁一些吧。

        先直接把代码弄上,然后再说一下里面的重点内容。

import re
import urllib.request
import  socket

def get_line(html):
    '''将对于ip有用的内容返回,返回值是列表!'''
    line_re = re.compile(r'(?:td>)(.+)(?:</td>)')
    list = line_re.findall(html)
    return list

def get_ip(html):
    '''得到所有的ip内容,以列表的形式返回!'''
    list = get_line(html)
    ip_re = re.compile(r'(?:25[0-5]\.|2[0-4]?\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b')
    ans_list = []
    list_len = len(list)
    str = ""
    for item in list:
        if ip_re.match(item) != None:
            ans_list.append(str)
            str = ''
            str += item
            continue
        if re.search('[\u4e00-\u9fa5]+',item) == None:
            str += '\t' + item
    return ans_list

def Judge_ip(ip_list):
    '''检查ip是否可以用......'''
    url = 'http://ip.chinaz.com/getip.aspx'
    f = open('E:\\python_py\output.txt', 'w')
    #socket.setdefaulttimeout(3)#设置爬取网页的时间限制,还有一种在面的open函数把timeout参数设置为3的方法
    for i in range(0,len(ip_list)):
        ip = ip_list[i].split('\t')
        if len(ip) == 3:
            try:
                proxy = {ip[2]: ip[0] + ':' + ip[1]}
                proxy_support = urllib.request.ProxyHandler(proxy)
                opener = urllib.request.build_opener(proxy_support)
                html = opener.open(url,timeout=3).read()
                f.write(ip_list[i] + '\n')
            except Exception as e:
                print ('代理 '+ ip[0]+' 不可用' )
                continue
    f.close()

if __name__ == '__main__':
    url = 'http://www.xicidaili.com/'
    rep = urllib.request.Request(url)
    rep.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36')
    reponse = urllib.request.urlopen(rep)
    html = reponse.read().decode('utf-8')
    ip_list = get_ip(html)
    Judge_ip(ip_list)


用到的正则表达式内容:

ip_re = re.compile(r'(?:25[0-5]\.|2[0-4]?\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b')
line_re = re.compile(r'(?:td>)(.+)(?:</td>)')
re.search('[\u4e00-\u9fa5]+',item)
ip_re 表示的是匹配一个代理IP地址


        我们发现在IP地址的有用的信息两边都存在着<td>和<\td>所以就先把这个之间的内容提取出来,对应着正则表达式:line_re  的内容


第三个是匹配其中是否含有汉字信息,我们这里匹配的内容是IP地址,IP端号,以及IP类型,我们发现除了这三个内容之外,别的都是存在汉字的,所以我们需要把有用的信息提取出来,这个就是这个正则表达式的作用


    在后面测试表达式是否可用的里面:


我们判断如果连接尝试的阻塞等待时间大于 3 秒的话,我们就认为这个IP地址有问题,所以就被异常所捕获,继续判断后面的IP地址是否可用.......


判断IP可用的使用的网站是:


http://ip.chinaz.com/getip.aspx

    然后将可以使用的IP地址写入文件即可


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值