Как использовать Python для анализа данных SEO: справочное руководство

Вы каждый день выполняете одни и те же повторяющиеся задачи SEO или сталкиваетесь с проблемами, когда нет инструментов, которые могут вам помочь?

Если это так, возможно, пришло время изучить Python.

Первоначальное вложение времени и пота окупится в значительно увеличенной производительности.

Эта статья в первую очередь ориентирована на профессионалов в области SEO, которые являются новичками в программировании, она будет полезна для тех, кто уже имеет опыт работы с программным обеспечением или Python, но ищет легкую для анализа информацию, чтоб использовать в проектах где необходим анализ данных.

Оглавление

  • Основы Python
  • Извлечение данных
  • Базовый анализ
  • Сохранение и экспорт результатов
  • Ресурсы, чтобы узнать больше

Основы Python

Python достаточно легок в освоении, и я рекомендую вам изучать его по официальному учебнику . Я собираюсь сосредоточиться на практических приложениях для SEO.

При написании программ на Python вы можете выбирать между Python 2 или Python 3. Лучше писать новые программы на Python 3, но вполне возможно, что ваша система может поставляться с уже установленным Python 2, особенно если вы используете Mac. Пожалуйста, также установите Python 3, чтобы иметь возможность использовать эту шпаргалку.

Вы можете проверить свою версию Python, используя:

  $ python --version 

Использование виртуальных сред

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

Python предполагает создание виртуальных сред для этого.

Если ваша система поставляется с Python 2, пожалуйста, загрузите и установите Python 3 с помощью дистрибутива Anaconda и выполните эти шаги в командной строке.

  $ sudo easy_install pip 
  $ sudo pip install virtualenv
 $ mkdir seowork
 $ virtualenv -p python3 seowork 

Если вы уже используете Python 3, выполните следующие альтернативные шаги в командной строке:

  $ mkdir seowork 
  $ python3 -m venv seowork 

Следующие шаги позволяют работать в любой версии Python и позволяют использовать виртуальные среды.

  $ cd seowork 
  $ source bin / activ 
  (seowork) $ Деактивировать 

Когда вы деактивируете среду, вы возвращаетесь к командной строке, и библиотеки, установленные в этой среде, не будут работать.

Полезные библиотеки для анализа данных

Всякий раз, когда я запускаю проект анализа данных, мне бы хотелось, чтобы были установлены как минимум следующие библиотеки:

Большинство из них включены в дистрибутив Anaconda. Давайте добавим их в нашу виртуальную среду.

  (seowork) $ pip3 устанавливает requests
 (seowork) $ pip3 установить matplotlib
 (seowork) $ pip3 установить requests-html
 (seowork) $ pip3 установить pandas 

Вы можете импортировать их в начале вашего кода следующим образом:

  запросы на импорт
 из request_html импортировать HTMLSession
 импорт панд в виде pd 

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

Вы можете экспортировать все библиотеки (и их номера версий), установленные в вашей виртуальной среде, используя:

  (seowork) $ pip3 freeze> needs.txt 

Когда вы делитесь этим файлом со своим проектом, любой другой член сообщества может установить все необходимые библиотеки с помощью этой простой команды в своей виртуальной среде:

  (peer-seowork) $ pip3 install -r needs.txt 

Использование Jupyter Notebooks

При анализе данных я предпочитаю использовать Jupyter Notebooks, поскольку они предоставляют более удобную среду, чем командная строка. Вы можете проверить данные, с которыми вы работаете, и написать свои программы в исследовательской манере.

  (seowork)$pip3 install jupyter

Затем вы можете запустить Jupyter, используя:

 (seowork)$jupyter notebook

Вы получите URL, чтобы открыть в вашем браузере.

Кроме того, вы можете использовать Google Colab Laboratory, которая является частью GoogleDocs и не требует настройки.

Форматирование строк

Вы потратите много времени в своих программах, подготавливая строки для ввода в различные функции. Иногда вам нужно объединить данные из разных источников или конвертировать из одного формата в другой.

Скажем, вы хотите программно получать данные Google Analytics. Вы можете создать URL-адрес API с помощью Google Analytics Query Explorer и заменить значения параметров для API на заполнители с использованием скобок. Например:

  api_uri = "https://www.googleapis.com/analytics/v3/data/ga?ids={gaid}&"\
"start-date={start}&end-date={end}&metrics={metrics}&"\
 "dimensions={dimensions}&segment={segment}&access_token={token}&"\
 "max-results={max_results}"

