19 апр. 2012 г.

Парсинг позиций в выдаче google и яндекс на python / grab

Ниже грубый, но работающий код парсинга результатов поисковой выдачи с использование python, grab. Здорово, что pyquery запросы к DOM можно выполнять прямо из grab объекта.
from grab import Grab
from django.utils.http import urlquote_plus




def google_position(query, url, start=False):
    if start > 240:  # 10 * 24
        return None
    google_url = 'http://www.google.com/search?q=%s' % urlquote_plus(query)
    if start:
        google_url += '&start=%d' % start
    g = Grab()
    g.go(google_url)
    for i, r in enumerate(g.pyquery('li.g cite')):
        if url in r.text_content():
            if start:
                return start + i + 1
            return i + 1
    if start:
        return google_position(query, url, start=start + 10)
    return google_position(query, url, start=10)

def yandex_position(query, url, page=False):
    if page > 24:
        return None
    yandex_url = 'http://yandex.ru/yandsearch?text=%s' % urlquote_plus(query)
    if page:
        yandex_url += '?p=%d' % page
    g = Grab()
    g.go(yandex_url)
    for i, r in enumerate(g.pyquery('.b-body-items .b-serp-item__title-link')):
        if url in r.get('href'):
            if page:
                return page * 20 - 10 + i + 1
            return i + 1
    if page:
        return yandex_position(query, url, page=page + 1)
    return yandex_position(query, url, page=1)

1 комментарий:

Grigoriy Petukhov комментирует...

В grab кстати есть модуль для парсинга google: https://bitbucket.org/lorien/grab/src/9b85a5229a13/grab/tools/google.py

Это не готовый парсер. Там находятся заготовки для построения поисковог-URL, а также код парсинга HTML-кода страницы с результатами поиска.