Как очистить веб-сайт с помощью кодирования контента с помощью Python?

#python #python-3.x #web-scraping #python-requests

#python #python-3.x #очистка веб-страниц #python-запросы

Вопрос:

Я пытаюсь очистить веб-сайт онлайн-новостей.

 st_url = "https://www.straitstimes.com/"
page = requests.get(st_url)

# Output: 
ContentDecodingError: ('Received response with content-encoding: gzip, but failed to decode it.', error('Error -3 while decompressing data: incorrect header check'))
  

Я все еще новичок в веб-очистке, и я не знаком, означает ли это, что веб-сайт запрещает мне очистку или я просто делаю это неправильно.

Помимо попыток запросов, я попытался найти ссылку XML API в Chrome Dev Tools, но не смог ее найти.

Был бы признателен за некоторую помощь здесь. Спасибо.

Ответ №1:

Если вы включите ведение журнала отладки…

 import logging
logging.basicConfig(level='DEBUG')
  

… вы увидите, что получаете 403 ответа с веб-сайта:

 >>> import logging
>>> import requests
>>> logging.basicConfig(level='DEBUG')
>>> st_url = "https://www.straitstimes.com/"
>>> page = requests.get(st_url)
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.straitstimes.com:443
DEBUG:urllib3.connectionpool:https://www.straitstimes.com:443 "GET / HTTP/1.1" 302 0
DEBUG:urllib3.connectionpool:https://www.straitstimes.com:443 "GET /global HTTP/1.1" 403 345
  

Похоже, что сайт может отклонять все, что requests отправляется в качестве пользовательского агента по умолчанию. Я попытался выполнить тот же запрос с curl из командной строки, и все сработало нормально.

Если я получу текущую строку пользовательского агента Firefox и отправлю запрос, похоже, это сработает:

 >>> page = requests.get(st_url, headers={'user-agent': 'Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'})
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.straitstimes.com:443
DEBUG:urllib3.connectionpool:https://www.straitstimes.com:443 "GET / HTTP/1.1" 302 0
DEBUG:urllib3.connectionpool:https://www.straitstimes.com:443 "GET /global HTTP/1.1" 200 51378
  

В этом случае вы можете видеть, что запрос был выполнен успешно.