文档章节

采集免费ip,制作自己的代理ip池

南寻
 南寻
发布于 2017/09/07 01:26
字数 1153
阅读 544
收藏 3
点赞 0
评论 0

        我们在爬取网站的时候经常会遇到突然访问不了的问题,原因之一是因为你的ip进了该站的黑名单,在某一段时间内不能访问该站的资源。那么该怎么解决这个问题?比较有效的方式是使用代理ip,而如果有一个自己的代理ip池,妈妈再也不用担心我没有ip可用啦。

        github传送门0(xici代理ip池

西刺网(传送门1 国内高匿)是一个免费代理ip资源比较多的站,本文就从西刺网获取ip,制作代理ip池。

        打开(传送门1 国内高匿)可见到如下页面

有俩千多页代理ip,,当然这是按时间排序的,我估计越到后面的ip可能就没啥用了.

分析该页面的源码

很简单的发现,所有的代理ip信息都在table下,每一个tr都是一条ip的信息。那这就比较简单了,分分钟来一个漂亮的正则来将需要的信息匹配出来(这里我匹配的有ip地址,端口,类型,服务器地址,是否匿名)

编写xc.py

正则表达式(个人觉得这应该是本程序最精华的部分)的使用如下

pattern=re.compile(u'<tr class=".*?">.*?'
                           +u'<td class="country"><img.*?/></td>.*?'
                           +u'<td>(\d+\.\d+\.\d+\.\d+)</td>.*?'
                           +u'<td>(\d+)</td>.*?'
                           +u'<td>.*?'
                           +u'<a href=".*?">(.*?)</a>.*?'
                           +u'</td>.*?'
                           +u'<td class="country">(.*?)</td>.*?'
                           +u'<td>([A-Z]+)</td>.*?'
                           +'</tr>'
                           ,re.S)
        l=re.findall(pattern,text)

\d匹配数字,\d+匹配多个数字 (\d+) 这里匹配端口号

[A-Z]匹配大写字母,[A-Z]+匹配多个大写字母 这里匹配的是类型

.匹配单个任意字符,*匹配前面字符0到多次,?匹配前面0到一次,(.*?)匹配任意字符

如果你对正则表达式不是很熟悉,你可以在这里(传送门2 菜鸟教程)进行这方面的学习。

下面编写请求头

self.headers={
            'Accept-Encoding':'gzip, deflate, br',
            'Accept-Language':'zh-CN,zh;q=0.8',
            'Referer':'http://www.xicidaili.com/nn/',
            'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 Chrome/60.0.3112.113 Safari/537.36',
        }
        self.proxyHeaders={
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                          '(KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 Chrome/60.0.3112.113 Safari/537.36',
        }

第一个self.headers是下载页面的请求头,self.proxyHeaders是后面验证ip是否可用的请求头。

下面是下载页面和正则匹配的函数

def getPage(self,url):
        page=self.req.get(url,headers=self.headers).text
        # print(page)
        return page

    def Page(self,text):
        time.sleep(2)
        pattern=re.compile(u'<tr class=".*?">.*?'
                           +u'<td class="country"><img.*?/></td>.*?'
                           +u'<td>(\d+\.\d+\.\d+\.\d+)</td>.*?'
                           +u'<td>(\d+)</td>.*?'
                           +u'<td>.*?'
                           +u'<a href=".*?">(.*?)</a>.*?'
                           +u'</td>.*?'
                           +u'<td class="country">(.*?)</td>.*?'
                           +u'<td>([A-Z]+)</td>.*?'
                           +'</tr>'
                           ,re.S)
        l=re.findall(pattern,text)
        return l

根据上面的代码,就可以将代理ip从西刺站拿下来,接下来检验是否有效。

requests是一个非常有用的库,这里也将使用它进行校验

self.req.get("http://www.baidu.com",proxies={"{}".format(i[2]):"{}://{}:{}".format(i[2],i[0],i[1])},timeout=5)

i 是 ('110.73.48.247', '8123', 'HTTP') 类数据

为了保证校验的可靠性,我把每次校验设置超时5s。

 

如此就能拿到新鲜免费的代理ip了,为了使得ip能多次使用,我将其存入mysql数据库中。

写入代码如下

def insert(self,l):
    print("插入{}条".format(len(l)))
    self.cur.executemany("insert into xc values(%s,%s,%s,%s,%s)",l)
    self.con.commit()

读取代码如下

def select(self):
    a=self.cur.execute("select ip,port,xieyi from xc")
    info=self.cur.fetchall()
    return info

最后来看下使用效果:

编写demo.py 再导入xc.py 中的xiciSpider类

from xi import xiciSpider
p=xiciSpider()
#第一次先运行这个方法,现要将ip存入mysql
p.getNewipToMysql()
#获取可用代理ip,默认获取1个,可指定size大小
ip=p.getAccessIP()
print(ip)

#输出如下
“”“
/usr/bin/python3.5 /home/cb/桌面/xici/demo.py
[('36.251.248.76', '80', 'HTTPS')]

Process finished with exit code 0
”“”

首先你需要从西刺网将ip爬取到自己数据库中,然后再从数据库中提取有用的ip

第二次可直接使用getAccessIP方法来获取可用ip.

 

最后奉上完整代码 github传送门0(xici代理ip池),觉得有用的不妨点个star

也欢迎关注本人的专栏 Python数据分析https://zhuanlan.zhihu.com/c_99646580

© 著作权归作者所有

共有 人打赏支持
南寻
粉丝 60
博文 90
码字总数 35772
作品 0
朝阳
程序员
Python代理IP池--proxy_pool

爬虫代理IP池 1、问题 代理IP从何而来?   刚自学爬虫的时候没有代理IP就去西刺、快代理之类有免费代理的网站去爬,还是有个别代理能用。当然,如果你有更好的代理接口也可以自己接入。  ...

j_hao104 ⋅ 2017/03/31 ⋅ 2

Henson/ProxyPool

Golang实现的IP代理池 采集免费的代理资源为爬虫提供有效的代理 1、代理池设计   代理池由四部分组成: Getter:   代理获取接口,目前有9个免费代理源,每调用一次就会抓取这些网站最新...

Henson ⋅ 2017/03/31 ⋅ 0

Python爬虫代理池

爬虫代理IP池 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做...

j_hao104 ⋅ 2016/12/05 ⋅ 5

Golang 实现的 IP 代理池--ProxyPool

采集免费的代理资源为爬虫提供有效的代理 1、代理池设计 代理池由四部分组成: Getter: 代理获取接口,目前有6个免费代理源,每调用一次就会抓取这个6个网站最新的100个代理放入Channel,可...

Henson ⋅ 2017/03/30 ⋅ 5

ProxyPool —— Golang 实现的 IP 代理池

ProxyPool 是 Golang 实现的 IP 代理池,采集免费的代理资源为爬虫提供有效的代理。

王练 ⋅ 2017/03/31 ⋅ 0

Python爬虫简易代理池

爬虫代理IP池 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做...

铁扇公主1 ⋅ 2017/04/07 ⋅ 1

构建一个给爬虫使用的代理IP池

做网络爬虫时,一般对代理IP的需求量比较大。因为在爬取网站信息的过程中,很多网站做了反爬虫策略,可能会对每个IP做频次控制。这样我们在爬取网站时就需要很多代理IP。 代理IP的获取,可以...

fengzhizi715 ⋅ 2017/11/23 ⋅ 0

自建免费PYTHON爬虫代理IP池

大家好,我还是小四毛,不是崔老师!!!!崔老师在隔壁,哈哈哈。 写了一个从网上抓取代理IP,然后构建代理IP池的脚本,放在了这里:https://github.com/xiaosimao/IP_POOL 以后应该还会有很...

四毛 ⋅ 2017/09/22 ⋅ 0

许雪里/xxl-crawler

XXL-CRAWLER XXL-CRAWLER, a object-oriented web crawler framework.. -- Browse website. -- Introduction XXL-CRAWLER is a flexible and efficient、object-oriented web crawler frame......

许雪里 ⋅ 2017/11/03 ⋅ 0

XXL-CRAWLER v1.1.0,面向对象的分布式爬虫框架

XXL-CRAWLER v1.1.0 已发布,更新如下: 新特性: 页面默认cssQuery调整为html标签; 升级Jsoup至1.11.1版本; 修复PageVO注解失效的问题; 属性注解参数attributeKey调整为selectVal; 代理...

许雪里 ⋅ 2017/11/08 ⋅ 17

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java集合类总结笔记

一、集合类的层次关系 主要容器集合类的特点: ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除的有序序列 ArrayDeque 一种用循环数组实现的...

edwardGe ⋅ 5分钟前 ⋅ 0

spring RMI远程调用

RMI https://www.cnblogs.com/wdh1995/p/6792407.html

BobwithB ⋅ 11分钟前 ⋅ 0

Jenkins实践2 之基本配置

1 插件管理 系统管理->插件管理 在可选插件中可以自主安装插件 2 管理用户 系统管理->管理用户->新建用户 3 安全配置 系统管理->全局安全配置 授权策略 选择安全矩阵 然后添加现有的用户,赋...

晨猫 ⋅ 11分钟前 ⋅ 0

c++智能指针

1、是一种泛型类,针对指针类型的泛型类,会保存指针 2、重载了符号 *和-> 对智能指针使用这两个符号,相当于对保存的泛型使用这两个符号 3、当智能指针引用计数为0时,会去释放指针指向的资...

国仔饼 ⋅ 12分钟前 ⋅ 0

Spring Boot错误处理机制

1)、SpringBoot默认的错误处理机制 默认效果: 1)、浏览器,返回一个默认的错误页面 浏览器发送请求的请求头: 2)、如果是其他客户端,默认响应一个json数据 原理: 可以参照ErrorMvcAut...

小致dad ⋅ 13分钟前 ⋅ 0

ftp连接不上的终极办法 SFTP

假如FTP由于各种原因就是连不上,那么用SFTP协议吧,使用登录服务器的账号密码。

sskill ⋅ 18分钟前 ⋅ 0

Unity 围绕旋转角度限制(Transform.RotateAround)

在 Unity 中可以利用 Transform.RotateAround 围绕指定物体进行旋转,但某些情况下可能需要对旋转角度进行控制。我是先计算出预设角度大小,然后判断是否在限定角度范围内是则进行旋转。 相关...

大轩 ⋅ 19分钟前 ⋅ 0

阿里沙箱环境支付宝测试demo

阿里支付宝支付和微信支付,包括:阿里沙箱环境支付宝测试demo,支付宝支付整合到spring+springmvc+mybatis环境和微信整合到如上环境,功能非常齐全,只需要修改对应的配置文件即可,帮助文档...

码代码的小司机 ⋅ 21分钟前 ⋅ 0

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 38分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 43分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部