Как правильно определить общее количество результатов поиска по ключевым словам?
Начинающий программист и тайник здесь, надеясь на какой-нибудь разумный совет.:)
Используя комбинацию 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
Так что я хотел бы сделать это через несколько тысяч поисковых терминов, и мне было интересно, если
- выполнение этого запроса тысячу раз было бы истолковано как удар по серверу,
- какие шаги я должен предпринять, чтобы не забивать указанные серверы (каковы лучшие практики?), и
- Есть ли более дешевый (данные) способ сделать это с помощью любого из основных API поисковых систем?
Просто кажется неоправданно дорогим собирать все эти данные, чтобы получить только одно число на ключевое слово, и мне было интересно, пропустил ли я что-нибудь.
FWIW, я выполнил некоторую домашнюю работу и попробовал API поиска Google (устарел) и API BOSS Yahoo (скоро будет объявлен устаревшим и заменен платным сервисом), прежде чем согласиться с Bing API. Я понимаю, что прямая очистка страницы считается плохой формой, поэтому я перейду непосредственно к поисковым системам.
2 ответа
Что касается вашего вопроса 1, у Bing есть PDF-файл Основ API, в котором сводные положения и условия представлены в удобочитаемой форме. В разделе "Что вы должны сделать". Это включает следующее утверждение:
Ограничьте использование менее 7 запросов в секунду (QPS) на IP-адрес. Вам может быть разрешено превышать этот лимит при некоторых условиях, но это должно быть одобрено путем обсуждения с api_tou@microsoft.com.
Если это всего лишь одноразовый скрипт, вам не нужно делать ничего более сложного, чем просто добавить sleep
между запросами, так что вы делаете только пару запросов в секунду. Если ситуация более сложная, например, эти запросы выполняются как часть веб-службы, предложения в ответе Махмуда Абделькадера должны помочь вам.
Есть три подхода, о которых я мог подумать ранее, когда мне приходилось выполнять масштабное разрешение URL.
- HTTP Pipelining (другой фрагмент здесь)
- Ограничивающие скорость запросы к серверу на IP (т. Е. Каждый IP может выдавать только 3 запроса в секунду). Некоторые предложения можно найти здесь: Как ограничить частоту запросов к веб-сервисам в Python?
- Выдача запросов через внутренний прокси-сервис, используя
http_proxy
перенаправить все запросы на указанный сервис. Затем эта прокси-служба будет перебирать набор сетевых интерфейсов и выдавать запросы с ограниченной скоростью. Вы можете использовать Twisted для этого.