Почему я получаю этих странных персонажей с помощью скрапа вместо HTML? - PullRequest
0 голосов
/ 21 октября 2019

Это просто хобби для меня. Я пытаюсь получить html стартовой страницы booking.com через scappy.

  def start_requests(self):
        print('step 1')
        start_url = 'https://www.booking.com'
        yield scrapy.Request(url=start_url, headers=self.headers, callback=self.step2)

    def step2(self, response):
        print('step 2')
        print(response.status)
        print(response.headers)
        print(response.text)

и я получаю что-то странное в response.text. Это часть ответа:

O�����xa�X��_ \ O ^ 'IM�l�F��6 (] 1�r��LB> �Ога # р:. х} 8RhӓQ2hƺUs & 0 {л] Y & F9� @ �WCR��������7� **) JE-�-�� & ��) Լ S����y���z�R� @ �J�����1�N60 & 'LKE R.Ҙɧ�e���S��ϵ��C�(��6$�&���L2���������{���B^�@��~~['� ����T2�|"|��X�L 5˔-�خ� A J8X @ 5`y *: O⎻␊R�71┴�A "≠ �E ٹ���� [�9 B��6, ���� # � $ 0% (L�2 '° ��≤≥� & �Ď�Lȋ7� <����* p�ABU�ālK� = ���i ݐ�'� b> I�'�J��o7�����e� | �≥�4� �Vď�L�0���� ◆ �x Ւ Pef���� & l��d {X�h��� # �� q $ �d� $ ����? �: �M�� & jb {���0������ @ � ���S�_�����4ztlS��4�2 ^ �����5 ^ �7'� QFUH: ��7▒��│ �┘�.�����ݔ M␋ȵA⎽: Z: F├D- ߯8 * ǠH * │ JCoe2 |} жо & "Kjy� <�% Z�;! M��t ۩ ~ � R�cy2�> D�h�p���3�4���x�y1��T \ ���IY��F�(�E��ì� � [

Это похоже на фальшивые данные. Каждый раз ответ разный. Когда я пытаюсь сделать аналогичный запрос через почтальон, все работает хорошо. Я получаю код -302 ответ со ссылкой, которая открывает сайт без ошибок. Я думаю, что бронирование обнаруживает, что мой код скребок, но я не понимаю, как. IP-адрес совпадает с почтальоном, почтальон также проигнорировал javascript, поэтому я не знаючто происходит. Помоги мне, пожалуйста. Спасибо!

1 Ответ

2 голосов
/ 22 октября 2019

Вы получаете необработанный сжатый ответ, что довольно странно, обычно scrapy обрабатывает сеанс HTTP и сжатые данные самостоятельно благодаря CookiesMiddleware и HttpCompressionMiddleware, они оба включены по умолчанию. Вы жестко закодировали Accept-Encoding в своем коде?

# Content-Encoding set to gzip in response, since client supports it.
curl -H 'Accept-Encoding: gzip' -v https://www.booking.com 1>/dev/null 2>&1 | grep content-encoding

# It shows binary data, you can decompress with -c
curl -H 'Accept-Encoding: gzip' https://www.booking.com
curl -c -H 'Accept-Encoding: gzip' https://www.booking.com

# No Content-Encoding from response if the client don't want gzip.
curl -v https://www.booking.com 1>/dev/null 2>&1 | grep content-encoding
...