правильный способ реализации пользовательского агента в urllib.request.build_opener - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь установить пользовательский агент для моего запроса 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")

Как лучше всего настроить пользовательский агентзаголовок к

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 Ответ

0 голосов
/ 29 октября 2018

С 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, если мы хотим изменить user-agent или другие заголовки для всех запросов,

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)
...