Privoxy 'client-header-tags' не работает с сайтами HTTPS через Scrapy - PullRequest
0 голосов
/ 30 апреля 2019

Похоже, что Privoxy не может пометить заголовки HTTPS (т. Е. С помощью 'CLIENT-HEADER-TAGGER') при запросе страниц HTTPS с помощью Scrapy. Тем не менее, нет никаких проблем с заголовочными тегами, когда:

  • запрос тех же HTTPS-страниц через Privoxy с Firefox
  • запрос только HTTP-страниц через Privoxy с Scrapy

Мои причины для желания сделать это: В конечном итоге я хочу иметь возможность использовать несколько экземпляров Tor с Scrapy (используя модули Python STEM и / или 'torrequest'). Однако я не хочу также запускать один экземпляр Privoxy на экземпляр Tor (если я могу помочь). Я считаю, что более эффективный способ - включить HTTP-заголовок в паук Scrapy, который идентифицирует порт Tor, который будет использоваться для этого конкретного запроса. Privoxy будет использовать CLIENT-HEADER-TAGGER для определения указанного номера порта и переадресации на соответствующий порт SOCKS Tor. Таким образом, требуется только один экземпляр Privoxy.

Это прекрасно работает, если вы используете Firefox в качестве клиента. Пока я не беспокоюсь о нескольких экземплярах Tor и портах, мне просто нужно знать, правильно ли я использую теги заголовков. Итак, я использую ранее существующий тэг user-agent в Privoxy - например ::

Firefox -> Фильтры Privoxy для пользовательского агента "Mozilla" -> перенаправляет на Tor -> site 'https://check.torproject.org/' отображает' Поздравления 'с IP-адресом tor.

Итак, я знаю, что у меня правильно настроены теги в Privoxy. Чтобы быть уверенным в этом, я намеренно неправильно написал пользовательский агент в файле действий Privoxy как «MMozilla». Переопределение пересылки больше не включается, и Privoxy вместо этого возвращается к пересылке через Burp Suite на «: 8080», и на сайте проверки Tor отображается мой обычный IP-адрес.

Теперь, переключаясь на Scrapy (и снова исправляя тег user-agent, чтобы он совпадал с «Mozilla»), я запрашиваю 'https://check.torproject.org/'. Страница возвращается правильно (поэтому, очевидно, нет общих проблем при загрузке страниц HTTPS), однако он показывает мой обычный IP (не Tor IP). Интересно, что если я попрошу Scrapy запросить 'http://ip -check.info / ' I do получить Tor IP (вместе с предупреждением "Неизвестный IP-адрес, возможно, ваш собственный , был обнаружен HTTPS).

Я отсканировал документацию Scrapy на предмет каких-либо, казалось бы, важных деталей, касающихся промежуточного программного обеспечения для загрузчиков и тому подобного, но ничего не нашел (и я не уверен, применим ли этот аспект здесь, так как я запускаю паука) из сценария вне любого проекта Scrapy).

Файл privoxy 'default.filter':

CLIENT-HEADER-TAGGER: user-agent

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

Файл 'user.action' Privoxy:

{+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 (запускается как скрипт, а не из проекта 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, Scrapy 1.5.2 через Anaconda 3, Privoxy и Tor установлены / обновлены через Homebrew

Я ожидаю, что Privoxy сможет фильтровать теги заголовков клиентов HTTPS из Scrapy, так же, как из Firefox. Хотя я вижу, что они корректно фильтруются, если я получаю от Scrapy запрос на страницу по HTTP. Считает ли Scrapy страницы через HTTPS иначе, чем браузеры, что делает его заголовки нечитаемыми при передаче? Если так, есть ли возможный обходной путь для достижения того, чего я хочу?

...