Скрейпинг экрана: как обойти "Ошибка HTTP 403: запрос запрещен robots.txt"
Заголовок: Как обойти ошибку HTTP 403: доступ запрещен robots.txt при использовании mechanize и BeautifulSoup?
Я столкнулся с проблемой при попытке получить доступ к данным с сайта barnesandnoble.com. При выполнении запроса я получаю следующую ошибку:
httperror_seek_wrapper: HTTP Error 403: request disallowed by robots.txt
Имеется ли способ обойти эту ситуацию? Меня интересует, только ли связаться с владельцем сайта (barnesandnoble.com) для разрешения доступа, поскольку я разрабатываю ресурс, который, по моему мнению, мог бы принести им дополнительные продажи. Не понимаю, почему они ограничивают доступ на определенной глубине.
Я использую библиотеки mechanize и BeautifulSoup на Python 2.6.
Надеюсь на помощь в поиске обходного решения.
5 ответ(ов)
Вам нужно игнорировать файл robots.txt. Для этого в библиотеке mechanize
вы можете настроить браузер следующим образом:
br = mechanize.Browser()
br.set_handle_robots(False)
Таким образом, set_handle_robots(False)
отключает соблюдение правил, указанных в файле robots.txt, и ваши запросы будут отправляться без ограничений, которые он накладывает.
Вы можете попробовать обойти систему, изменив свой user agent, чтобы создать видимость, будто вы - человек, а не робот. Однако это может привести к юридическим последствиям с Barnes & Noble. Почему бы вместо этого не обратиться в их отдел разработки бизнеса и не попробовать убедить их выдать вам специальное разрешение? Они, возможно, просто пытаются избежать сканирования своего сайта определёнными типами роботов, такими как системы сравнения цен, и если вы сможете убедить их в том, что вы не из их числа, подписать контракт и т.п., они могут быть готовы сделать для вас исключение.
Использование "технического" обходного метода, который просто нарушает их правила, записанные в robots.txt, - это рискованный подход с точки зрения закона, который я бы никогда не рекомендовал. Кстати, как выглядит их файл robots.txt?
Вот код, который позволяет сделать корректный запрос с использованием библиотеки mechanize
:
import mechanize
br = mechanize.Browser()
br.set_handle_robots(False) # Игнорируем правила robots.txt
# Устанавливаем заголовок User-Agent
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# Открываем указанный URL
resp = br.open(url)
# Выводим заголовки ответа
print(resp.info()) # заголовки
# Выводим содержимое ответа
print(resp.read()) # контент
Обратите внимание на то, что мы отключаем обработку файла robots.txt
, чтобы избежать ограничений, а также устанавливаем пользовательский агент, чтобы сайт не блокировал запросы от скриптов.
Mechanize автоматически следует указаниям из robots.txt, но это поведение можно отключить, если у вас есть разрешение или вы хорошо обдумали этические аспекты.
Чтобы игнорировать robots.txt, установите флаг в вашем браузере:
browser.set_handle_equiv(False)
Также не забудьте ограничить количество ваших запросов, чтобы не создавать избыточную нагрузку на их сайт. Это также снижает вероятность того, что вас обнаружат и забанят.
Ошибка, которую вы получаете, не связана с User-Agent. Библиотека mechanize по умолчанию автоматически проверяет директивы robots.txt, когда вы используете ее для навигации по сайту. Чтобы отключить это поведение, используйте метод .set_handle_robots(False)
у объекта механизма (mechanize.Browser).
UnicodeEncodeError: 'ascii' кодек не может закодировать символ u'\xa0' на позиции 20: номер не в диапазоне (128)
Как найти элементы по классу
UnicodeEncodeError: кодек 'charmap' не может закодировать символы
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата