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

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

Используя комбинацию 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, я проделал некоторую домашнюю работу и попробовал Google Search API (устаревший) и Yahoo BOSS API (скоро будет объявлен устаревшим и заменен платным сервисом), прежде чем остановиться на Bing API. Я понимаю, что прямая очистка страницы считается плохой формой, поэтому я перейду на очистку поисковых систем напрямую.


person binarysolo    schedule 10.03.2011    source источник


Ответы (2)


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

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

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

person Mark Longair    schedule 10.03.2011
comment
Спасибо, это все, что мне нужно (разовый запрос на исследование). :-) Оцените оба ответа, которые вы дали! - person binarysolo; 10.03.2011

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

  1. Конвейерная обработка HTTP (другой фрагмент здесь)
  2. Ограничение скорости запросов сервера на каждый IP-адрес (т.е. каждый IP-адрес может выдавать только 3 запроса в секунду). Некоторые предложения можно найти здесь: Как ограничить скорость запросов к веб-сервисам на Python?
  3. Выдача запросов через внутреннюю прокси-службу с использованием http_proxy для перенаправления всех запросов в указанную службу. Затем этот прокси-сервис будет перебирать набор сетевых интерфейсов и выдавать запросы с ограниченной скоростью. Для этого вы можете использовать Twisted.
person Mahmoud Abdelkader    schedule 10.03.2011
comment
Спасибо, это намного более сложный ответ, чем мне нужно, но я очень ценю помощь. :-) Пригодится в будущем, если захочу сделать что-нибудь крутое. - person binarysolo; 10.03.2011