High aviariable proxy pool client for crawlers.
Project description
HAipproxy
本项目所采集的IP资源都来自互联网,愿景是为大型爬虫项目提供一个高可用低延迟的高匿IP代理池。
Features
- 快速抓取代理IP
- IP抓取和提取精准
- IP来源丰富
- 优良的IP校验器,并且容易根据自身需要扩展
- 支持分布式部署
- 架构设计灵活
- MIT授权协议
Quick start
注意,代码请在release列表中下载,master分支的代码不保证能稳定运行
单机部署
服务端
-
安装Python3和Redis。有问题可以阅读这篇文章的相关部分。
-
根据Redis的实际配置修改项目配置文件config/settings.py中的
REDIS_HOST
、REDIS_PASSWORD
等参数。 -
安装scrapy-splash,并修改配置文件config/settings.py中的
SPLASH_URL
-
安装项目相关依赖
pip install -r requirements.txt
-
启动scrapy worker,包括代理IP采集器和校验器
python crawler_booter.py --usage crawler
python crawler_booter.py --usage validator
-
启动调度器,包括代理IP定时调度和校验
python scheduler_booter.py --usage crawler
python scheduler_booter.py --usage validator
客户端
近日不断有同学问,如何获取该项目中可用的代理IP列表。haipproxy
提供代理的方式并不是通过api api
来提供,而是通过具体的客户端来提供。
目前支持的是Python客户端和语言无关的squid二级代理
python客户端调用示例
from client.py_cli import ProxyFetcher
args = dict(host='127.0.0.1', port=6379, password='123456', db=0)
# 这里`zhihu`的意思是,去和`zhihu`相关的代理ip校验队列中获取ip
# 这么做的原因是同一个代理IP对不同网站代理效果不同
fetcher = ProxyFetcher('zhihu', strategy='greedy', redis_args=args)
# 获取一个可用代理
print(fetcher.get_proxy())
# 获取可用代理列表
print(fetcher.get_proxies()) # or print(fetcher.pool)
更具体的示例见examples/zhihu
squid作为二级代理
-
安装squid,备份squid的配置文件并且启动squid,以ubuntu为例
sudo apt-get install squid
sudo sed -i 's/http_access deny all/http_access allow all/g' /etc/squid/squid.conf
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.backup
sudo service squid start
-
根据操作系统修改项目配置文件config/settings.py中的
SQUID_BIN_PATH
、SQUID_CONF_PATH
、SQUID_TEMPLATE_PATH
等参数 -
启动
squid conf
的定时更新程序sudo python squid_update.py
-
使用squid作为代理中间层请求目标网站,默认代理URL为'http://squid_host:3128',用Python请求示例如下
import requests proxies = {'https': 'http://127.0.0.1:3128'} resp = requests.get('https://httpbin.org/ip', proxies=proxies) print(resp.text)
Docker部署
-
安装Docker
-
安装docker-compose
pip install -U docker-compose
-
修改settings.py中的
SPLASH_URL
和REDIS_HOST
参数SPLASH_URL = 'http://splash:8050' REDIS_HOST = 'redis'
-
使用docker-compose启动各个应用组件
docker-compose up
这种方式会一同部署squid
,您可以通过squid
调用代理IP池,也可以使用客户端调用,和单机部署调用方式一样
注意事项
- 本项目高度依赖Redis,除了消息通信和数据存储之外,IP校验和任务定时工具也使用了Redis中的多种数据结构。 如果需要替换Redis,请自行度量
- 由于GFW的原因,某些网站需要通过科学上网才能进行访问和采集,如果用户无法访问墙外的网站,请将rules.py
task_queue
为SPIDER_GFW_TASK
和SPIDER_AJAX_GFW_TASK
的任务enable
属性设置为0或者启动爬虫的时候指定爬虫类型为common
和ajax
python crawler_booter.py --usage crawler common ajax
- 相同代理IP,对于不同网站的代理效果可能大不相同。如果通用代理无法满足您的需求,您可以为特定网站编写代理IP校验器
工作流程
开发者文档
为了方便用户针对自身需求进行定制化,haipproxy
提供了丰富的文档支持。所有文档详见项目wiki
效果测试
以单机模式部署haipproxy
和测试代码,以知乎为目标请求站点,
每一万条成功请求为统计结果,实测抓取效果如下
请求量 | 时间 | 耗时 | IP负载策略 | 客户端 |
---|---|---|---|---|
0 | 2018/03/03 22:03 | 0 | greedy | py_cli |
10000 | 2018/03/03 11:03 | 1 hour | greedy | py_cli |
20000 | 2018/03/04 00:08 | 2 hours | greedy | py_cli |
30000 | 2018/03/04 01:02 | 3 hours | greedy | py_cli |
40000 | 2018/03/04 02:15 | 4 hours | greedy | py_cli |
50000 | 2018/03/04 03:03 | 5 hours | greedy | py_cli |
60000 | 2018/03/04 05:18 | 7 hours | greedy | py_cli |
70000 | 2018/03/04 07:11 | 9 hours | greedy | py_cli |
80000 | 2018/03/04 08:43 | 11 hours | greedy | py_cli |
可见haipporxy
的代理效果还算不错,在开始的时候可以达到1w/hour
的请求量,几个小时候请求量请求量
降为了5k/hour
。降低的结果可能有三个: (1)随着数据量的增大,Redis的性能受到了一定的影响(2)知乎校验
器在把Init Queue
中的代理消费完之后,由于是定时任务,所以导致某段时间内新鲜的IP空缺。而免费IP大多
数都是短效的,所以这段时间出现了IP的空缺;(3)由于我们采用的是greedy
模式调用IP,它的调用策略是: 高
质量代理IP会一直被调用直至该代理IP不能用或者被封,而低应速度IP会轮询调用。这也可能导致高质量IP的空缺。
由此可见IP校验和调用策略还有很大的优化空间。希望能有志同道合的朋友加入进来一起优化。
测试代码见examples/zhihu
如何贡献
- 欢迎给项目提新feature
- 如果发现项目某些环节有问题,欢迎提issue或者PR
- 代理IP校验和筛选的策略仍有优化的空间,欢迎大家交流探讨
- 如果你发现了比较好的代理网站,欢迎分享
同类项目参考
本项目参考了Github上开源的各个爬虫代理的实现,感谢他们的付出,下面是笔者参考的所有项目,排名不分先后。
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file haipproxy-0.11.6.tar.gz
.
File metadata
- Download URL: haipproxy-0.11.6.tar.gz
- Upload date:
- Size: 16.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 85d15c028102ae10032ec517343c957424a5735b6dfbe0012668f9f0eb920dbd |
|
MD5 | 8df858547d252afabd55d9ca6bd30d24 |
|
BLAKE2b-256 | c45dfab8aaecd798415d13addb65146ced18e2618e213c09244f0bf0d3d376af |