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客户端?

10 回复

用 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 吧。

嗯,已经有了其他解决办法,感谢提醒!

回到顶部