【问题标题】:TorRequests and Python - InvalidSchema: Missing dependencies for SOCKS supportTorRequests 和 Python - InvalidSchema:缺少对 SOCKS 支持的依赖项
【发布时间】:2019-08-09 08:41:51
【问题描述】:

我想在 Tor 的帮助下使用 python 3 发出匿名网络请求,我正在学习本教程:https://computerscienceandfangs.blogspot.com/2018/04/setting-up-tor-for-windows-10-python-3.html

到目前为止,我只是在测试教程代码的第一部分(如下):

import requests

def get_tor_session():
    session = requests.session()
    # Tor uses the 9050 port as the default socks port
    session.proxies = {'http':  'socks5://127.0.0.1:9050',
                       'https': 'socks5://127.0.0.1:9050'}
    return session

# Make a request through the Tor connection
# IP visible through Tor
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
# Above should print an IP different than your public IP

# Following prints your normal public IP
print(requests.get("http://httpbin.org/ip").text)

因此,当我执行代码:print(session.get("http://httpbin.org/ip").text) 时,它应该向我显示一个不同的 IP 地址。然而,我得到了错误:

 File "C:\Program Files\Anaconda3\lib\site-packages\requests\adapters.py", line 43, in SOCKSProxyManager
    try:

InvalidSchema: Missing dependencies for SOCKS support.

我已经按照教程安装了以下软件包:

1)pip 安装请求 -- 升级

2)pip 安装请求[socks]

3)pip install stem

我使用的是 Windows 7(64 位)。用于 Python IDE 的 Spyder。 Python 3.5 版。

第二个问题,更笼统。作为网络抓取工具项目的一部分,我希望提出更大规模的请求。上面的方法,使用我引用的教程,仍然是一个很好的方法(即使用 Python 手动编码),以确保你不会被禁止/黑名单?或者是否有更高级的服务可以为您执行匿名 IP 请求、IP 轮换和请求限制,而无需您编写自己的软件并手动配置,并且请求数量不受限制?

非常感谢。

【问题讨论】:

    标签: python python-3.x python-requests tor torsocks


    【解决方案1】:

    您是否从 cli 运行 tor 服务?

    您的代理应如下所示:

    session.proxies = {'http':  'socks5h://127.0.0.1:9050',
                       'https': 'socks5h://127.0.0.1:9050'}
    

    此外,请求并非旨在以您描述的方式发出大量请求。我建议使用以下设置,它使用aiohttpaiohttp_socksasyncio

    import asyncio, aiohttp
    from aiohttp_socks import SocksConnector
    
    async def get_one(url, callback):
        connector = SocksConnector.from_url('socks5://localhost:9050', rdns=True)
        # rdns=True is important!
        # 1) Can't connect to hidden services without it
        # 2) You will make DNS lookup requests using your real IP, and not your Tor IP!
        async with aiohttp.ClientSession(connector=connector) as session:
            print(f'Starting {url}')
            async with session.get(url) as res:
                return await callback(res)
    
    def get_all(urls, callback):
        future = []
        for url in urls:
            task = asyncio.ensure_future(get_one(url, callback))
            future.append(task)
    
        return future
    
    def test_callback(res):
        print(res.status)
    
    if __name__ == '__main__':
        urls = [
            'https://python.org', 
            'https://google.com',
            #...
        ]
    
        loop = asyncio.get_event_loop()
        future = get_all(urls, test_callback)
        loop.run_until_complete(asyncio.wait(future))
    

    【讨论】:

    • 我已根据您的建议更改了代码。至于tor 服务,对不起,我是新手。我双击了tor.exe,但什么也没发生。我如何知道“tor”服务是否在 Windows 7 上运行?
    • 我不熟悉它在windows上的样子,但在mac上我用brew install tor安装它,并通过在cli中调用tor来启动一个tor实例。
    • 另外,我查看了tor 网站,他们没有在 Windows 上安装它的教程(在“专家指南”部分)。我认为这是可能的,因为您引用的指南使用它,但我不确定。
    • 添加了另一个更新。在你弄乱 asyncio 之前,你可能应该让你的 requests 版本正常工作(一开始有点混乱)。希望有帮助!
    • 抱歉忽略我之前的评论(已删除),我以为您的意思是您在评论部分进行了更新,而不是在解决方案部分进行了更新,所以直到现在我才看到您的更新。这次真是万分感谢。我有一个关于代码更新的问题——这是否利用了 Tor?重点是我试图从匿名 IP 发出请求,这样当我使用网络爬虫时,网站就不会阻止我的 IP 地址。
    【解决方案2】:

    要解决错误:InvalidSchema: Missing dependencies for SOCKS support 我已经在 Windows 操作系统中重新启动了 Tor 服务,方法是在命令行中运行以下命令:

    tor --service remove

    然后

    tor --service install -options ControlPort 9051

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2017-06-26
      • 2017-12-25
      • 2015-04-18
      • 2020-03-24
      相关资源
      最近更新 更多