IP代理池的Python实现

原创 2015年11月19日 09:19:51

爬虫采集数据时,如果频繁的访问某个网站,会被封IP,有些是禁止访问3小时,有些是直接拉黑名单。为了避免被禁,一般采取的措施有三种:

  1. 放慢抓取的速度,设置一个时间间隔;
  2. 模拟浏览器行为,如采用Selenium + PhantomJS;
  3. 设置IP代理,定期更换代理IP,让网站不认为来自一个IP。

本文实现其中的第三种方法。
国内提供IP代理的网站有很多,我们以其中的一个为例:http://www.haodailiip.com
分为三步来实现这个IP抓取类:

  1. 解析网页中的IP和端口
  2. Ping所有IP地址的连接速度
  3. 按速度从快到慢排序,保存到文件

一、解析网页中的IP和端口

抓取网页采用的是 urlib + BeautifulSoup
解析网站:http://www.haodailiip.com/guonei/page,page=1,2…,10

def parse(url):
        try:
            page = urllib.urlopen(url)
            data =  page.read()
            soup = BeautifulSoup(data, "html5lib")
            print soup.get_text()
            body_data = soup.find('table', attrs={'class':'content_table'})
            res_list = body_data.find_all('tr')
            for res in res_list:
                each_data = res.find_all('td')
                if len(each_data) > 3 and not 'IP' in each_data[0].get_text() and '.' in each_data[0].get_text():
                    print each_data[0].get_text().strip(), each_data[1].get_text().strip()
                    item = IPItem()
                    item.ip = each_data[0].get_text().strip()
                    item.port = each_data[1].get_text().strip()
                    item.addr = each_data[2].get_text().strip()
                    item.tpye = each_data[3].get_text().strip()
                    self.ip_items.append(item)
        except Exception,e:
            print e

BeautifulSoup默认的解析器是lxml,但对于这个网址,发现网页内容解析的不完整,于是用了解析性最好的 html5lib,速度上会稍慢。
关于BeautifulSoup解析器的介绍见http://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#id9
BS解析的过程是:
* 先找到table class=”content_table”的标签;
* 在从上面的内容中找所有tr
* 我们需要的信息在tr的td中
* 结果存入IPItem类。

IPItem的定义

class IPItem:
    def __init__(self):
        self.ip = ''    # IP
        self.port = ''  # Port
        self.addr = ''  # 位置
        self.tpye = ''  #类型:http; https
        self.speed = -1 #速度

二、Ping所有IP地址的连接速度

import pexpect
def test_ip_speed(ip_items):
    tmp_items = []
    for item in ip_items:

        (command_output, exitstatus) = pexpect.run("ping -c1 %s" % item.ip, timeout=5, withexitstatus=1)
        if exitstatus == 0:
            print command_output
            m = re.search("time=([\d\.]+)", command_output)
            if m:
                print 'time=', m.group(1)
                item.speed = float(m.group(1))
                tmp_items.append(item)

   ip_items = tmp_items

主要是利用pexpect模块调用系统的ping命令,上面代码在mac 10.11.1下测试通过。

三、按速度从快到慢排序,保存至文件

保存至文件利用pandas模块,只需一句代码即可搞定。
1. 先把ip_items转换成pandas的DataFrame;
2. 排序,df.sort_index(),按’Speed’列排序;
3. 结果写入Excel文件,to_excel()

def save_data(self):
        df = DataFrame({'IP':[item.ip for item in ip_items],
                        'Port':[item.port for item in self.ip_items],
                        'Addr':[item.addr for item in self.ip_items],
                        'Type':[item.tpye for item in self.ip_items],
                        'Speed':[item.speed for item in self.ip_items]
                        }, columns=['IP', 'Port', 'Addr', 'Type', 'Speed'])
        print df[:10]
        df['Time'] = GetNowTime()
        df = df.sort_index(by='Speed')

        now_data = GetNowDate()


        file_name = self.dir_path +'ip_proxy_' + now_data + '.xlsx'

        df.to_excel(file_name)

生成的excel文件如下:
results

Python爬虫IP代理池的建立和使用

采用IP代理的方法避免短时间大量访问某网站服务器导致IP被封的情况,包括从网上抓取代理IP和端口以及验证其有效性。...
  • sinat_22594309
  • sinat_22594309
  • 2016年12月03日 13:37
  • 7577

python3中requests中使用ip代理池随机生成ip

版权声明:本文为博主原创文章,未经博主允许不得转载。
  • qq_39248703
  • qq_39248703
  • 2017年06月29日 10:24
  • 2719

python开源IP代理池--IPProxys

转载:http://www.cnblogs.com/qiyeboy/p/5693128.html 今天博客开始继续更新,谢谢大家对我的关注和支持。这几天一直是在写一个ip代理池的开源项目。通过前...
  • xfyangle
  • xfyangle
  • 2017年03月13日 13:55
  • 851

python爬虫代理IP池(proxy pool)

1.今天我们来讲下一个非常有用的东西,代理ip池,结果就是一个任务每隔一定时间去到 目标ip代理提供网站(www.bugng.com)去爬取可用数据存到mysql数据库,并且检测数据库已有数据是否可用...
  • LuoZheng4698729
  • LuoZheng4698729
  • 2017年09月14日 10:51
  • 2789

phantomjs 使用代理

前几天爬某一网站,用到phantomjs,要加代理。千幸万苦找到这个方法,赶快记下。方法一: python目录下找到Lib\site-packages\selenium\webdriver\remo...
  • zpf_07
  • zpf_07
  • 2017年09月19日 15:08
  • 366

在selenium中设置代理ip

phantomjs和firefox设置代理IP的几种方法
  • sui_bian_la
  • sui_bian_la
  • 2017年06月22日 20:47
  • 3121

Python ip 代理池爬取工具

  • 2017年12月19日 15:13
  • 4.67MB
  • 下载

Python实现ip段地址

author:skate time:2014/10/13 Python实现ip段的打印,如10.10.10.1-10.10.10.10 #!/usr/bin/env python #enc...
  • wyzxg
  • wyzxg
  • 2014年10月15日 17:19
  • 4223

Python构建代理池

用 Python 爬取网站内容的时候,容易受到反爬虫机制的限制,而突破反爬虫机制的一个重要措施就是使用IP代理。我们可以在网络上找到许多IP代理,但稳定的IP代理成本都较高。因此利用免费代理构建自己的...
  • qq_25071449
  • qq_25071449
  • 2017年07月25日 20:18
  • 439

python3使用ip代理池

# encoding:utf-8 import requests # 导入requests模块用于访问测试自己的ip import random 没有使用字典的原因是 因为字典中的键是唯一的 h...
  • qq_39248703
  • qq_39248703
  • 2017年06月29日 15:05
  • 987
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IP代理池的Python实现
举报原因:
原因补充:

(最多只允许输入30个字)