Privoxy'client-header-tags'无法通过Scrapy与HTTPS站点一起使用

时间:2019-04-30 14:47:51

标签: scrapy tor privoxy

当使用Scrapy请求HTTPS页面时,Privoxy似乎无法标记HTTPS标头(即通过使用“ CLIENT-HEADER-TAGGER”)。但是,在以下情况下,标头标记符没有问题:

  • 使用Firefox通过Privoxy请求相同的HTTPS页面
  • 使用Scrapy通过Privoxy仅请求HTTP页面

我要这样做的原因:我最终希望能够通过Scrapy使用Tor的多个实例(通过使用Python STEM和/或“ torrequest”模块)。但是我不想每个Tor实例也启动一个Privoxy实例(如果我可以帮助的话)。我相信一种更有效的方法是在Scrapy Spider中包含HTTP标头,该标头标识用于该特定请求的Tor端口。 Privoxy将使用CLIENT-HEADER-TAGGER来标识指定的端口号并转发到适当的Tor SOCKS端口。这样,只需要一个Privoxy实例。

如果使用Firefox作为客户端,则可以正常工作。现在,我不必担心多个Tor实例和端口,只需要知道我是否正确使用了标题标记即可。因此,我使用的是Privoxy预先存在的用户代理标签-例如:

Firefox->用于用户代理“ Mozilla”的Privoxy过滤器->转发到Tor->网站“ https://check.torproject.org/”显示“祝贺”,带有tor IP。

因此,我知道我在Privoxy中已正确设置了设置标签。为确保这一点,我故意将Privoxy动作文件中的用户代理拼写为“ MMozilla”。转发优先级不再起作用,Privoxy而是回退到“:8080”上通过Burp Suite进行转发,并且Tor检查站点显示了我的常规IP。

现在,切换到Scrapy(并再次校正用户代理标签以匹配“ Mozilla”),我请求“ https://check.torproject.org/”。该页面已正确返回(显然,获取HTTPS页面不会出现一般问题),但是它显示了我的常规IP(而不是Tor IP)。有趣的是,如果我要求Scrapy请求'http://ip-check.info/',我会得到一个Tor IP(并附有一个警告:“ HTTPS发现了一个未知IP地址,可能是您自己的IP地址)。< / p>

我已经在Scrapy文档中扫描了有关下载器中间件之类的看似相关的详细信息,但未找到任何信息(而且我不确定该方面是否适用于此,因为我正在运行Spider。来自任何Scrapy项目之外的脚本)。

Privoxy的“ default.filter”文件:

CLIENT-HEADER-TAGGER: user-agent

s@^User-Agent:.*@$0@i

Privoxy的“ user.action”文件:

{+client-header-tagger{user-agent}} 
/

{+forward-override{forward-socks5t 127.0.0.1:9050 .}}
TAG:^User-Agent: Mozilla

Privoxy配置文件转发给Tor。我所做的唯一更改是将后备转发转发到我的Burp Suite代理(省略了试用期):

forward  /  127.0.0.1:8080

Scrapy Spider(作为脚本运行,而不是在Scrapy项目中运行):

import scrapy
from scrapy.crawler import CrawlerProcess
import pprint

class TorSpider(scrapy.Spider):
    name = "scrapytor"

    urls = [
        #'https://check.torproject.org'
        "http://ip-check.info/?lang=en"
    ] 

    def start_requests(self):
        for i, url in enumerate(self.urls):
            yield scrapy.Request(
                url,
                callback=self.parse,
                headers = {
                #    "Accept":
                #    "text/html,application/xhtml+xml,
                #    "Accept-Encoding": "gzip, deflate
                #    "Accept-Language": "en-GB,en-US;q
                #    "Connection": "keep-alive",
                #    "Host": "check.torproject.org",
                #    "Cache-Control": "max-age=0",
                #    "Upgrade-Insecure-Requests": "1"

                    'Accept':
'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                    'Accept-Encoding': 'gzip, deflate',
                    'Accept-Language': 'en-US,en;q=0.5',
                    'Connection': 'keep-alive',
                    'Host': 'ip-check.info',
                    'Upgrade-Insecure-Requests': '1'
                },
                meta = {
                    'cookiejar': i,
                    'proxy': 'http://127.0.0.1:8118'
                }
            )

    def parse(self, response):
        pp = pprint.PrettyPrinter(indent=4)
        self.log(pp.pprint(response.text))

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0',
    'COOKIES_ENABLED': 'True'
})

process.crawl(TorSpider)
process.start()

macOS 10.14.4,通过Anaconda 3的Scrapy 1.5.2,通过Homebrew安装/更新的Privoxy和Tor

我希望Privoxy能够像从Firefox一样过滤来自Scrapy的HTTPS客户端标头标签。虽然,我可以看到,如果我让Scrapy通过HTTP请求页面,它可以正确过滤它们。 Scrapy是否以与浏览器不同的方式通过HTTPS来获取页面,从而使其标头在传输过程中不可读?如果是这样,是否有可行的解决方法来实现我想要的?

0 个答案:

没有答案