#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
В этом случае вы можете видеть, что запрос был выполнен успешно.