最近在GitHub上发现了一个十分优秀的项目,名为proxy_pool[1]的免费代理池工具。该项目完全开源,一直有着积极的开发者维护,活跃度也相当高。
项目介绍
proxy_pool项目采用Python语言开发,主要实现了以下功能:
- 定时抓取免费代理网站,具有简易可扩展性。
- 使用Redis对代理进行存储,并对代理的可用性进行排序。
- 定时进行测试和筛选,清除不可用的代理,保留可用的代理。
- 提供代理API,可以随机获取经过测试的可用代理。
目前,该项目已经斩获了5.3K颗星(GitHub Star),受到广泛关注和认可。
部署方式
您可以通过两种方式来运行代理池。一种方式是使用Docker(推荐),另一种方式是通过常规方式运行。具体要求如下:
1.Docker
如果使用 Docker,则需要安装如下环境:
- Docker
- Docker-Compose
安装方法自行搜索即可。 官方 Docker Hub 镜像:germey/proxypool[2]
2.常规方式
常规方式要求有 Python 环境、Redis 环境,具体要求如下:
- Python>=3.6
- Redis
Docker 运行
如果已经安装好了Docker和Docker-Compose,只需一条命令即可轻松运行。
docker-compose up
运行结果类似如下:
redis | 1:M 19 Feb 2020 17:09:43.940 * DB loaded from disk: 0.000 seconds
redis | 1:M 19 Feb 2020 17:09:43.940 * Ready to accept connections
proxypool | 2020-02-19 17:09:44,200 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message.
proxypool | 2020-02-19 17:09:44,203 INFO supervisord started with pid 1
proxypool | 2020-02-19 17:09:45,209 INFO spawned: 'getter' with pid 10
proxypool | 2020-02-19 17:09:45,212 INFO spawned: 'server' with pid 11
proxypool | 2020-02-19 17:09:45,216 INFO spawned: 'tester' with pid 12
proxypool | 2020-02-19 17:09:46,596 INFO success: getter entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
proxypool | 2020-02-19 17:09:46,596 INFO success: server entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
proxypool | 2020-02-19 17:09:46,596 INFO success: tester entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
可以看到 Redis、Getter、Server、Tester 都已经启动成功。 这时候访问http://localhost:5555/random 即可获取一个随机可用代理。
当然你也可以选择自己 Build,直接运行如下命令即可:
docker-compose -f build.yaml up
使用
成功运行之后可以通过http://localhost:5555/random 获取一个随机可用代理。
可以用程序对接实现,下面的示例展示了获取代理并爬取网页的过程:
import requests
proxypool_url = 'http://127.0.0.1:5555/random'
target_url = 'http://httpbin.org/get'
def get_random_proxy():
"""
get random proxy from proxypool
:return: proxy
"""
return requests.get(proxypool_url).text.strip()
def crawl(url, proxy):
"""
use proxy to crawl page
:param url: page url
:param proxy: proxy, such as 8.8.8.8:8888
:return: html
"""
proxies = {'http': 'http://' + proxy}
return requests.get(url, proxies=proxies).text
def main():
"""
main method, entry point
:return: none
"""
proxy = get_random_proxy()
print('get random proxy', proxy)
html = crawl(target_url, proxy)
print(html)
if __name__ == '__main__':
main()
运行结果如下:
get random proxy 116.196.115.209:8080
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e4d7140-662d9053c0a2e513c7278364"
},
"origin": "116.196.115.209",
"url": "https://httpbin.org/get"
}
可以看到成功获取了代理,并请求 httpbin.org 验证了代理的可用性。
写到最后
在网络数据获取和安全测试中,代理池是一个非常有用的工具,能够帮助用户有效地管理和利用代理资源,提高工作效率。通过本文的介绍,希望您对代理池的原理和使用有了更深入的了解。无论是对于开发者还是安全工程师来说,掌握代理池的使用技巧都将成为您工作中的利器。
Reference:
- [1]proxy_pool:https://github.com/Python3WebSpider/ProxyPool
- [2]germey/proxypool:https://hub.docker.com/r/germey/proxypool