у меня в промежуточном программном обеспечении следующая проблема со скрапом:
Я делаю запрос на сайт с 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, я буду обновлять оба сайта, если я найду решение :)
В # 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
который восходит к пауку.