Apakah Anda menemukan diri Anda melakukan tugas Analisa SEO yang sama berulang setiap hari atau menghadapi tantangan di mana tidak ada alat yang dapat membantu Anda? Jika demikian, mungkin sudah waktunya bagi Anda untuk belajar Python for SEO.

Investasi awal waktu dan keringat akan menghasilkan peningkatan produktivitas yang signifikan. Kita

Saya berharap ini akan bermanfaat bagi mereka yang sudah memiliki latar belakang dalam perangkat lunak atau Python, tetapi yang mencari referensi yang mudah untuk gunakan dalam Analisa SEO.

Daftar Isi

  • Dasar-dasar Python
  • Data Ectraction
  • Analisis dasar
  • Menyimpan dan mengekspor hasil
  • Bahan untuk belajar lebih lanjut

Dasar-Dasar Python for SEO

Python mudah dipelajari dan saya sarankan Anda menghabiskan sore berjalan di atas tutorial resmi . Saya akan fokus pada aplikasi praktis untuk Analisa SEO.

Saat menulis program Python for SEO, Anda dapat memutuskan antara Python 2 atau Python 3. Lebih baik menulis program baru dengan Python 3, tetapi ada kemungkinan sistem Anda datang dengan Python 2 yang sudah diinstal, terutama jika Anda menggunakan Mac. Silakan juga instal Python 3 untuk dapat menggunakan lembar contekan ini.

Anda dapat memeriksa versi Python Anda menggunakan:

 $ python --version 

Menggunakan Virtual Environments

Ketika Anda menyelesaikan pekerjaan Anda, penting untuk memastikan orang lain di komunitas dapat mereproduksi hasil Anda. Mereka harus dapat menginstal perpustakaan pihak ketiga yang sama yang Anda gunakan, sering menggunakan versi yang sama persis.

Python mendorong pembuatan lingkungan virtual untuk ini.

Jika sistem Anda dilengkapi dengan Python 2, silakan unduh dan instal Python 3 menggunakan distribusi Anaconda dan jalankan langkah-langkah ini di baris perintah Anda.

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

Jika Anda sudah menggunakan Python 3, jalankan langkah-langkah alternatif ini di baris perintah Anda:

$mkdir seowork 
$python3 -m venv seowork 

Langkah-langkah selanjutnya memungkinkan bekerja di versi Python apa pun dan memungkinkan Anda untuk menggunakan lingkungan virtual.

$cd seowork 
$source bin/activate 
(seowork)$deactivate 

Ketika Anda menonaktifkan lingkungan, Anda kembali ke baris perintah Anda, dan perpustakaan yang Anda instal di lingkungan tidak akan berfungsi.

Libraries yang Berguna untuk Analisis Data

Setiap kali saya memulai proyek analisis data, saya ingin memiliki minimal pustaka berikut diinstal:

Sebagian besar dari mereka datang termasuk dalam distribusi Anaconda.Mari menambahkannya ke lingkungan virtual kita.

(seowork)$pip3 install requests 
(seowork)$pip3 install matplotlib 
(seowork)$pip3 install requests-html 
(seowork)$pip3 install pandas 

Anda dapat mengimpornya di awal kode Anda seperti ini:

import requests 
from requests_html import HTMLSession 
import pandas as pd 

Saat Anda membutuhkan lebih banyak perpustakaan pihak ketiga dalam program Anda, Anda memerlukan cara mudah untuk melacaknya dan membantu orang lain menyiapkan skrip Anda dengan mudah.

Anda dapat mengekspor semua perpustakaan (dan nomor versinya) yang diinstal di lingkungan virtual Anda menggunakan:

(seowork)$pip3 freeze > requirements.txt 

Saat Anda membagikan file ini dengan proyek Anda, siapa pun dari komunitas dapat menginstal semua perpustakaan yang diperlukan menggunakan perintah sederhana ini di lingkungan virtual mereka sendiri:

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

Menggunakan Notebook Jupyter

Saat melakukan analisis data, saya lebih suka menggunakan notebook Jupyter karena memberikan lingkungan yang lebih nyaman daripada baris perintah.Anda dapat memeriksa data yang sedang Anda kerjakan dan menulis program Anda dengan cara eksploratif.

 (seowork)$pip3 install jupyter 

Kemudian Anda dapat menjalankan notebook menggunakan:

 (seowork)$jupyter notebook 

