Почему я не могу получить доступ к сайту Digikey через urllib? - PullRequest
0 голосов
/ 11 июля 2020

Я следую руководству здесь:

Python3 Учебник по Urllib

Все работает нормально для этих первых нескольких примеров:

import urllib.request

html = urllib.request.urlopen('https://arstechnica.com').read()
print(html)

и

import urllib.request

headers = {}
headers['User-Agent'] = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:48.0) Gecko/20100101 Firefox/48.0"

req = urllib.request.Request('https://arstechnica.com', headers = headers)
html = urllib.request.urlopen(req).read()
print(html)

Но если я заменю «arstechnica» на «digikey», этот запрос urllib всегда истекает. Но сайт легко доступен через браузер. Что происходит?

1 Ответ

1 голос
/ 11 июля 2020

Большинство веб-сайтов будут пытаться защитить себя от нежелательных ботов. Если они обнаруживают подозрительный трафик c, они могут решить перестать отвечать, не закрывая соединение должным образом (в результате чего вы зависаете). Некоторые сайты более изощренны в обнаружении ботов, чем другие.

Firefox 48.0 был выпущен еще в 2016 году, поэтому Digikey будет совершенно очевидно, что вы, вероятно, подделываете информацию заголовка. Есть также дополнительные заголовки, которые обычно отправляют браузеры, а ваш скрипт не отправляет.

В Firefox, если вы откроете Инструменты разработчика и go на вкладке Монитор сети, вы можете проверить запрос на посмотрите, какие заголовки он отправляет, а затем скопируйте их, чтобы лучше отображать c поведение обычного браузера.

import urllib.request

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Upgrade-Insecure-Requests": "1"
}

req = urllib.request.Request('https://www.digikey.com', headers = headers)
html = urllib.request.urlopen(req).read()
print(html)
...