banner

Парсер google через ajax search api

Простейший парсер google через api. Кому надо, тот сам доведёт до ума, с меня только идея :) . Позволяет парсить примерно 60к ссылок без бана и капчи с 1 Ip, для большей работоспособности без бана можно попробовать добавить задержку.
Все файлы должны быть в utf-8.

# coding:utf-8
# author: Rushter
# site: http://klipner.ru
import urllib2,random,re,time,json,urllib
ff = open("ua.txt").readlines()
ques = open("query.txt").readlines()
out = open("parsed_query.txt","a")
err = 0
for query in ques:
    try:
        for j in range(0,12,4):
            header = {"User-Agent":random.choice(ff)}
            lnk = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&start={0}&q={1}".format(str(j),urllib.quote(query.strip("\r\n")))
            page_request = urllib2.Request(url=lnk, headers=header)
            page = urllib2.urlopen(url=page_request)
            pp = json.load(page)["responseData"]["results"]
            try:
                for i in xrange(4):
                    out.write(pp[i]["unescapedUrl"]+"\n")
                out.flush()
            except:
                if err>100:
                    break
    except:
        if err>100:
            break
        err = err+1
  • ppbi

    мне выдает ошибку в 21 строке :\

  • http://klipner.ru rushter

    Поправил.

  • Cabal

    Если без прокси надо заюзать ajax search api то либа xgoogle есть уже. А вообще спасибо навёл на мысль, я почему то и не подумал что через api должны преференции быть определённые да и когда юзал xgoogle для translate.google он мне очень быстро выкидывал сообщения о нарушении правил позирования api пока я задержку не поставил, что не внушало…

  • Cabal

    Не «позирования » а «пользования» в прошлом каменте. Подвела исправлялка ошибок в ff :)

  • Cabal

    Стоп. Отставить. Посмотрел код модуля searh из xgoogle он оказывается не на api а как простой парсер. Странная там штука модуль переводчик юзает api модуль парсер – нет.
    Тогда вдвойне спасибо ещё и за пример. :D

  • ppbi

    охуенно пашет :) спасибо

  • Мария Хуана

    Результаты ajax search api и те что выдает гугл в основной выдаче ну очень сильно различаются, гугловцы сами об этом писали неоднократно.

  • dr.canibal

    Всё работает отлично, но есть одно «но».
    В ответе получаются только 8 страниц по 4 записи. Можно ли как-то увеличить количество записей на странице и количество страниц?

  • http://klipner.ru rushter

    Ограничения такие, этот скрипт для массового парсинга запросов и результатов топа.

  • dr.canibal

    только вот позицию в выдаче никак не определишь. 5 раз послал один и тот же запрос и получил 5 разых ответов. (
    В этом примере не используется ключ API.
    Если его передать в запросе – это не сможет повлиять на результаты?

  • http://klipner.ru rushter

    Не знаю, не пробовал.
    Такой скрипт хорош для сбора ресурсов под постилки.

  • http://djangoproject.su/ Djangoman

    А не видели ли что нибуть похожее для yandex?

  • http://klipner.ru rushter

    Есть, если поискать по блогу можно найти.

  • Ug

    А как это использовать? Можно объяснить подробнее?
    Я не программист.

  • http://klipner.ru rushter

    Закинуть в файлы данные и запустить.
    Что тут ещё можно объяснить.

  • Ug

    rushter, а можно поподробнее, пожалуйста?

    Что нужно сделать? Сохранить этот код как code.py?
    Начнем с того, что у меня Винда. Стоят, также, пакеты perl и python.
    urllib2 – что это?

    Короче, объясни пожалуйста, от А до Я, как с нуля запустить этот скрипт и проверить 20k ссылок.

  • http://klipner.ru rushter

    В query.txt закинуть запросы, в ua.txt закинуть user-agent. Запустить и ждать :)
    Про запуск python скриптов можно в гугле найти.

  • Ug

    Я уже сам понял :-)
    А где задержку выставить? Вот это – err = 0? В мс?
    И еще, как она проверяет? Сколько результатов парсит с одного запроса? А можно ли как-то индикатор добавить, а то непонятно – работает или нет.

  • http://klipner.ru rushter

    Задержка тут не нужна, тут капчи нету.
    Если охото поставить, то:
    import time
    time.sllep(3); # 3 секунды.

    Это всего лишь пример альтернативного парсинга, поэтому доделывать до вида для обычных пользователей я не буду.