Anda akan mendapatkan URL untuk dibuka di browser Anda.

Atau, Anda dapat menggunakan Google Colaboratory yang merupakan bagian dari GoogleDocs dan tidak memerlukan penyiapan.

Pemformatan String (String Formatting)

Anda akan menghabiskan banyak waktu dalam program Anda mempersiapkan string untuk input ke berbagai fungsi. Terkadang, Anda perlu menggabungkan data dari sumber yang berbeda, atau mengonversi dari satu format ke format lainnya.

Katakanlah Anda ingin mengambil data Google Analytics secara terprogram.Anda dapat membangun URL API menggunakan Google Analytics Query Explorer, dan mengganti nilai parameter ke API dengan placeholder menggunakan tanda kurung. Sebagai contoh:

 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} is the Google account, i.e., “ga:12345678”

{start} is the start date, i.e., “2017-06-01”

{end} is the end date, i.e., “2018-06-30”

{metrics} is for the list of numeric parameters, i.e., “ga:users”, “ga:newUsers”

{dimensions} is the list of categorical parameters, i.e., “ga:landingPagePath”, “ga:date”

{segment} is the marketing segments. For SEO we want Organic Search, which is “gaid::-5”

{token} is the security access token you get from Google Analytics Query Explorer. It expires after an hour, and you need to run the query again (while authenticated) to get a new one.

{max_results} is the maximum number of results to get back up to 10,000 rows.

Anda bisa mendefinisikan variabel Python untuk menampung semua parameter ini. Sebagai contoh:

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

Ini memungkinkan Anda untuk mengambil data dari beberapa situs web atau rentang data dengan cukup mudah.

Terakhir, Anda dapat menggabungkan parameter dengan URL API untuk menghasilkan permintaan API yang valid untuk menelepon.

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

Python akan mengganti setiap dudukan dengan nilai yang sesuai dari variabel yang kami lewati.

Pengkodean String

Pengkodean adalah teknik manipulasi string umum lainnya. Banyak API membutuhkan string yang diformat dengan cara tertentu.

Misalnya, jika salah satu parameter Anda adalah URL absolut, Anda harus menyandikannya sebelum memasukkannya ke string API dengan placeholder.

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

Outputnya akan terlihat seperti ini: ‘https% 3A // www.searchenginejournal.com /’yang aman untuk diteruskan ke permintaan API.

Contoh lain: misalkan Anda ingin membuat tag judul yang menyertakan tanda kurung (&) atau kurung sudut (<,>). Mereka harus melarikan diri untuk menghindari parser HTML yang membingungkan.

import html 
title= " Python for SEO untuk Analisa SEO <News & Tutorials>" 
html.escape(title) 

Outputnya akan terlihat seperti ini:

'SEO <News & Tutorials>' 

Demikian pula, jika Anda membaca data yang disandikan, Anda dapat mengembalikannya.

html.unescape(escaped_title) 

Output akan membaca lagi seperti aslinya.

Pemformatan Tanggal

Sangat umum untuk menganalisis data deret waktu, dan nilai cap tanggal dan waktu dapat muncul dalam berbagai format. Python mendukung konversi dari tanggal ke string dan kembali.

Misalnya, setelah kami mendapatkan hasil dari Google Analytics API, kami mungkin ingin mengurai tanggal menjadi objek datetime. Ini akan memudahkan Anda untuk mengurutkan atau mengonversinya dari satu format string ke yang lain.

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

Di sini% b,% d, dll adalah arahan yang didukung oleh strptime (digunakan saat membaca tanggal) dan strftime (digunakan saat menulisnya). Anda dapat menemukan referensi lengkapnya di sini .

Membuat Permintaan API

Sekarang kita tahu cara memformat string dan membuat permintaan API yang benar, mari kita lihat bagaimana sebenarnya kita melakukan permintaan tersebut.

r = requests.get(api_uri) 

Kami dapat memeriksa respons untuk memastikan kami memiliki data yang valid.

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

Anda akan melihat 200 kode status. Jenis konten dari sebagian besar API umumnya adalah JSON.

Saat Anda memeriksa rantai pengalihan, Anda dapat menggunakan parameter riwayat pengalihan untuk melihat rantai penuh.

  print (r.history) 

Untuk mendapatkan URL final, gunakan:

  print (r.url) 

Ekstraksi Data

