Подтвердить что ты не робот

Изменение User Agent в Python 3 для urrlib.request.urlopen

Я хочу открыть URL-адрес, используя urllib.request.urlopen('someurl'):

with urllib.request.urlopen('someurl') as url:
b = url.read()

Я продолжаю получать следующую ошибку:

urllib.error.HTTPError: HTTP Error 403: Forbidden

Я понимаю, что ошибка связана с тем, что сайт не пускает доступ к нему на python, чтобы остановить ботов, тратящих свои сетевые ресурсы, что понятно. Я пошел искать и обнаружил, что вам нужно изменить агент пользователя для urllib. Однако все руководства и решения, которые я нашел для этой проблемы относительно того, как изменить агент пользователя, были с urllib2, и я использую python 3, поэтому все решения не работают.

Как я могу исправить эту проблему с помощью python 3?

4b9b3361

Ответ 1

Из Документов Python:

import urllib.request
req = urllib.request.Request(
    url, 
    data=None, 
    headers={
        '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'
    }
)

f = urllib.request.urlopen(req)
print(f.read().decode('utf-8'))

Ответ 2

from urllib.request import urlopen, Request

urlopen(Request(url, headers={'User-Agent': 'Mozilla'}))

Ответ 3

Я просто ответил на аналогичный вопрос: fooobar.com/questions/176468/...

Если вы просто не просто хотите открыть URL-адрес, но также хотите загрузить ресурс (скажем, файл PDF), вы можете использовать код, как показано ниже:

    # proxy = ProxyHandler({'http': 'http://192.168.1.31:8888'})
    proxy = ProxyHandler({})
    opener = build_opener(proxy)
    opener.addheaders = [('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30')]
    install_opener(opener)

    result = urlretrieve(url=file_url, filename=file_name)

Причина, по которой я добавил прокси, - следить за трафиком в Чарльзе, и вот трафик, который я получил:

См. User-Agent

Ответ 4

Отклонение узла узла происходит из основных правил OWASP ModSecurity для модульной безопасности Apache. Правило 900002 имеет список "плохих" пользовательских агентов, а один из них - "python-urllib2". Поэтому запросы с пользовательским агентом по умолчанию не выполняются.

К сожалению, если вы используете функцию "robotparser" Python,

https://docs.python.org/3.5/library/urllib.robotparser.html?highlight=robotparser#module-urllib.robotparser

он использует пользовательский агент Python по умолчанию, и нет никакого параметра для его изменения. Если попытка "robotparser" прочитать "robots.txt" будет отказана (а не только URL не найден), тогда он обрабатывает все URL-адреса с этого сайта как запрещенные.