有什么问题欢迎大家加QQ群:565712652进行讨论!

爬取西刺代理并验证代理的可用性

Python爬虫 Jason zhou 2736℃

今天我要分享的是如何爬取西刺代理并验证代理的可用性。大家在爬一些网站的时候,有时候爬取的频率过高,就会被网站封禁IP或者直接就被列入黑名单,造成无法访问。为了顺利能爬取到数据,我们这时候就需要通过更换IP来继续爬取。这里给大家提供一个免费的代理提供网站:西刺代理,本文就以如何爬取西刺代理网站上的国内高匿免费http代理IP并验证代理可用性进行讲解。

一,爬取代理IP

国内高匿代理的网址为:

http://www.xicidaili.com/nn/

点开网址后再查看一下网页源代码,你会发现IP数据都在table标签里的tr标签里面,由于包含IP数据的td标签没有标签属性,因此定位还是有点复杂。这里我们通过使用bs4库,把table标签中的tbody找出来,然后再用

find_all_next('tr')

方法把tr标签中的数据提取出来,最后用正则表达式把IP,端口信息,协议类型等信息提取出来。下面来看一下具体的代码:

def get_proxy():
    """
    获取代理列表
    :return: proies
    """
    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"}
    # url = 'http://www.xicidaili.com/'
    # 国内高代理
    url = 'http://www.xicidaili.com/nn/1'
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'html5lib')
    # table = soup.find('table', attrs={'id': 'ip_list'})

    # 提取ip
    proies = []
    for tr in soup.table.tbody.find_all_next('tr'):
        items = {}
        # 提取ip
        ip_pattern = "(\d+.\d+.\d+.\d+)
        ip = re.findall(ip_pattern, str(tr))
        if len(ip) == 0:
            pass
        else:
            items['ip'] = ip[0]

            # 提取端口号
            port_pattern = "<td>(\d+)</td>"
            port = re.findall(port_pattern, str(tr))
            items['port'] = port[0]
            scheme_pattern = "<td>(HTTPS?)</td>"
            scheme = re.findall(scheme_pattern, str(tr))
            items['scheme'] = str(scheme[0]).lower()

            proies.append(items)
      return proies

二,验证代理的可用性

基本思路就是通过代理去访问一个URL,如果能够访问成功的话就表明代理可用。这里我们用http.client(python2下是httplib)库来构造http请求,访问百度首页,看是否能成功访问。当然用requests库也行,具体代码:

def verifyproxy(proxies):
    """
    验证代理的有效性
    :param proxies:
    :return:
    """
    url = "http://www.baidu.com"
    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"}
    for item in proxies:
        ip = item['ip']
        port = item['port']
        try:
            conn = http.client.HTTPConnection(ip, port, timeout=5)
            conn.request(method='GET', url=url, headers=headers)

            print("代理可用:{}:{}".format(ip, port))

        # 请求出现异常
        except:
            print("代理不可用:{}:{}".format(ip, port))

完整代码地址:Github

转载请注明:志颖博客 » 爬取西刺代理并验证代理的可用性

喜欢 (6)or分享 (0)