Sebagian besar pekerjaan Anda adalah pengadaan data yang Anda butuhkan untuk melakukan analisis Anda. Data akan tersedia dari berbagai sumber dan format. Mari kita jelajahi yang paling umum.

Membaca dari JSON

Sebagian besar API akan mengembalikan hasil dalam format JSON. Kita perlu mem-parsing data dalam format ini ke dalam kamus Python. Anda dapat menggunakan pustaka JSON standar untuk melakukan ini.

import json 
json_response = '{"website_name": "Rihan is Me", "website_url":"https://rihan.me/"}' 
parsed_response = json.loads(json_response) 

Sekarang Anda dapat dengan mudah mengakses data yang Anda butuhkan.Sebagai contoh:

  print (parsed_response ["website_name"]) 

Outputnya adalah:

  "Rihan is Me -  Python for SEO untuk Analisa SEO" 

Saat Anda menggunakan pustaka permintaan untuk melakukan panggilan API, Anda tidak perlu melakukan ini. Objek respons menyediakan properti yang nyaman untuk ini.

  parsed_response = r.json () 

Membaca dari Halaman HTML

Sebagian besar data yang kita perlukan untuk Analisa SEO akan tersedia di situs web klien. Meskipun tidak ada kekurangan Python for SEO yang mengagumkan, penting untuk mempelajari cara merayap sendiri untuk melakukan hal-hal mewah seperti mengelompokkan halaman secara otomatis berdasarkan jenis halaman.

  dari request_html impor HTMLSession
 session = HTMLSession ()
 r = session.get ('https://www.searchenginejournal.com/') 

Anda bisa mendapatkan semua tautan absolut menggunakan ini:

  cetak (r.html.absolute_links) 

Selanjutnya, mari kita ambil beberapa tag SEO umum Python for SEO untuk Analisa SEO menggunakan XPATHs :

Judul halaman

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

Outputnya adalah:

  ['Rihan is Me - SEO, Berita dan Tutorial Pemasaran Pencarian  Python for SEO untuk Analisa SEO '] 

Deskripsi meta

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

Harap dicatat bahwa saya mengubah gaya kutipan dari tunggal ke ganda atau saya akan mendapatkan kesalahan pengkodean.

Outputnya adalah:

  ['Rihan is Me didedikasikan untuk memproduksi berita pencarian terbaru, panduan terbaik dan cara-cara untuk komunitas Python for SEO untuk Analisa SEO.'] 

Resmi

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

Outputnya adalah:

  ['https://www.searchenginejournal.com/'] 

URL AMP

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

Rihan is Me tidak memiliki URL AMP.

Robot Meta

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

Outputnya adalah:

  ['NOODP'] 

H1s

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

Halaman beranda Rihan is Me tidak memiliki h1s.

Nilai Atribut HREFLANG

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

Rihan is Me tidak memiliki atribut hreflang.

Verifikasi Situs Google

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

Outputnya adalah:

  ['NcZlh5TFoRGYNheLXgxcx9gbVcKCsHDFnrRyEUkQswY',   'd0L0giSu_RtW_hg8i6GRzu68N3d4e7nmPlZNA9sCc5s',   'S-Orml3wOAaAplwsb19igpEZzRibTtnctYrg46pGTzA'] 

Rendering JavaScript

Jika halaman yang Anda analisis membutuhkan rendering JavaScript, Anda hanya perlu menambahkan baris kode tambahan untuk mendukung ini.

  dari request_html impor HTMLSession
 session = HTMLSession ()
 r = session.get ('https://www.searchenginejournal.com/')
 r.html.render () 

Pertama kali Anda menjalankan render () akan memakan waktu cukup lama karena Chromium akan diunduh. Rendering Javascript jauh lebih lambat daripada tanpa rendering.

Membaca dari permintaan XHR

Karena rendering JavaScript lambat dan memakan waktu, Anda dapat menggunakan pendekatan alternatif ini untuk situs web yang memuat konten JavaScript menggunakan permintaan AJAX.

Python for SEO  Cara Analisa SEO menggunkan Python

Cuplikan layar memperlihatkan cara memeriksa header permintaan file JSON menggunakan alat Pengembang Chrome.Path file JSON disorot, seperti header x-diminta-dengan.

  ajax_request = 'https: //www.searchenginejournal.com/location.json'
 r = requests.get (ajax_request)
 hasil = r.json () 

