python开源IP代理池--IPProxys

今天博客开始继续更新,谢谢大家对我的关注和支持。这几天一直是在写一个ip代理池的开源项目。通过前几篇的博客,我们可以了解到突破反爬虫机制的一个重要举措就是代理ip。拥有庞大稳定的ip代理,在爬虫工作中将起到重要的作用,但是从成本的角度来说,一般稳定的ip池都很贵,因此我这个开源项目的意义就诞生了,爬取一些代理网站提供的免费ip(虽然70%都是不好使的,但是扛不住量大,网站多),检测有效性后存储到数据库中,同时搭建一个http服务器,提供一个api接口,供大家的爬虫程序调用。

好了,废话不多说,咱们进入今天的主题,讲解一下我写的这个开源项目IPProxys。


下面是这个项目的工程结构:

   api包:主要是实现http服务器,提供api接口(通过get请求,返回json数据)

   data文件夹:主要是数据库文件的存储位置和qqwry.dat(可以查询ip的地理位置)

   db包:主要是封装了一些数据库的操作

   spider包:主要是爬虫的核心功能,爬取代理网站上的代理ip

   test包:测试一些用例,不参与整个项目的运行

   util包:提供一些工具类。IPAddress.py查询ip的地理位置

   validator包:用来测试ip地址是否可用

   config.py:主要是配置信息(包括配置ip地址的解析方式和数据库的配置)


接下来讲一下关键代码:

  首先说一下apiServer.py,主要是产生一个http服务器。

class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        """
        """
        dict={}

        parsed_path = urlparse.urlparse(self.path)
        try:
            query = urllib.unquote(parsed_path.query)
            print query
            if query.find('&')!=-1:
                params = query.split('&')
                for param in params:
                    dict[param.split('=')[0]]=param.split('=')[1]
            else:
                    dict[query.split('=')[0]]=query.split('=')[1]
            str_count=''
            conditions=[]
            for key in dict:
                if key =='count':
                    str_count = 'lIMIT 0,%s'% dict[key]
                if key =='country' or key =='area':
                    conditions .append(key+" LIKE '"+dict[key]+"%'")
                elif key =='types' or key =='protocol' or key =='country' or key =='area':
                    conditions .append(key+"="+dict[key])

从代码中可以看出是对参数的解析,参数包括 count(数量), types(模式),protocol(协议),country(国家),area(地区),(

types类型(0高匿名,1透明),protocol(0 http,1 https http),country(国家),area(省市))

例如访问http://127.0.0.1:8000/?count=8&types=0.返回json数据。如下图所示:

SQLiteHelper.py(主要是对sqlite的操作)

HtmlPraser.py(主要是对html进行解析):

  使用lxml的xpath进行解析

IPAddresss.py(通过读取纯真qqwry.dat,对ip地址进行定位),读取的方式可以参考:http://ju.outofmemory.cn/entry/85998;https://linuxtoy.org/archives/python-ip.html

最后看一下validator.py,由于使用的是python2.7,所以要使用协程采用了gevent。

具体代码,请点击最后的阅读原文了解,
最后咱们看一下运行效果: 切换到工程目录下,cmd中执行python IPProxys.py:
这个时候咱们在浏览器中输入请求,就会返回响应的结果:

执行流程是每隔半小时检测一下数据库中ip地址的有效性,删除无效的代理ip。如果ip地址数量少于一个数值,爬虫将会启动,进行新一轮的爬取。当然检测时间和数据量都可以在config.py中配置。

  整个项目的代码很简单,大家如果想深入了解的话,就详细的看一下我的这个开源项目IPProxys代码,代码写的有点粗糙,日后再继续优化。

  完整的代码我已经上传到github上:
  https://github.com/qiyeboy/IPProxys

  
   qqwry.dat下载链接:
  http://pan.baidu.com/s/1o7A6n8m 密码:wcvs。
 今天的分享就到这里,如果大家觉得还可以呀,记得赞赏和分享呦

原文发布于微信公众号 - 七夜安全博客(qiye_safe)

原文发表时间:2016-07-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android自学

给WordPress文章添加类似说说的状态样式

1223
来自专栏PHP技术

3种web会话管理的方式

http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。当然它知道是哪个客户端地址发过来的,但是对于我们的应用来...

883
来自专栏FD的专栏

React 中引入 Angular 组件

为了在我的编辑器中使用 Angular,我用 Angular 编写了一个重命名功能。而为了使用它,我得再次使用一次 customEvent,而在这个微前端架构的...

773
来自专栏企鹅号快讯

ajax 跨域,这应该是最全的解决方案了

问题:我怎么才能收到你们公众号平台的推送文章呢? 前言 从刚接触前端开发起, 这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了...

1925
来自专栏Golang语言社区

web server与app server有什么不同

简单来说,web服务器提供页面给浏览器,而app服务器提供客户端可以调用的接口。具体而言,我们可以说:Web服务器处理HTTP请求,而app服务器基于多种不同的...

3305
来自专栏我是攻城师

如何使用scala+spark读写hbase?

3317
来自专栏coder修行路

python爬虫从入门到放弃(二)之爬虫的原理

在上文中我们说了:爬虫就是请求网站并提取数据的自动化程序。其中请求,提取,自动化是爬虫的关键!下面我们分析爬虫的基本流程 爬虫的基本流程 发起请求 通过HTTP...

1959
来自专栏phodal

我的职业是前端工程师【五】: 前端工程师必会的六个调试技能

我还是一个野生程序员的时候,不会 Debug,只会傻傻地写一句句 std::count。即使是在今天,有些时候我也会这样做:打一个 console.log,然后...

18510
来自专栏大数据挖掘DT机器学习

python模拟新浪微博登陆功能(新浪微博爬虫)

有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。 浏览器访问服务器的过程 在用户访问网页时...

5335
来自专栏有趣的Python

4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍

使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(...

3138

扫码关注云+社区