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

Анализ позиций сайта в поисковиках на Python

xenonhammer

New member
14.07.2019
1
0
BIT
0
Нашел вот такой мануал 2012 года на хабре по написанию подобного паука:

Python:
import pycurl

try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO

def get_page(url, *args, **kargs):
    c = pycurl.Curl()
    c.setopt(pycurl.URL, url)
    c.bodyio = StringIO()
    c.setopt(pycurl.WRITEFUNCTION, c.bodyio.write)
    c.get_body = c.bodyio.getvalue
    c.headio = StringIO()
    c.setopt(pycurl.HEADERFUNCTION, c.headio.write)
    c.get_head = c.headio.getvalue
    
    c.setopt(pycurl.FOLLOWLOCATION, 1)
    c.setopt(pycurl.MAXREDIRS, 5)
    c.setopt(pycurl.CONNECTTIMEOUT, 60)
    c.setopt(pycurl.TIMEOUT, 120)
    c.setopt(pycurl.NOSIGNAL, 1)
    c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0')
    httpheader = [
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
        'Accept-Charset:utf-8;q=0.7,*;q=0.5',
        'Connection: keep-alive',
        ]
    c.setopt(pycurl.HTTPHEADER, httpheader)
    
    c.perform()
    if c.getinfo(pycurl.HTTP_CODE) != 200:
        raise Exception('HTTP code is %s' % c.getinfo(pycurl.HTTP_CODE))

    return c.get_body()

import urllib
import urlparse

key='кирпич'
region=213
page=1
params = ['http', 'yandex.ru', '/yandsearch', '', '', '']
params[4] = urllib.urlencode({
    'text':key,
    'lr':region,
    'p':page-1,
})
url = urlparse.urlunparse(params)

html = get_page(url)

def site_list(key, region=213, page=1):
    params = ['http', 'yandex.ru', '/yandsearch', '', '', '']
    params[4] = urllib.urlencode({
        'text':key,
        'lr':region,
        'p':page-1,
    })
    url = urlparse.urlunparse(params)
    html = get_page(url)
    site_list = []
    for h2 in lxml.html.fromstring(html).find_class('b-serp-item__title'):
        b = h2.find_class('b-serp-item__number')
        if len(b):
            num = b[0].text.strip()
            url = h2.find_class('b-serp-item__title-link')[0].attrib['href']
            site = urlparse.urlparse(url).hostname
            site_list.append((num, site, url))
    return site_list

def cut_www(site):
    if site.startswith('www.'):
        site = site[4:]
    return site

site = 'habrahabr.ru'
for pos, s, url in site_list('python', 213, 1):
    if cut_www(s) == site:
        print pos, url
def site_position(site, key, region=213, max_position=10):
    for page in range(1,int(math.ceil(max_position/10.0))+1):
        site = cut_www(site)
        for pos, s, url in site_list(key, region, page):
            if cut_www(s) == site:
                return pos, url
    return None, None

print site_position('habrahabr.ru', 'python', 213, 100)

Дело в том что когда пытался собрать методом копипаста, ничего не вышло ибо не могу установить библиотеку StringIO. Поискал информацию, говорят что данной библиотеки уже нет. Уперевшись в это, дальше не стал проверять чего не хватает еще.

Говорят что можно написать разными путями например с использованием scraper. Но так как я на самом деле не имею знаний чтобы реализовать данный инструмент, прошу поделиться вашим мнением по этому поводу.

Не нашел бесплатного решения, все на тарифах, по этому пробую сделать сам. Но сам на данный момент не смог
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!