使用pyhon获取代理ip

作者: 此间不留白 | 来源:发表于2017-11-30 22:13 被阅读67次

前言:
在用python爬取大规模数据时,由于用户的频繁访问可能造成对当前ip的封禁,那么就需要用到代理ip的技术,在本文中我们尝试构建一个代理ip池来解决这个问题。笔者爬去赶集网商品数据时,手动构建代理ip,但是这种方法非常不灵活,而且ip容易失效,不适合大规模的数据爬取,所以我们采用爬虫自动构建ip代理。
首先,访问西刺ip代理网站(该网站提供了API用来提取代理ip,但是访问失败!),分析网页数据,ip数据位于table标签中的td标签中,使用selector抽取数据如下

'table#ip_list > tr > td'

分析网页数据并不规律,所有数据都在<td>标签中, 不容易区分,仔细分析,发现不同的ip,端口及协议这些数据存在一定的规律,可以通过列表中构建字典解决这个问题,完整的代码如下:

import requests
from bs4 import BeautifulSoup


headers = {

    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) "
                 "AppleWebKit/537.36 (KHTML, like Gecko) "
                 "Chrome/62.0.3202.94 Safari/537.36",
    "Connection":"keep-alive"

}

def get_ips(url):
    ips_data = requests.get(url,headers=headers)
    soup_ips = BeautifulSoup(ips_data.text,'lxml')
    ips = soup_ips.select('table#ip_list > tr > td')

    i = 1    #ip在列表中首次出现的索引
    j = 2   #端口首次在列表中出现的索引
    k = 5  #协议首次在列表中出现的索引
    ips_list = []
    data = {}
    while(i < len(ips)):
        if ips[i]:
            data['ip'] = ips[i].text
        if ips[j]:
            data['port'] = ips[j].text
        if ips[k].text is not 'sock4/5':  #保证爬取的协议为 http或者https

            data['http_info'] = ips[k].text

        #第一个ip数据与第二个ip数据之间相差为8
        i = i + 8     
        j = j + 8
        k = k + 8
        if data['http_info'] != 'socks4/5':
   #构建合适的ip地址
  ips_list.append(data['http_info'].lower()+"://"+data['ip']+":"+data['port])
    return ips_list

url = "http://www.xicidaili.com/"
get_ips(url)

最后,爬取的部分结果显示如下:


ips.PNG

相关文章

网友评论

    本文标题:使用pyhon获取代理ip

    本文链接:https://www.haomeiwen.com/subject/mtbbbxtx.html