Сбор данных из Yandex Wordstat при помощи Splinter Web Testing Tool


Разработка на языке Python 3 (для web-приложений используем Django Framework) Мое портфолио, сертификаты и разработки
count firefox splinter word yandex
 
 

* В этом блоге я описываю свою повседневную рабочую практику, поэтому все статьи в блоге написаны лично мной и при копировании их на свой сайт пожалуйста указывайте ссылку на страницу откуда вы скопировали.
* Если какая-то статья вам помогла, то вы можете дать мне немного денег вместо простого спасибо (ссылка на форму поддержки проекта внизу страницы), если вы что-то не поняли или у вас что-то не получается, то вы можете нанять меня и я вам все подробно расскажу (расценки и ссылки в конце статьи).


(последние правки 1 месяц)

Для одного из свежих небольших проектов мне потребовался актуальный словарь запросов из Yandex и Google. У каждого из этих поисковых гигантов есть свои методы проведения запросов для анализа потенциальной поисковой выдачи. Естественно, что эти инструменты активно используются в черном и сером SEO, поэтому за множественные запросы вас скорее всего сразу забанят или предложат ввести капчу.

Как вы наверное догадались, я недавно собирал словарь из Yandex.Wordstat для приведения в порядок контента и подгонки ключевых слов к среднечастотным и высокочастотным, ну и конечно небольшой хвост актуальных запросов запросов тоже интересная задача.

Забавно было наблюдать как в одной из задач на Freelance-сайте парень предложил написать ему правильный CURL-запрос для Bash по которому Google его не будет отправлять в бан и заставлять заполнять капчу на множественных запросах поисковой выдачи. Иной раз смешно наблюдать в каких розовых очках живут некоторые потенциальные заказчики, но объяснить ему что его идея морально устарела лет так на 15-20 практически невозможно и вам просто скажут, что вы как специалист говно и он найдет другого жулика, но я слава богу предпочитаю не иметь дела с идиотами и такие задачи я уже сходу определяю, но есть среди SEO-мусора и вполне себе адекватные заказы.

На самом деле, теперь любой мало-мальски современный web-портал может при некотором желании определить сканируют его или же это просто очень настырный человек работает. Сделать это можно например при помощи JS-скриптов которые ваш граббер просто не будет отрабатывать так как это должен был сделать браузер. Но мы пожалуй завершим это небольшое лирическое отступление и вернемся как говорится к нашим баранам. Я выше уже сказал, что использование библиотеки Requests или любого другого CURL-механизма даже с подставленным USER-AGENT и поддержкой COOKIES можно отловить достаточно просто поэтому нам придется при парсинге Yandex.WordStat использовать реальный браузер, в котором мы будем заполнять реальные поля и разбирать уже полученный документ прямо в его браузерном представлении.

Для реализации "удаленного управления" браузером в Python имеется высокоуровневая библиотека Splinter, она позволяет использовать несколько типов WEB-браузеров и сводит управление ими в единый набор команд. Честно говоря это было первое что пришло в голову, потому что раньше со Splinter я уже работал и эта библиотека отлично себя зарекомендовала.

Есть единственное маленькое, "но" на которое я хотел бы обратить ваше внимание при работе со Splinter. Унификация всех возможностей управления различными браузерами привела к тому, что возможностей по сравнению с каждым из WEB-движков по отдельности значительно поубавилось и например я в дальнейшем планирую использовать только движок selenium (Firefox) если заказчиком явно не указано использовать Chrome.

Естественно, что для дальнейшей работы вам понадобятся:

  • splinter
  • selenium
  • Firefox

Устанавливаем необходимые компоненты:

# apt-get install firefox
# pip3 install selenium
# pip3 install splinter

Начнем конечно с банального, о чем написано в документации к Splinter, а именно создадим экземпляр браузера которым мы будем программно управлять:

from splinter import Browser

with Browser('firefox') as browser:
    url = "https://wordstat.yandex.ru/"
    login = 'secret-yandex-user@yandex.ru'
    password = secret-yandex-password'
    browser.visit(url)

И сразу скажу, что ничего у вас не получится и ожидает вас ошибка:

  File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'

Для управления свежими версиями Firefox теперь уже в обязательном порядке требуется GeckoDriver, который вы можете скачать по адресу:

https://github.com/mozilla/geckodriver/releases

На этой вкладке вы можете загрузить бинарный геко-драйвер и распаковать его например в /usr/local/bin/ и вот теперь вы можете управлять Firefox при помощи Splinter, о том, что браузер находится под сторонним управлением сообщает смешная иконка в строке адреса.

Управление браузером мы на себя взяли и теперь нам надо авторизоваться на Yandex, так как сканировать себя Yandex.WordStat дает только авторизованным SEO-жуликам:

# Авторизуемся
browser.click_link_by_href('https://passport.yandex.ru/passport?mode=auth&msg=&retpath=https%3A%2F%2Fwordstat.yandex.ru%2F')
browser.find_by_id('b-domik_popup-username').fill(login)
sleep(random.randint(5, 10)/10)
browser.find_by_id('b-domik_popup-password').fill(password)
sleep(random.randint(5, 10)/10)
button = browser.find_by_css('input[class="b-form-button__input"]')[2]
button.click()

Я тут дополнительно установил несколько конструкций со случайными задержками, что бы мой сканер не выглядел полным уж роботом, а иногда и задумывался. Как показал этот эксперимент, если вы будете выполнять операции с одинаковыми промежутками, то вас очень быстро раскусят.

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

word_search_input = browser.find_by_css('input[class="b-form-input__input"]').first
word_search_input = word_search_input.fill(get_word_info)
sleep(random.randint(10, 20)/10)
span_button = browser.find_by_css('input[class="b-form-button__input"]')[0]
span_button.click()

Мы получили поисковую выдачу и теперь нам надо загрузить ее базу данных. Если вы попробуете просто сохранить HTML-код страницы, то там вы ничего не увидите, так как весь контент был сформирован при помощи JavaScript (его не будет в сохраненном HTML-коде) и разбирать его придется именно на стороне браузера.

iter_element = browser.find_by_css('td[class*="b-word-statistics__td"]')
keyword = ''
items_count = ''
keywords_array=[]
word_count = 0
similiar = False
for id in range(0,len(iter_element)):
    if iter_element[id].html.count('b-phrase-link')>0:
        keyword = iter_element[id].text
    else:
        items_count = iter_element[id].text.replace(' ','')
    if items_count != '':
        if word_count == 0:
            word_count = int(items_count)
        else:
            if word_count >= int(items_count):
                word_count = int(items_count)
            else:
                word_count = int(items_count)
                similiar = True            
        print ('Scan results by keyword: '+keyword+' => '+items_count+' '+str(similiar))
        update_word_stat(keyword.strip(),int(items_count),cn,cr)
        keywords_array.append({'keyword':keyword,'view_count':items_count,'similiar':similiar})
        items_count = ''

Я конечно же не привожу полный листинг программы (иначе как мне на жизнь зарабатывать если я все за так раздам), но используя представленные ее части вы легко сможете написать свое приложение.

Моя официальная страница на FaceBook
Мой микроблог в твиттер

Как вы наверное понимаете, бесплатно сейчас работать никто не будет и если ответ на ваш вопрос потребует больше трех минут времени и вам требуется полноценная консультация, то расценки на мои услуги представленны ниже.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .