【问题标题】:How can proxy scrapy requests with Socks5?如何使用 Socks5 代理 scrapy 请求?
【发布时间】:2020-03-23 21:27:26
【问题描述】:

问题:

如何用socks5代理scrapy请求?

我知道我可以使用polipoconvert Socks Proxy To Http Proxy

但是:

我想设置一个中间件或者scrapy.Request中的一些改动

import scrapy

class BaseSpider(scrapy.Spider):
    """a base class that implements major functionality for crawling application"""
    start_urls = ('https://google.com')

    def start_requests(self):

        proxies = {
            'http': 'socks5://127.0.0.1:1080',
            'https': 'socks5://127.0.0.1:1080'
        }

        for url in self.start_urls:
            yield scrapy.Request(
                url=url,
                callback=self.parse,
                meta={'proxy': proxies} # proxy should be string not dict
            )

    def parse(self, response):
        # do ...
        pass

我应该为proxies 变量分配什么?

【问题讨论】:

    标签: python python-3.x web-scraping scrapy


    【解决方案1】:

    看看,如果有帮助https://github.com/gregoriomomm/docker-multsocks..

    它提供了一种方式(与 Docker 一样多平台)连接到 HTTP PROXY 标准协议以访问具有高级路由配置的 SOCKS5 服务器,并非所有软件都免费提供,例如在 Windows 中,您可以在本地配置一个 simples HTTP 代理(见底部配置)。

    它也可以在这种情况下使用,对于许多应用程序,例如一些可以连接到 SOCKS 但无法正确传递用户和密码来验证 SOCKS 连接的旧 java 实现,因此它可以充当 SOCKS 而无需身份验证链接到经过身份验证的。

    它基于常见的 linux 命令,也可以在 Windows 10 中重现,方法是在带有 Windows Subsystem Linux (WSL) 的 shell 上使用相同的命令。

    在 Ubuntu 中你可以直接安装它

    sudo apt install tsocks nmap
    
    # Once you have a tsocks installed and configured 
    echo "Starting http proxy!!!"
    tsocks ncat -l --proxy-type http localhost 3128 & 
    

    /etc/tsocks.conf 文件示例(将变量替换为 "v" ):

    local = 9.0.0.0/255.0.0.0
    local = 129.39.186.192/255.255.255.192
    
    path {
    reaches = 10.0.0.0/255.0.0.0
    reaches = 158.98.181.232/255.255.255.248
    reaches = 192.168.0.0/255.255.0.0
    server = vSOCKS_HOST
    server_port = vSOCKS_PORT
    server_type = 5
    default_user = vSOCKS_USERNAME
    default_pass = vSOCKS_PASSWORD
    fallback = yes
    }
    

    如果你想尝试docker版本,只需更改路径/tsocks.conf 到您的版本,它将加载一个 HTTP SOCKS 和 SOCKS5 未经身份验证的路由到您的 SOCKS5 最终目标服务器(还有其他选项)

    docker run -v path/tsocks.conf:/etc/tsocks.conf -p 3128:3128 -p 1080:1080  gregoriomomm/multsocks:latest 
    

    https://github.com/gregoriomomm/tsocks 中有一个版本的 tsocks (http://tsocks.sourceforge.net/) 以启用 tsocks(透明 SOCKS5 代理库),只需稍作调整即可使用 Alpine:3.11 工作和编译,并包含来自 Ubuntu 的相同后备选项。

    【讨论】:

    • 嗨 Gregorio,您能否在答案中提供更多关于您的 github 项目的详细信息? Github 可能不会永远存在,在这个页面上找到答案会很有帮助。如果代码太多,也许可以提供一个步骤摘要来帮助人们尝试做同样的事情?
    • 它提供了一种方式(与 Docker 一样多平台)连接到 HTTP PROXY 标准协议以访问具有高级路由配置的 SOCKS5 服务器,并非所有软件都免费提供,例如在 Windows 中,您可以在本地配置一个简单的 HTTP 代理(参见底部的配置)。它也可以在这种情况下使用,对于许多应用程序,例如一些可以连接到 SOCKS 但无法正确传递用户和密码来验证 SOCKS 连接的 java 实现,因此它可以充当 SOCKS 而无需身份验证链接到已通过身份验证。
    【解决方案2】:

    有可能。

    到 Socks5 的 HTTP 代理

    安装python-proxy

    $ pip3 install pproxy
    

    运行

    $ pproxy -l http://:8181 -r socks5://127.0.0.1:9150 -vv
    

    使用 HTTP 代理进行抓取

    创建中间件 (middlewares.py)

    class ProxyMiddleware(object):
        def process_request(self, request, spider):
            request.meta['proxy'] = "http://127.0.0.1:8181"
    

    将其分配给DOWNLOADER_MIDDLEWARES (settings.py)

    DOWNLOADER_MIDDLEWARES = {
        'PROJECT_NAME_HERE.middlewares.ProxyMiddleware': 350
    }
    

    【讨论】:

    • 这是我发现的最简单的替代privoxy 的方法。第一次尝试进行更改!
    【解决方案3】:

    中间件可能是:-

    class ProxyMiddleware(object):
        def process_request(self, request):
            request.meta['proxy'] = "socks5://127.0.0.1:1080"
    
    

    让它在你的 settings.py 文件中可用,看看它是否有效。

    【讨论】:

    • 您是否在 settings.py 中提及并附加了优先级?
    • 是的,这是 scrapy 中的请求功能。 github.com/scrapy/scrapy/issues/747
    • 我明白了。你可以改用http代理吗?还是只需要使用 socks 代理?
    • 那么在这种情况下,我建议选择 nodejs 进行抓取。它为您提供袜子代理支持。相当多的丰富的抓取库,如 axios、puppeteer,它们很容易实现。
    • 非常感谢,我知道这不是很好的做法,但我已经混合了两个框架并在Scrapy 旁边使用Django。我必须将它们分开并使用另一种语言进行爬行。
    【解决方案4】:

    目前不可能。有a feature request for it

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2021-11-08
      • 2014-08-25
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多