Anda akan mendapatkan data yang Anda butuhkan lebih cepat karena tidak ada rendering JavaScript atau bahkan parsing HTML yang terlibat.

Membaca dari Server Log

Google Analytics kuat tetapi tidak mencatat atau menyajikan kunjungan dari sebagian besar perayap mesin pencari. Kami dapat memperoleh informasi itu langsung dari file log server.

Mari kita lihat bagaimana kita dapat menganalisis file log server menggunakan ekspresi reguler dengan Python. Anda dapat memeriksa regex yang saya gunakan di sini .

  impor ulang
 log_line = '66 .249.66.1 - - [06 / Jan / 2019: 14: 04: 19 +0200] "DAPATKAN / HTTP / 1.1" 200 - "" "Mozilla / 5.0 (kompatibel; Googlebot / 2.1; + http: // www.google.com/bot.html) "'
 regex = '([(\ d \.)] +) - - \ [(. *?) \] \ "(. *?) \" (\ d +) - \ "(. *?) \" \ " (. *?) \ "'
 groups = re.match (regex, line) .groups ()
 cetak (grup) 

Output memecah setiap elemen entri log dengan baik:

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

Anda mengakses string agen pengguna di grup enam, tetapi daftar di Python mulai dari nol, jadi itu lima.

  cetak (grup [5]) 

Outputnya adalah:

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

Anda dapat mempelajari tentang ekspresi reguler dengan Python di sini .Pastikan untuk memeriksa bagian tentang ekspresi serakah vs tidak serakah.Saya menggunakan non-serakah saat membuat grup.

Memverifikasi Googlebot

Saat melakukan analisis log untuk memahami perilaku bot pencarian, penting untuk mengecualikan setiap permintaan palsu, karena siapa pun dapat berpura-pura menjadi Googlebot dengan mengubah string agen pengguna.

Google menyediakan pendekatan sederhana untuk melakukan ini di sini . Mari kita lihat bagaimana cara mengotomatiskannya dengan Python.

  soket impor
 bot_ip = "66.249.66.1"
 host = socket.gethostbyaddr (bot_ip)
 cetak (host [0]) 

Anda akan mendapatkan crawl-66-249-66-1.googlebot.com

  ip = socket.gethostbyname (host [0]) 

Anda mendapatkan ’66 .249.66.1 ‘ , yang menunjukkan bahwa kami memiliki IP Googlebot asli karena cocok dengan IP asli kami, yang kami ekstrak dari log server.

Membaca dari URL

Sumber informasi yang sering diabaikan adalah URL halaman web yang sebenarnya. Sebagian besar situs web dan sistem manajemen konten menyertakan informasi yang kaya dalam URL. Mari kita lihat bagaimana kita bisa mengekstraknya.

Dimungkinkan untuk memecah URL ke dalam komponen mereka menggunakan ekspresi reguler, tetapi jauh lebih sederhana dan kuat untuk menggunakan urllib pustaka standar untuk ini.

  dari urllib.parse impor 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) 

Outputnya adalah:

  ParseResult (skema = 'https', netloc = 'www.searchenginejournal.com', path = '/', params = '', kueri = 's = google & search-orderby = relevansi & searchfilter = 0 & cari-tanggal-dari = Januari + 1% 2C + 2016 & pencarian-tanggal-ke = Januari + 7% 2C + 2019 ', fragment =' ') 

Misalnya, Anda dapat dengan mudah mendapatkan nama domain dan jalur direktori menggunakan:

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

Ini akan menghasilkan apa yang Anda harapkan.

Kami selanjutnya dapat memecah string kueri untuk mendapatkan parameter url dan nilainya.

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

Anda mendapatkan kamus Python sebagai output.

  {'s': ['google'],   'cari-tanggal-dari': ['1 Januari 2016'],   'search-date-to': ['7 Januari 2019'],   'search-orderby': ['relevance'],   'searchfilter': ['0']} 

Kami bisa melanjutkan dan mengurai string tanggal menjadi objek datetime Python, yang akan memungkinkan Anda untuk melakukan operasi tanggal seperti menghitung jumlah hari antara rentang. Saya akan meninggalkan itu sebagai latihan untuk Anda.

Teknik umum lain yang digunakan dalam analisis Anda adalah memecah bagian jalur URL dengan ‘/’ untuk mendapatkan bagian-bagiannya. Ini mudah dilakukan dengan fungsi split.

  url = "https://www.searchenginejournal.com/category/digital-experience/" 
 parsed_url = urlparse (url) 
 parsed_url.path.split ("/") 

