当使用Scrapy请求HTTPS页面时,Privoxy似乎无法标记HTTPS标头(即通过使用“ CLIENT-HEADER-TAGGER”)。但是,在以下情况下,标头标记符没有问题:
我要这样做的原因:我最终希望能够通过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来获取页面,从而使其标头在传输过程中不可读?如果是这样,是否有可行的解决方法来实现我想要的?