Как правильно определить общее количество результатов поиска по ключевым словам?

Начинающий программист и тайник здесь, надеясь на какой-нибудь разумный совет.:)

Используя комбинацию Python, BeautifulSoup и Bing API, я смог найти то, что хотел, с помощью следующего кода:

import urllib2
from BeautifulSoup import BeautifulStoneSoup

Appid = #My Appid
query = #My query

soup = BeautifulStoneSoup(urllib2.urlopen("http://api.search.live.net/xml.aspx?Appid=" + Appid + "&query=" + query + "&sources=web"))
totalResults = soup.find('web:total').text

Так что я хотел бы сделать это через несколько тысяч поисковых терминов, и мне было интересно, если

  1. выполнение этого запроса тысячу раз было бы истолковано как удар по серверу,
  2. какие шаги я должен предпринять, чтобы не забивать указанные серверы (каковы лучшие практики?), и
  3. Есть ли более дешевый (данные) способ сделать это с помощью любого из основных API поисковых систем?

Просто кажется неоправданно дорогим собирать все эти данные, чтобы получить только одно число на ключевое слово, и мне было интересно, пропустил ли я что-нибудь.

FWIW, я выполнил некоторую домашнюю работу и попробовал API поиска Google (устарел) и API BOSS Yahoo (скоро будет объявлен устаревшим и заменен платным сервисом), прежде чем согласиться с Bing API. Я понимаю, что прямая очистка страницы считается плохой формой, поэтому я перейду непосредственно к поисковым системам.

2 ответа

Решение

Что касается вашего вопроса 1, у Bing есть PDF-файл Основ API, в котором сводные положения и условия представлены в удобочитаемой форме. В разделе "Что вы должны сделать". Это включает следующее утверждение:

Ограничьте использование менее 7 запросов в секунду (QPS) на IP-адрес. Вам может быть разрешено превышать этот лимит при некоторых условиях, но это должно быть одобрено путем обсуждения с api_tou@microsoft.com.

Если это всего лишь одноразовый скрипт, вам не нужно делать ничего более сложного, чем просто добавить sleep между запросами, так что вы делаете только пару запросов в секунду. Если ситуация более сложная, например, эти запросы выполняются как часть веб-службы, предложения в ответе Махмуда Абделькадера должны помочь вам.

Есть три подхода, о которых я мог подумать ранее, когда мне приходилось выполнять масштабное разрешение URL.

  1. HTTP Pipelining (другой фрагмент здесь)
  2. Ограничивающие скорость запросы к серверу на IP (т. Е. Каждый IP может выдавать только 3 запроса в секунду). Некоторые предложения можно найти здесь: Как ограничить частоту запросов к веб-сервисам в Python?
  3. Выдача запросов через внутренний прокси-сервис, используя http_proxy перенаправить все запросы на указанный сервис. Затем эта прокси-служба будет перебирать набор сетевых интерфейсов и выдавать запросы с ограниченной скоростью. Вы можете использовать Twisted для этого.
Другие вопросы по тегам