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

Я программно взаимодействую с поисковой системой, и мне нужно заставить ее думать, что я человек, делающий запросы, а не робот. Это включает в себя создание запросов, которые кажутся правдоподобными для любого обычного пользователя, например, «расписание футбола ncaa» или «когда была посадка на Луну?» Я буду делать более тысячи таких запросов ежедневно, и поиск случайных слов из словаря не поможет, так как это не очень типичная поисковая привычка.

До сих пор я думал о нескольких способах создания реалистичных запросов:

  • Получите список самых популярных поисковых запросов Google (или Yahoo, Bing и т. д.) за день.
  • Воспользуйтесь функцией автозаполнения Google, введя случайное слово из словаря, за которым следует пробел, и выберите рекомендуемые запросы.

Последний подход звучит так, как будто он потребует много обратного проектирования. И при первом подходе мне не удалось найти список из более чем 80 или около того запросов — единственными источниками, которые я нашел, являются тренды AOL (50–100) и Тренды Google (30).

Как мне создать большой набор человекоподобных поисковых фраз?
(Для любых ответов, зависящих от языка: я программирую на Python)


person Ponkadoodle    schedule 08.09.2013    source источник


Ответы (1)


Хотя это, скорее всего, нарушает TOS Google, вы можете легко очистить данные автозаполнения:

import requests
import json

def autocomplete(query, depth=1, lang='en'):
    if depth == 0:
        return

    response = requests.get('https://clients1.google.com/complete/search', params={
        'client': 'hp',
        'hl': lang,
        'q': query
    }).text

    data = response[response.index('(') + 1:-1]
    o = json.loads(data)

    for result in o[1]:
        suggestion = result[0].replace('<b>', '').replace('</b>', '')
        yield suggestion

        if depth > 1:
            for s in autocomplete(suggestion, depth - 1, lang):
                yield s

autocomplete('a', depth=2) дает вам 110 самых популярных запросов, начинающихся с a (с некоторыми дубликатами). Очистите каждую букву до глубины 2, и у вас должна быть масса законных запросов на выбор.

person Blender    schedule 08.09.2013
comment
Ничего себе, намного проще, чем ожидалось. Спасибо за это. Он генерирует дубликаты для глубины › 1, хотя это можно легко исправить, изменив yield suggestion на if depth == 1: yield suggestion. - person Ponkadoodle; 09.09.2013