Правильный способ реализации пользовательского агента в urllib.request.build_opener

Я пытаюсь установить пользовательский агент для моего запроса urllib:

opener = urllib.request.build_opener(
            urllib.request.HTTPCookieProcessor(cj),
            urllib.request.HTTPRedirectHandler(),
            urllib.request.ProxyHandler({'http': proxy})
)

и наконец:

response3 = opener.open("https://www.google.com:443/search?q=test", timeout=timeout_value).read().decode("utf-8")

Что было бы лучшим способом установить заголовок user-agent

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36

1 ответ

С urllib у нас есть два варианта, насколько я знаю.

build_opener возвращает OpenerDirectorобъект, который имеет addheaders приписывать. Мы можем изменить user-agent и другие заголовки с этим атрибутом.

opener.addheaders = [('User-Agent', 'My User-Agent')]

url = 'http://httpbin.org/user-agent'
r = opener.open(url, timeout=5)
text = r.read().decode("utf-8")

В качестве альтернативы, мы можем установить объект OpenerDirector на глобальный нож с помощью install_opener и использовать urlopen отправить запрос. Теперь можно использовать Request установить заголовки.

urllib.request.install_opener(opener)

url = 'http://httpbin.org/user-agent'
headers = {'user-agent': "My User-Agent"}
req = urllib.request.Request(url, headers=headers)
r = urllib.request.urlopen(req, timeout=5)
text = r.read().decode("utf-8")

Лично я предпочитаю второй метод, потому что он более последовательный. После того, как мы установим средство открытия, все запросы будут иметь одинаковые обработчики, и мы можем продолжать использовать urllib таким же образом. Однако, если вы не хотите использовать эти обработчики для всех запросов, вы должны выбрать первый метод и использовать addheaders установить заголовки для конкретного объекта OpenerDirector.


С requests все проще.

Мы можем использовать session.heders атрибут, если мы хотим изменить пользовательский агент или другие заголовки для всех запросов,

s = requests.session()
s.headers['user-agent'] = "My User-Agent"
r = s.get(url, timeout=5)

или используйте headers параметр, если мы хотим установить заголовки только для конкретного запроса.

headers = {'user-agent': "My User-Agent"}
r = requests.get(url, headers=headers, timeout=5)
Другие вопросы по тегам