Правильный способ реализации пользовательского агента в 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)