Python新人请教:如何在Python中使用socks5代理配置HTTP客户端?
最近刚学习 Python,想用 Python 写一个本地请求 http 的脚本,但是遇到了一个问题,也没有搜出来解决方案,希望各位 Python 大神指教啊。感谢!
代码如下:

执行结果: <class 'str'> time: 560.594797 ms time: 1348.074913 ms
疑问:为什么我在第 27 行就执行了一句: text = response.text 却耗费了 500 多毫秒啊?(把这句去掉,就是不调用 respon.text )就会很快。 这是什么原因啊?
ps: 1.我直接访问 [百度] 的地址不加 socks 代理,是很快的。 2.直接写 socks5 代理,访问不了谷歌,所以写成了 socks5h 3.我用 nodejs 写,整个请求过程也才 700 多毫秒。
望大神赐教啊!!! Python 新人!!不胜感激!!!
Python新人请教:如何在Python中使用socks5代理配置HTTP客户端?
用 PySocks 包可能会简单点
import requests
from urllib3.contrib.socks import SOCKSProxyManager
# 方法1:使用requests库直接配置
def use_requests_with_socks5():
proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080'
}
try:
response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
print("方法1 - 当前代理IP:", response.json()['origin'])
except Exception as e:
print(f"请求失败: {e}")
# 方法2:使用SOCKSProxyManager(更底层控制)
def use_socks_proxy_manager():
proxy_url = 'socks5://127.0.0.1:1080'
http = SOCKSProxyManager(proxy_url)
try:
response = http.request('GET', 'http://httpbin.org/ip')
print("方法2 - 当前代理IP:", response.data.decode())
except Exception as e:
print(f"请求失败: {e}")
# 方法3:使用aiohttp进行异步请求(需要安装aiohttp-socks)
async def use_aiohttp_with_socks():
import aiohttp
from aiohttp_socks import ProxyConnector
connector = ProxyConnector.from_url('socks5://127.0.0.1:1080')
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get('http://httpbin.org/ip') as response:
data = await response.json()
print("方法3 - 当前代理IP:", data['origin'])
# 安装所需包:pip install requests "requests[socks]" aiohttp aiohttp-socks
if __name__ == "__main__":
# 同步请求示例
use_requests_with_socks5()
use_socks_proxy_manager()
# 异步请求示例
import asyncio
asyncio.run(use_aiohttp_with_socks())
核心就三件事:1)配代理地址;2)选合适库;3)处理异常。requests的最常用,aiohttp适合异步场景。记得先pip install "requests[socks]"装socks支持。
总结:选requests配proxies参数最省事。
我没理解错的话,response,text 应该是解码 response 的文本内容,你是要读取内容?或者你用 BeautiFulSoup 试试
PySocks 确实会简单些,好像也有这个问题。
是的,是要读取内容,BeautiFulSoup 也要传文本内容给他,也需要先获取内容。
对于 response.text 为什么慢,从源码中可以看出是做了一次 encoding,response 比较大时候确实是比较慢的。
源码看 https://github.com/requests/requests/blob/master/requests/models.py#L830-L866
对于代理,我也不是很清楚,我用的不多
非常感谢,你说的对,我看错了,并不是代理的问题,我之前可能是使用百度首页测试的,内容比较少,我换成百度搜索页面后,这个 encoding 的时间也需要 300-400 毫秒。感谢!
学习了!
最新的 Requests 使用本地 DNS 解析域名,自然无法访问谷歌,要想真的使用代理访问,降级到 2.12.0 吧。
嗯,已经有了其他解决办法,感谢提醒!