{gaid} — это учетная запись Google, т. е. «ga: 12345678»

{start} — дата начала, т. е. «2018-06-01»

{end} — дата окончания, то есть «2019-06-30».

{metrics} для списка числовых параметров, то есть «ga: users», «ga: newUsers»

{dimensions} — ​​это список категориальных параметров, т. е. «ga: landingPagePath», «ga: date»

{segment} — это маркетинговые сегменты. Для SEO мы хотим органический поиск, который называется «gaid :: — 5»

{token} — это токен безопасного доступа, который вы получаете из Google Analytics Query Explorer. Срок действия истекает через час, и вам нужно снова выполнить запрос (во время аутентификации), чтобы получить новый.

{max_results} — это максимальное количество результатов для возврата до 10000 строк.

Вы можете определить переменные Python для хранения всех этих параметров. Например:

  gaid = "ga: 12345678"
 start = "2018-06-01"
 end = "2019-06-30" 

Это позволяет довольно легко получать данные с нескольких веб-сайтов или диапазонов данных.

Наконец, вы можете объединить параметры с URL-адресом API, чтобы создать действительный запрос API для вызова.

  api_uri = api_uri.format(
 gaid=gaid,
 start=start,
 end=end,
 metrics=metrics,
 dimensions=dimensions,
 segment=segment,
 token=token,
 max_results=max_results
 )

Python заменит каждому placeholder соответствующее значение из переменных, которые мы передаем.

Строковое кодирование

Кодирование — еще одна распространенная техника манипуляции со строками Многие API требуют строки, отформатированные определенным образом.

Например, если один из ваших параметров является абсолютным URL-адресом, его необходимо кодировать перед тем, как вставить его в строку API с заполнителями.

  from urllib import parse
url="https://www.searchenginejournal.com/"
parse.quote(url)

Вывод будет выглядеть следующим образом: «https% 3A // www.searchenginejournal.com /», который будет безопасно передавать в запрос API.

Другой пример: скажем, вы хотите сгенерировать теги заголовков, которые включают амперсанд (&) или угловые скобки (<,>). Их нужно избегать, чтобы избежать путаницы HTML-парсеров.

  import html
title= "SEO <News & Tutorials>"
html.escape(title)

Вывод будет выглядеть так:

  'SEO &lt;News &amp; Tutorials&gt;' 

Точно так же, если вы читаете данные, которые закодированы, вы можете вернуть их обратно.

  html.unescape (escaped_title) 

Вывод будет снова считан как оригинал.

Форматирование даты

Очень часто анализируются данные временных рядов, а значения даты и времени могут иметь различные форматы. Python поддерживает преобразование дат в строки и обратно.

Например, после того, как мы получим результаты от API Google Analytics, мы можем захотеть проанализировать даты в объектах datetime. Это облегчит их сортировку или преобразование из одного строкового формата в другой.

from datetime import datetime
dt = datetime.strptime('Jan 5 2018 6:33PM', '%b %d %Y %I:%M%p')

Здесь% b,% d и т. Д. — это директивы, поддерживаемые strptime (используется при чтении дат) и strftime (используется при их записи). Вы можете найти полную ссылку здесь .

Выполнение запросов API

Теперь, когда мы знаем, как форматировать строки и создавать правильные запросы API, давайте посмотрим, как мы на самом деле выполняем такие запросы.

  г = запросы.get (api_uri) 

Мы можем проверить ответ, чтобы убедиться, что у нас есть валидные данные.

print(r.status_code)
print(r.headers['content-type'])

Вы должны увидеть код ответа 200. Тип содержимого большинства API, как правило, JSON.

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

 print(r.history)

Чтобы получить окончательный URL, используйте:

 print(r.url)

Извлечение данных

Большая часть вашей работы — получение данных, необходимых для анализа. Данные будут доступны из разных источников и форматов. Давайте рассмотрим наиболее распространенные.

Чтение из JSON

Большинство API будут возвращать результаты в формате JSON. Нам нужно проанализировать данные в этом формате в словарях Python. Вы можете использовать стандартную библиотеку JSON для этого.

import json
json_response = '{"website_name": "Шпаргалка для веб-разработчика", "website_url":"https://www.searchenginejournal.com/"}'
parsed_response = json.loads(json_response)

Теперь вы можете легко получить доступ к любым нужным вам данным. Например:

 print(parsed_response["website_name"])

Выход будет:

  "Шпаргалка для веб-разработчика" 

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

  parsed_response = r.json () 

Чтение со страниц HTML

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

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.searchenginejournal.com/')

Вы можете получить все абсолютные ссылки, используя это:

  print(r.html.absolute_links)

Частичный вывод будет выглядеть так:

 {'http://jobs.searchenginejournal.com/', 'https://www.searchenginejournal.com/what-i-learned-about-seo-this-year/281301/', …}

Далее, давайте выберем некоторые распространенные теги SEO, используя XPATHs:

Заголовок страницы (title)

 r.html.xpath('//title/text()') 

Выход:

  [' Softobzor - Шпаргалка для веб-разработчика']

Мета Описание

 r.html.xpath("//meta[@name='description']/@content")

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

Выход:

  ['Шпаргалка для веб-разработчика'] 

rel canonical

  r.html.xpath("//link[@rel='canonical']/@href") 

Выход:

  [ 'https://softobzor.com.ua/'] 

AMP URL

  r.html.xpath("//link[@rel='amphtml']/@href") 

Softobzor не имеет AMP URL.

Мета Роботы

  r.html.xpath("//meta[@name='ROBOTS']/@content")

Выход:

  [ 'NOODP'] 

H1

  r.html.xpath ( "// h1") 

Домашняя страница не имеет h1.

Значения атрибута HREFLANG

  r.html.xpath("//link[@rel='alternate']/@hreflang")

Softobzor не имеет атрибутов hreflang.

Проверка сайта Google

  r.html.xpath("//meta[@name='google-site-verification']/@content") 

Выход:

  Softobzor не имеет атрибутов  verification, т. к. подтвержден через аналитику.

JavaScript рендеринг

Если анализируемая страница требует рендеринга JavaScript, вам нужно только добавить дополнительную строку кода для поддержки этого.

 from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.searchenginejournal.com/')
r.html.render()

Первый запуск render () займет некоторое время, потому что Chromium будет загружен. Рендеринг Javascript намного медленнее, чем без рендеринга.

Чтение из журналов сервера

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

Давайте посмотрим, как мы можем анализировать файлы журнала сервера, используя регулярные выражения в Python.

  import re
log_line='66.249.66.1 - - [06/Jan/2019:14:04:19 +0200] "GET / HTTP/1.1" 200 - "" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'
regex='([(\d\.)]+) - - \[(.*?)\] \"(.*?)\" (\d+) - \"(.*?)\" \"(.*?)\"'
groups=re.match(regex, line).groups()
print(groups)

Вывод хорошо разбивает каждый элемент записи журнала:

  ('66.249.66.1', '06/Jan/2019:14:04:19 +0200', 'GET / HTTP/1.1', '200', '', 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)')

Вы получаете доступ к строке агента пользователя в шестой группе, но списки в Python начинаются с нуля, так что это пять.

 print(groups[5])

Выход:

  'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' 

Вы можете узнать о регулярных выражениях в Python здесь . Обязательно проверьте раздел о greedy и non-greedy выражениях. Я использую не greedy при создании групп.

Проверка Googlebot

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

Google предоставляет простой подход, чтобы сделать это здесь . Давайте посмотрим, как автоматизировать это с помощью Python.

 import socket
bot_ip = "66.249.66.1"
host = socket.gethostbyaddr(bot_ip)
print(host[0])

Вы получите crawl-66-249-66-1.googlebot.com

  ip = socket.gethostbyname (host [0]) 

Вы получите ’66 .249.66.1′ , который показывает, что у нас есть реальный IP-адрес робота Google, так как он соответствует нашему первоначальному IP, который мы извлекли из журнала сервера.

Чтение с URL

Часто пропускаемым источником информации являются фактические URL веб-страницы. Большинство веб-сайтов и систем управления контентом содержат обширную информацию в URL. Давайте посмотрим, как мы можем извлечь это.

Можно разбить URL-адреса на их компоненты с помощью регулярных выражений, но гораздо проще и надежнее использовать для этого стандартную библиотеку urllib .

 from urllib.parse import urlparse
url="https://www.searchenginejournal.com/?s=google&search-orderby=relevance&searchfilter=0&search-date-from=January+1%2C+2016&search-date-to=January+7%2C+2019"
parsed_url=urlparse(url)
print(parsed_url)

Выход:

 ParseResult(scheme='https', netloc='www.searchenginejournal.com', path='/', params='', query='s=google&search-orderby=relevance&searchfilter=0&search-date-from=January+1%2C+2016&search-date-to=January+7%2C+2019', fragment='')

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

 print(parsed_url.netloc)
