python开源IP代理池--IPProxys

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

 

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

python开源IP代理池--IPProxys

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

python开源IP代理池--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:

#coding:utf-8 \'\'\' 定义几个关键字,count types,protocol,country,area, \'\'\' import urllib from config import API_PORT from db.SQLiteHelper import SqliteHelper __author__ = \'Xaxdus\' import BaseHTTPServer import json import urlparse # keylist=[\'count\', \'types\',\'protocol\',\'country\',\'area\'] 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]) if len(conditions)>1: conditions = \' AND \'.join(conditions) else: conditions =conditions[0] sqlHelper = SqliteHelper() result = sqlHelper.select(sqlHelper.tableName,conditions,str_count) # print type(result) # for r in result: # print r print result data = json.dumps(result) self.send_response(200) self.end_headers() self.wfile.write(data) except Exception,e: print e self.send_response(404) if __name__==\'__main__\': server = BaseHTTPServer.HTTPServer((\'0.0.0.0\',API_PORT), WebRequestHandler) server.serve_forever()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwgpj.html