在做压力测试、爬取数据、安全等需要频繁的更换自己ip,目前网上有很多的优秀项目都开源,没一定的基础是搭建不起来,在这里个人仅仅做搭建教程。
项目一
项目源地址:https://github.com/jhao104/proxy_pool
该项目在开源上也是很有人气,个人也觉得很不错,可扩展性好。
这里有两种方式,一种是本地python环境运行,另外一种是Docker的方式运行,这里推荐新手使用Docker运行,Docker的安装下载官网:https://www.docker.com/get-started/ 。如果搭建过程有问题请参考该文章:Windows下安装Docker 。linux版本请自行网上参考。
docker方式搭建
为什么使用docker环境?是因为环境的搭建以及兼容性非常好,不同的服务以及程序,可以定义不同的端口以及很多很多方便,这里就不详细讲解了。
1.安装成功Docker并将它运行,在cmd环境下先安装jhao104镜像:
docker pull jhao104/proxy_pool
2.这里还需要redis环境,默认安装的是最新版本,如果需要别的版本请自己指定:
docker pull redis
3.启动redis环境,注意需要先启动docker,默认是没有启动的:
docker run -itd --name redis-proxy -p 999:6379 redis --requirepass "password"
以上参考关键部分: docker run -itd –name (启动容器的名称) -p 映射端口:redis启动端口 redis –requirepass “连接密码”
4.启动代理池环境:
docker run --env DB_CONN=redis://:password@127.0.0.1:999/0 -p 5010:5010 jhao104/proxy_pool:latest
以上参考关键部分:docker run –env DB_CONN=redis://:(redis连接密码)@(IP地址):(服务的端口)/(redis的数据库,默认选0) -p 映射端口:代理池启动端口 jhao104/proxy_pool:latest
使用
启动web服务后, 默认配置下会开启 http://127.0.0.1:5010 的api接口服务:
api | 方式 | 说明 | 参数 |
---|---|---|---|
/ | GET | api介绍 | None |
/get | GET | 随机获取一个代理 | 可选参数: ?type=https 过滤支持https的代理 |
/pop | GET | 获取并删除一个代理 | 可选参数: ?type=https 过滤支持https的代理 |
/all | GET | 获取所有代理 | 可选参数: ?type=https 过滤支持https的代理 |
/count | GET | 查看代理数量 | None |
/delete | GET | 删除代理 | ?proxy=host:ip |
爬虫使用:
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
def getHtml():
retry_count = 5
proxy = get_proxy().get("proxy")
while retry_count > 0:
try:
html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
# 使用代理访问
return html
except Exception:
retry_count -= 1
# 删除代理池中代理
delete_proxy(proxy)
return None
注:基本按按开源教程的,个人仅简单介绍,详情请访问开源地址,以上的获取到的代理是通过公开的免费代理,但都有一个缺陷,那就是生存的时间很短,几分钟就过期。
项目二
基本使用两个代理池就够用了,可以在服务器上搭建自己的代理池,这样就可以方便自己的使用。这个是我之前在学习python时作者自己改别人的,源项目地址:https://github.com/Python3WebSpider/ProxyPool
这里使用docker比较简单,下载源项目并解压,cmd下进入解压的目录,执行以下命令:
docker-compose up
该命令会自己安装镜像并自启镜像,注意与其搭配的redis可能不会自启,还是需要自己手动启动,如图:
点击三角便可以启动成功。以下是使用案例:
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()
这两个项目基本都是通用的,原理也是基本一致的,可以都搭建在自己的服务器上面,我们在使用时就可以调用了。两个项目的代码都会自己定时去爬取公开的代理,其实自己写一个也完全是可以的,如果有可能我也会自己写一个吧(估计没有时间)