print(parsed_url.path)

Это выведет то, что вы ожидаете.

Мы можем дополнительно разбить строку запроса, чтобы получить параметры URL и их значения.

  parsed_query=parse_qs(parsed_url.query)
print(parsed_query)

Вы получаете словарь Python в качестве вывода.

  {'s': ['google'],
 'search-date-from': ['January 1, 2016'],
 'search-date-to': ['January 7, 2019'],
 'search-orderby': ['relevance'],
 'searchfilter': ['0']}

Мы можем продолжить и проанализировать строки даты в объектах даты и времени Python, что позволит вам выполнять операции с датами, например, вычислять количество дней между диапазонами.

Другой распространенный метод, используемый в вашем анализе, состоит в разбиении части пути по URL-адресу на «/» для получения частей. Это просто сделать с помощью функции split.

  URL = "https://softobzor.com.ua/category/laravel/"
 parsed_url = urlparse (URL)
 parsed_url.path.split ( "/") 

Выход будет:

  ['', 'category', 'digital-experience', ''] 

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

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

Выполнение базового анализа

Вы потратите большую часть своего времени на получение данных в нужном формате для анализа. Часть анализа относительно проста, если вы знаете правильные вопросы.

Давайте начнем с загрузки сканирования Screaming Frog в pandas dataframe.

 import pandas as pd
df = pd.DataFrame(pd.read_csv('internal_all.csv', header=1, parse_dates=['Last Modified']))
print(df.dtypes)

Выходные данные показывают все столбцы, доступные в файле Screaming Frog, и их типы Python. С помощью pandas проанализируем последний измененный столбец в объекте даты и времени Python.

Давайте выполним некоторые примеры анализа.

Группировка по каталогу верхнего уровня

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

 df['Page Type']=df['Address'].apply(lambda x: urlparse(x).path.split("/")[1])
aggregated_df=df[['Page Type','Word Count']].groupby(['Page Type']).agg('sum')
print(aggregated_df)

После создания столбца «Тип страницы» мы группируем все страницы по типу и общему количеству слов. Вывод частично выглядит так:

seo-guide 736
seo-internal-links-best-practices 2012
seo-keyword-audit 2104
seo-risks 2435
seo-tools 588
seo-trends 3448
seo-trends-2019 2676
seo-value 1528

Группировка по коду статуса

status_code_df=df[['Status Code', 'Address']].groupby(['Status Code']).agg('count')
print(status_code_df)

200 218
301 6
302 5

Перечисление временных перенаправлений

  temp_redirects_df=df[df['Status Code'] == 302]['Address']
print(temp_redirects_df)

50 https://www.searchenginejournal.com/wp-content...
116 https://www.searchenginejournal.com/wp-content...
128 https://www.searchenginejournal.com/feed
154 https://www.searchenginejournal.com/wp-content...
206 https://www.searchenginejournal.com/wp-content...

Страницы со списком без содержания

  no_content_df=df[(df['Status Code'] == 200) & (df['Word Count'] == 0 ) ][['Address','Word Count']]

7 https://www.searchenginejournal.com/author/cor... 0
9 https://www.searchenginejournal.com/author/vic... 0
66 https://www.searchenginejournal.com/author/ada... 0
70 https://www.searchenginejournal.com/author/ron... 0

Издательская деятельность

Давайте посмотрим, в какое время дня большинство статей публикуются в SEJ.

lastmod = pd.DatetimeIndex(df['Last Modified'])
writing_activity_df=df.groupby([lastmod.hour])['Address'].count()

0.0 19
1.0 55
2.0 29
10.0 10
11.0 54
18.0 7
19.0 31
20.0 9
21.0 1
22.0 3

Интересно, что в обычное рабочее время не так много изменений.

Мы можем построить это прямо из pandas.

 writing_activity_df.plot.bar()

 

Гистограмма, показывающая время дня публикации статей. Гистограмма была сгенерирована с использованием Python 3.

Сохранение и экспорт результатов

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

Сохранение в Excel

 writer = pd.ExcelWriter(no_content.xlsx')
no_content_df.to_excel(writer,'Results')
writer.save()

Сохранение в CSV

  temporary_redirects_df.to_csv('temporary_redirects.csv') 

Дополнительные ресурсы

Мы лишь слегка коснулись того, что возможно, когда вы добавляете скрипты Python в свою повседневную работу по SEO. Вот несколько ссылок для дальнейшего изучения.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *