Почему поиск Google возвращает ошибку HTTP 403?

Рассмотрим следующий код Python:

 30 url = "http://www.google.com/search?hl=en&safe=off&q=Monkey"
 31 url_object = urllib.request.urlopen (url);
 32 печать (url_object.read ());

Когда это выполняется, выдается исключение:

File "/usr/local/lib/python3.0/urllib/request.py", line 485, in http_error_default
   raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

Однако, когда это помещается в браузер, поиск возвращается, как и ожидалось. Что тут происходит? Как я могу решить эту проблему, чтобы программно выполнять поиск в Google?

Есть предположения?

Ответов (4)

Решение

Если вы хотите «правильно» выполнять поиск в Google через программный интерфейс, обратите внимание на API Google . Это не только официальный способ поиска в Google, но и маловероятно, что он изменится, если Google изменит макет страницы результатов.

Как предположил Лаки , API Google - это то, как они хотят, чтобы вы выполняли запросы из кода. К сожалению, я обнаружил, что их документация предназначена для людей, которые пишут веб-страницы AJAX, а не делают необработанные HTTP-запросы. Я использовал заголовки LiveHTTP для отслеживания HTTP-запросов, сделанных образцами, и нашел сообщение в блоге ddipaolo полезным.

Еще одна вещь, которая меня сбила с толку: они ограничивают вас первыми 64 результатами запроса. Обычно это не проблема, если вы просто предоставляете веб-пользователям окно поиска, но бесполезно, если вы пытаетесь использовать Google для интеллектуального анализа данных. Думаю, они не хотят, чтобы вы занимались интеллектуальным анализом данных с помощью их API. Это число 64 изменилось с течением времени и варьируется в зависимости от поискового продукта.

Обновление: похоже, они определенно не хотят, чтобы вы занимались интеллектуальным анализом данных. В конце концов вы получите ошибку 403 со ссылкой на это уведомление о доступе к API .

Ознакомьтесь с Условиями использования API, которые вы используете (ссылки на правой боковой панели), и убедитесь, что они соблюдаются. Вероятно, мы заблокировали вас за одно из следующих нарушений Условий использования: Мы получили автоматические запросы, такие как очистка и предварительная выборка. Запрещены автоматические запросы; все запросы должны быть сделаны в результате действия конечного пользователя.

Они также перечисляют другие нарушения, но я думаю, что это то, что спровоцировало меня. Возможно, мне придется исследовать службу Yahoo BOSS. Кажется, у него не так много ограничений.

Вы делаете это слишком часто. У Google есть ограничения, чтобы не попасть в ловушку поисковых роботов. Вы также можете попробовать настроить пользовательский агент на что-то более похожее на обычный браузер.

это должно сработать

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'

url = "http://www.google.com/search?hl=en&safe=off&q=Monkey"
headers={'User-Agent':user_agent,} 

request=urllib2.Request(url,None,headers) //The assembled request
response = urllib2.urlopen(request)
data = response.read() // The data u need