日常开发中,偶尔会遇到爬取网页数据的需求,为了隐藏本机真实 IP,常常会用到代理 IP 池,本文将基于 openresty 与代理 IP 池搭建更为易用的隧道代理。
1. 代理 IP 池
代理 IP 池即在数据库中维护一个可用的 IP 代理队列,一般实现思路如下:
import json
import requests
from retrying import retry
def get_proxy_ip() -> str:
resp = requests.get(url="http://192.168.0.121:5010/get")
assert resp.status_code == 200
return f"http://{json.loads(resp.text)['proxy']}"
@retry(stop_max_attempt_number=5)
def proxy_test() -> None:
resp = requests.get(url="http://httpbin.org/get", proxies={"http": get_proxy_ip()}, timeout=5)
assert resp.status_code == 200
print(f"origin: {json.loads(resp.text)['origin']}")
if __name__ == "__main__":
try:
proxy_test()
except Exception as e:
print(f"Error: {e}.")
2. 隧道代理
通过代理 IP 池实现了隐藏本机真实 IP,但每次需要通过 API 接口获取新的代理 IP,不太方便,所以出现了隧道代理。隧道代理内部自动将请求通过不同的代理 IP 进行转发,对外提供统一的代理地址。
此处笔者通过 openresty 配合上文搭建的代理 IP 池实现隧道代理。
openresty
├── conf.d
│ └── tunnel-proxy.stream
├── docker.sh
└── nginx.conf
通过 docker 启动 openresty,此处笔者为了方便,将 docker 命令保存成了 shell 文件,具体内容如下:
docker run --name openresty -itd --restart always \
-p 9870:9870 \
-v $PWD/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf \
-v $PWD/conf.d:/etc/nginx/conf.d \
-e LANG=C.UTF-8 \
-e TZ=Asia/Shanghai \
--log-driver json-file \
--log-opt max-size=1g \
--log-opt max-file=3 \
openresty/openresty:alpine
执行 bash docker.sh
命名启动 openresty,至此隧道代理搭建完成。
import json
import requests
from retrying import retry
proxies = {
"http": "http://192.168.0.121:9870"
}
@retry(stop_max_attempt_number=5)
def proxy_test() -> None:
resp = requests.get(
url="http://httpbin.org/get", proxies=proxies, timeout=5, )
assert resp.status_code == 200
print(f"origin: {json.loads(resp.text)['origin']}")
if __name__ == "__main__":
try:
proxy_test()
except Exception as e:
print(f"Error: {e}.")
参考链接:
Original: https://www.cnblogs.com/xiaoQQya/p/16305232.html
Author: Hit不死的小强
Title: 爬虫代理 IP 池及隧道代理(2022.05.24)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/810377/
转载文章受原作者版权保护。转载请注明原作者出处!