Outputnya adalah:

  ['', 'kategori', 'pengalaman digital', ''] 

Saat Anda memecah jalur URL dengan cara ini, Anda dapat menggunakannya untuk mengelompokkan sekelompok besar URL dengan direktori teratas mereka.

Misalnya, Anda dapat menemukan semua produk dan semua kategori di situs web e-niaga ketika struktur URL memungkinkan untuk ini.

Melakukan Analisa SEO Dasar

Anda akan menghabiskan sebagian besar waktu Anda untuk mendapatkan data dalam format yang tepat untuk analisis. Bagian analisis relatif mudah, asalkan Anda tahu pertanyaan yang tepat untuk ditanyakan.

Mari kita mulai dengan memuat penjelajahan Screaming Frog ke dalam kerangka data panda.

  impor panda sebagai pd
 df = pd.DataFrame (pd.read_csv ('internal_all.csv', header = 1, parse_dates = ['Last Modified'])))
 cetak (df.dtypes) 

Output menunjukkan semua kolom yang tersedia di file Screaming Frog, dan tipe Python mereka. Saya meminta panda untuk mengurai kolom Modifikasi Terakhir menjadi objek datetime Python.

Mari kita lakukan beberapa contoh analisis.

Pengelompokan berdasarkan Top Level Directory

Pertama, mari kita buat kolom baru dengan jenis halaman dengan memisahkan jalur URL dan mengekstraksi nama direktori pertama.

  df ['Jenis Halaman'] = df ['Alamat']. berlaku (lambda x: urlparse (x) .path.split ("/") [1])
 aggregated_df = df [['Jenis Halaman', 'Jumlah Kata']]. groupby (['Jenis Halaman']) .ag ('jumlah')
 print (aggregated_df) 

Setelah kami membuat kolom Jenis Halaman, kami mengelompokkan semua halaman berdasarkan jenis dan dengan total jumlah kata. Outputnya sebagian terlihat seperti ini:

  panduan seo 736
 seo-internal-links-best-practices 2012
 seo-keyword-audit 2104
 risiko seo 2435
 seo-tools 588
 tren seo 3448
 seo-tren-2019 2676
 nilai seo 1528 

Pengelompokan berdasarkan Kode Status

  status_code_df = df [['Kode Status', 'Alamat']]. groupby (['Kode Status']) .ag ('hitung')
 cetak (status_code_df) 
 200 218
 301 6
 302 5 

Cantumkan Pengalihan Sementara

  temp_redirects_df = df [df ['Kode Status'] == 302] ['Alamat']
 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 ... 

Daftar Halaman tanpa Konten

  no_content_df = df [(df ['Status Code'] == 200) & (df ['Word Count'] == 0)] [['Alamat', '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 

Aktivitas Penerbitan

Mari kita lihat pada jam berapa pada hari itu sebagian besar artikel diterbitkan di SEJ.

  lastmod = pd.DatetimeIndex (df ['Terakhir Dimodifikasi'])
 writing_activity_df = df.groupby ([lastmod.hour]) ['Alamat']. 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 

Sangat menarik untuk melihat bahwa tidak ada banyak perubahan selama jam kerja reguler.

Kita dapat merencanakan ini langsung dari panda.

  writing_activity_df.plot.bar () 
Bar plot menunjukkan waktu hari dimana artikel dipublikasikan di Search Engine Journal. Plot bar dibuat menggunakan Python for SEO untuk kebutuhan Analisa SEO

Bar plot menunjukkan waktu hari dimana artikel dipublikasikan di Search Engine Journal.Plot bar dibuat menggunakan Python for SEO untuk Analisa SEO

Menyimpan & Mengekspor Hasil

Sekarang kita sampai pada bagian yang mudah – menyimpan hasil kerja keras kita.

Menyimpan ke Excel

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

Menyimpan ke CSV

  temporary_redirects_df.to_csv ('temporary_redirects.csv') 

Sumber Daya Tambahan untuk Mempelajari Lebih Lanjut

Kami nyaris tidak menggores permukaan dari apa yang mungkin terjadi ketika Anda menambahkan skrip Python for SEO ke pekerjaan Analisa SEO sehari-hari Anda. Berikut ini beberapa tautan untuk dijelajahi lebih lanjut.

More Resources: