2013-07-09 1 views
2

Я пытался использовать xgoogle, но я не обновлялся в течение 3 лет, и я просто получаю не более 5 результатов, даже если я установил 100 результатов на страницу. Если кто-либо использует xgoogle без каких-либо проблем, пожалуйста, дайте мне знать.Обновленный подход к поиску Google с помощью python

Теперь, поскольку единственной доступной (по-видимому) оболочкой является xgoogle, можно использовать какой-то браузер, например, механизировать, но это сделает код полностью зависящим от HTML-кода Google, и они могут сильно его изменить.

Окончательный вариант заключается в использовании API пользовательского поиска, который предлагает Google, но имеет предикат 100 запросов в день и стоимость после этого.

Мне нужна помощь в каком направлении я должен идти, какие другие варианты вы знаете и что работает для вас.

Спасибо!

ответ

2

Для этого нужен только небольшой патч.

Функция GoogleSearch._extract_result (строка 237 search.py) вызывает GoogleSearch._extract_description (строка 258), которая не позволяет _extract_result возвращать None для большинства результатов, поэтому показывает меньше результатов, чем ожидалось.

Fix:

В search.py, изменить линию 259 из этого:

desc_div = result.find('div', {'class': re.compile(r'\bs\b')}) 

к этому:

desc_div = result.find('span', {'class': 'st'}) 

Я тестировалось с помощью:

#!/usr/bin/python 
# 
# This program does a Google search for "quick and dirty" and returns 
# 200 results. 
# 

from xgoogle.search import GoogleSearch, SearchError 

class give_me(object): 
    def __init__(self, query, target): 
     self.gs = GoogleSearch(query) 
     self.gs.results_per_page = 50 
     self.current = 0 
     self.target = target 
     self.buf_list = [] 

    def __iter__(self): 
     return self 

    def next(self): 
     if self.current >= self.target: 
      raise StopIteration 
     else: 
      if(not self.buf_list): 
       self.buf_list = self.gs.get_results() 
      self.current += 1 
      return self.buf_list.pop(0) 

try: 
    sites = {} 
    for res in give_me("quick and dirty", 200): 
     t_dict = \ 
     { 
      "title" : res.title.encode('utf8'), 
      "desc" : res.desc.encode('utf8'), 
      "url" : res.url.encode('utf8') 
     } 
     sites[t_dict["url"]] = t_dict 
    print t_dict 
except SearchError, e: 
    print "Search failed: %s" % e 
1

Я думаю, вы не понимаете, что xgoogle есть. xgoogleне обертка; это библиотека, которая подделывает человека как пользователь с браузером и срывает результаты. Он сильно зависит от формата поисковых запросов и страниц результатов Google с 2009 года, поэтому неудивительно, что он не работает в 2013 году. См. the announcement blog post для получения более подробной информации.

Вы можете, конечно, взломать источник xgoogle и попытаться заставить его работать с текущим форматом Google (как оказалось, они случайно сломали xgoogle), но это просто снова сломается.


Между тем, вы пытаетесь обойти Google, Terms of Service:

Не злоупотреблять наши услуги. Например, не мешайте нашим службам или пытайтесь получить к ним доступ, используя метод, отличный от интерфейса и инструкций, которые мы предоставляем.

Они были специально просили именно о том, что вы пытаетесь сделать, и their answer является:

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

И вы даже сказать, что это явно то, что вы хотите сделать:

Окончательный вариант заключается в использовании пользовательского поиска API, который Google Offers, но имеет redicolous 100 запросов в лимит день и цены после этого.

Итак, вы ищете способ получить доступ к поиску Google, используя метод, отличный от предоставляемого им интерфейса, в преднамеренной попытке обойти свою бесплатную квоту использования без уплаты. Они полностью в пределах своих прав делать все, что хотят разбить ваш код, - и если они получат достаточное количество хитов от людей, которые что-то делают, они это сделают.

(Обратите внимание, что когда программа очищает результаты, никто не видит объявления, а объявления - это то, что платят за все это.)


Конечно, никто не заставляет вас использовать Google. В EntireWeb есть бесплатный «неограниченный» (как в API поиска «пока вы не используете слишком много, а мы не указали ограничение»). Bing дает вам более высокую квоту и амортизируется месяцем, а не днем. Yahoo BOSS является гибким и супер-дешевым (и даже предлагает «дисконтный сервер», который обеспечивает более низкие результаты, если он не является достаточно дешевым), хотя я считаю, что вы вынуждены вводить смешной восклицательный знак. Если ни один из них не будет достаточно для вас ... затем заплатите за Google.

+0

Это кажется чтобы быть правильным ответом и тем, что я искал, Я буду отмечать как правильный ответ, как только я это докажу, спасибо! – PepperoniPizza

Смежные вопросы