Получите ответ прокси в промежуточном ПО

1

у меня в промежуточном программном обеспечении следующая проблема со скрапом:

Я делаю запрос на сайт с https, а также использую прокси. При определении промежуточного программного обеспечения и использовании в нем process_response, response.headers имеет только заголовки с веб-сайта. Есть ли способ получить заголовки из запроса CONNECT, который устанавливает прокси-туннель? Используемый нами прокси-сервер добавляет некоторую информацию в качестве заголовков в этот ответ, мы хотим использовать ее в промежуточном программном обеспечении. Я обнаружил, что в TunnelingTCP4ClientEndpoint.processProxyResponse параметр rcvd_bytes имеет всю необходимую информацию. Я не нашел способа получить rcvd_bytes в моем промежуточном программном обеспечении.

Также я нашел похожую (ту же самую) проблему год назад, которая не решена: не получать заголовки Scrapy ProxyMesh

Вот пример с прокси-сайта:

Для HTTPS IP находится в заголовке ответа CONNECT. Пример x-hola-ip для IP-адреса прокси-сервера 5.6.7.8:

Request
CONNECT example.com:80 HTTP/1.1
Host: example.com:80
Accept: */*

Response:
HTTP/1.1 200 OK
Content-Type: text/html
x-hola-ip: 5.6.7.8

Я хочу получить x-hola-ip в этом примере.

При использовании curl как curl --proxy mysuperproxy https://stackoverflow.com я также получаю правильные данные в ответе CONNECT.

Если это невозможно, моё возможное решение состоит в том, чтобы как-то до сих пор исправлять класс, или, может быть, вы знаете лучшее решение для этого в python.

Заранее спасибо за помощь.

Примечание: я также разместил этот вопрос на github проблем scrapy, я буду обновлять оба сайта, если я найду решение :)

  • 1
    Привет Бернд, добро пожаловать на ТАК! Я хотел бы поздравить вас, что это может быть лучший вопрос от нового участника, которого я когда-либо видел, так что спасибо. Как предложение, в будущем я бы добавил ссылку на проблему GitHub, которую вы создали в своем вопросе. Удачи!
  • 0
    Спасибо за подсказку, вот она: github.com/scrapy/scrapy/issues/3569
Теги:
scrapy
middleware

1 ответ

0

В # 3329 я видел, что кто-то из Scrapinghub сказал, что вряд ли они добавят эту функцию, и порекомендовал создать собственный подкласс, чтобы получить поведение, которое вы хотели. Итак, имея это в виду:

Я полагаю, что после создания подкласса вы можете указать scrapy использовать его, установив ключи http и https в DOWNLOAD_HANDLERS чтобы они указывали на ваш подкласс.

Имейте в виду, что у меня нет локального http-прокси, который отправляет дополнительные заголовки для тестирования, так что это всего лишь "набросок салфетки" того, что, по моему мнению, должно произойти:

from scrapy.core.downloader.handlers.http11 import (
    HTTP11DownloadHandler, ScrapyAgent, TunnelingAgent,
)

class MyHTTPDownloader(HTTP11DownloadHandler):
    def download_request(self, request, spider):
        # we're just overriding here to monkey patch the attribute
        ScrapyAgent._TunnelingAgent = MyTunnelingAgent
        return super(MyHTTPDownloader, self).download_request(request, spider)

class MyTunnelingAgent(TunnelingAgent):
    # ... and here is where it would get weird

Этот последний бит махает руками, потому что я считаю, что у меня есть четкое понимание методов, которые необходимо переопределить для захвата байтов, которые вы хотите, но мне не хватает структуры Twisted в моей голове, чтобы знать, где их разместить, чтобы выставить их на Response который восходит к пауку.

  • 1
    Это очень помогло мне создать рабочее решение, которое я могу использовать в моем случае. Я добавлю рабочий код в вопрос. В моем случае можно было добавить статическую переменную в MyHTTPDownloader, к которой я также могу получить доступ в промежуточном программном обеспечении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню