本项目利用第三方IP代理提供站定时抓取有效IP,并免费提供网页源数据抓取方案,构建异步IP代理池,让你尽可能简单地获取有效代理:
- Demo: https://hproxy.htmlhelper.org/api
- Document:中文 | English
- Deploy: 部署文档见这里
本项目基于Python3.6+,利用Sanic构建异步HTTP服务,利用aiohttp
进行代理数据异步抓取
git clone https://github.com/howie6879/hproxy.git
cd hproxy
pip install pipenv
# 这里需要注意,虚拟环境请使用Python3.6+,安装依赖库
pipenv install
cd hproxy
python server.py
# 启动爬虫 运行 /hproxy/hproxy/spider/spider_console.py
# 访问:127.0.0.1/api/
hproxy默认使用Redis进行数据存储服务,所以使用的前提是安装好Redis,具体配置在config
下:
# Database config
REDIS_DICT = dict(
REDIS_ENDPOINT=os.getenv('REDIS_ENDPOINT', "localhost"),
REDIS_PORT=os.getenv('REDIS_PORT', 6379),
REDIS_DB=os.getenv('REDIS_DB', 0),
REDIS_PASSWORD=os.getenv('REDIS_PASSWORD', None)
)
DB_TYPE = 'redis'
如果想使用机器本身的Memory
,直接在config
里将DB_TYPE = 'redis'
更改为DB_TYPE = 'memory'
这里需要注意的是如果使用memory
模式,那么服务停止了数据也随之丢失,推荐使用redis
模式
如果想使用其他方式进行数据存储,只需根据BaseDatabase的编码规范进行扩展即可
-
多种方式进行数据存储,易扩展:
-
自定义爬虫基础部件,上手简单,统一代码风格:
-
提供API获取代理,启动后访问
127.0.0.1:8001/api
- 'delete/:proxy': 删除代理
- 'get': 随机选择一个代理
- 'list':列出全部代理
- ...
-
从代理池随机选取一个代理提供html源码抓取服务
-
定时抓取、更新、自动验证
-
获取代理具体信息:如代理类型、协议、位置
本项目的爬虫代码全部集中于目录spider,在/spider/proxy_spider/目录下定义了一系列代理网站的爬虫,所有爬虫基于/spider/base/proxy_spider.py里定义的规范编写,参考这些,就可以很方便的扩展一系列代理爬虫
运行spider_console.py文件,即可启动全部爬虫进行代理的获取,无需定义新加的爬虫脚本,只需按照规范命名,即可自动获取爬虫模块然后运行
若想运行单个代理爬虫脚本,直接运行即可,比如xicidaili
,直接执行:
cd hproxy/hproxy/spider/proxy_spider/
python xicidaili_spider.py
# 验证100个代理,异步执行能保证5秒左右执行完毕,因为超时代理超时就是5s
# 同步执行最坏情况就...
# 2018/04/14 13:42:32 [爬虫执行结束 ] OK 爬虫:xicidaili 执行结束,获取代理100个 - 有效代理:28个,用时:5.384464740753174
获取的代理验证脚本在valid_proxy,目前设定每10分钟验证一次所有代理,每个代理失败五次之后就丢弃,一般在后台运行,手动执行如下:
cd hproxy/hproxy/scheduler/
python valid_proxy.py
接口 | 描述 |
---|---|
delete/:proxy | 删除一个代理 |
get | 参数valid=1,会在返回代理过程中验证一次,确保其有效,否则一直寻找,直到返回 |
list | 列出所有代理,没有一个个验证 |
valid/:proxy | 验证一个代理 |
html?url=''&ajax=0&foreign=0 | 随机选取代理请求url并返回 |
// http://127.0.0.1:8001/api/get?valid=1
// 返回成功,开启验证参数valid=1的话speed会有值,并且默认是开启的
// types 1:高匿 2:匿名 3:透明
{
"status": 1,
"info": {
"proxy": "101.37.79.125:3128",
"types": 3
},
"msg": "success",
"speed": 2.4909408092
}
// http://127.0.0.1:8001/api/list 列出所有代理,没有一个个验证
{
"status": 1,
"info": {
"180.168.184.179:53128": {
"proxy": "180.168.184.179:53128",
"types": 3
},
"101.37.79.125:3128": {
"proxy": "101.37.79.125:3128",
"types": 3
}
},
"msg": "success"
}
// http://127.0.0.1:8001/api/delete/171.39.45.6:8123
{
"status": 1,
"msg": "success"
}
// http://127.0.0.1:8001/api/valid/183.159.91.75:18118
{
"status": 1,
"msg": "success",
"speed": 0.3361008167
}
// http://127.0.0.1:8001/api/html?url=https://www.v2ex.com
// 随机选取代理抓取v2ex
{
"status": 1,
"info": {
"html": "html 源码",
"proxy": "120.77.254.116:3128"
},
"msg": "success"
}
问:为什么只抓取ip以及端口?
答:因为网站上代理的信息不一定准确,所以需要进一步验证,本项目会在返回代理的时候做进行验证,验证是否可用以及验证代理具体信息
问:如何扩展数据存储方式?
答:BaseDatabase里面定义了一些子类必须要有的方法,按照这个格式写就不会有问题
问:如何扩展代理爬虫?
答:同样,在spider目录下找到爬虫编写规范,或者直接看某一个代理爬虫脚本的编写模式
hproxy is offered under the MIT license.
感谢以下项目:
感谢以下代理网站,有优质代理网站请提交^_^,点这里 #3