Sunday, January 29, 2012

Класс на python для определения позиции сайта в выдаче Яндекса http://int21h.ru/tag/python/

http://int21h.ru/tag/python/

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import re
import time
from urllib import *
 
class Http_Request:
    def getURL(self,url):
        # Загрузка страницы
        return str(urlopen(url).read())
 
class YaBot(Http_Request):
    def get_ya_page(self, request, page, region = 1):
        # Создание поискового запроса
        page = page-1 # страницы Яндекса начинаются с 0
        url = 'http://yandex.ru/yandsearch?text=' + \
              request + \
              '&p=' + \
              str(page) + \
              '&lr=' + \
              str(region)
        # Возвращаем страницу поиска
        return self.getURL(url)
 
    def site_place(self,
                   site,          # сайт, который ищем в поиске
                   request,       # поисковый запрос для анализа
                   to_page,       # кол-во страниц поиска для анализа
                   per_page = 10, # кол-во результатов на странице
                   region = 1):   # регион поиска, подробнее тут:
                                  # http://bit.ly/cKeksq
        for page in range(1, to_page+1):
            # Запрос очередной страницы поиска
            data = self.get_ya_page(request, page, region)
            # Подготовка регулярных выражений для поиска на
            # странице результатов Яндекса
            # Номера позиций
            position_regex = re.compile(r'<b class="b-serp-item__number">([0-9]+)</b>')
            # Адреса страниц (пока не используется)
            search_url_regex = re.compile(r'<a class="b-serp-item__title-link" tabindex.+href="([^"]+)')
            # Адреса сайтов
            url_regex = re.compile('<a class="b-serp-item__title-link" tabindex.+href="http[s]?://([^"/]+\.[a-z]{2,4})')
            # Каптча
            captcha_regex = re.compile('<div class="b-captcha">')
 
            # Поиск на странице результатов Яндекса
            positions = position_regex.findall(data)
            # search_urls = search_url_regex.findall(data)
            urls = url_regex.findall(data)
            captcha = captcha_regex.findall(data)
 
            if captcha:
                return -2
 
            for position in positions[:per_page]:
                if urls[int(position)-((page-1)*per_page)-1].upper() == site.upper():
                    return position
 
            time.sleep(3) # Антикаптча
 
        return -1
 
def main():
    ya = YaBot()
    site = 'www.mirdivaNov.ru' # с www или без имеет значение
    request = 'диван'
    region = 1 # Москва
 
    site_position = ya.site_place(site, request, 5, region = region)
 
    if site_position == -1:
        print 'Сайт в поиске не найден'
    elif site_position == -2:
        print 'CAPTCHA'
    else:
        print 'Позиция: '+str(site_position)
 
if __name__ == "__main__":
    main()

No comments:

Post a Comment