SEO タスクを自動化するための 5 つの Python スクリプト
公開: 2023-04-12Python は、ここ数年で SEO 業界で人気を博した強力なプログラミング言語です。
比較的単純な構文、効率的なパフォーマンス、豊富なライブラリとフレームワークを備えた Python は、多くの SEO が仕事に取り組む方法に革命をもたらしました。
Python は、最適化プロセスをより速く、より正確に、より効果的にするのに役立つ多用途のツールセットを提供します。
この記事では、SEO の取り組みを後押しする 5 つの Python スクリプトについて説明します。
- リダイレクト マップを自動化します。
- メタディスクリプションをまとめて書く。
- N-gram でキーワードを分析します。
- キーワードをトピック クラスタにグループ化します。
- キーワード リストを定義済みトピックのリストに一致させます。
Python を始める最も簡単な方法
Python プログラミングに足を踏み入れたい場合は、Google Colab を検討する価値があります。
これは無料の Web ベースのプラットフォームであり、複雑なローカル セットアップを必要とせずに Python コードを記述および実行するための便利なプレイグラウンドを提供します。
基本的に、ブラウザ内で Jupyter ノートブックにアクセスできるようにし、データ サイエンスと機械学習用のプレインストールされた多数のライブラリを提供します。
さらに、Google ドライブ上に構築されているため、作業内容を簡単に保存して他のユーザーと共有できます。
開始するには、次の手順に従います。
ファイルのアップロードを有効にする
Google Colab を開いたら、まず一時ファイル リポジトリを作成する機能を有効にする必要があります。 フォルダのアイコンをクリックするだけです。
これにより、一時ファイルをアップロードしてから、結果ファイルをダウンロードできます。
ソースデータのアップロード
Python スクリプトの多くは、動作するためにソース ファイルを必要とします。 ファイルをアップロードするには、アップロード ボタンをクリックするだけです。
セットアップが完了したら、次の Python スクリプトのテストを開始できます。
スクリプト 1: リダイレクト マップを自動化する
大規模なサイトのリダイレクト マップの作成には、非常に時間がかかる場合があります。 プロセスを自動化する方法を見つけることで、時間を節約し、他のタスクに集中することができます。
このスクリプトの仕組み
このスクリプトは、Web コンテンツを分析して、密接に一致する記事を見つけることに重点を置いています。
- 最初に、URL の 2 つの TXT ファイルをインポートします。1 つはリダイレクトされた Web サイト (source_urls.txt) 用で、もう 1 つはリダイレクトされた Web サイトを吸収するサイト (target_urls.txt) 用です。
- 次に、Python ライブラリの Beautiful Soup を使用して Web スクレイパーを作成し、ページの本文コンテンツを取得します。 このスクリプトは、ヘッダーとフッターのコンテンツを無視します。
- すべてのページのコンテンツをクロールした後、Python ライブラリの Polyfuzz を使用して、URL 間のコンテンツを類似パーセンテージで照合します。
- 最後に、類似パーセンテージを含む結果を CSV ファイルに出力します。
ここから、類似度の低い URL を手動で確認して、次に近い一致を見つけることができます。
スクリプトを入手する
#import libraries from bs4 import BeautifulSoup, SoupStrainer from polyfuzz import PolyFuzz import concurrent.futures import csv import pandas as pd import requests #import urls with open("source_urls.txt", "r") as file: url_list_a = [line.strip() for line in file] with open("target_urls.txt", "r") as file: url_list_b = [line.strip() for line in file] #create a content scraper via bs4 def get_content(url_argument): page_source = requests.get(url_argument).text strainer = SoupStrainer('p') soup = BeautifulSoup(page_source, 'lxml', parse_only=strainer) paragraph_list = [element.text for element in soup.find_all(strainer)] content = " ".join(paragraph_list) return content #scrape the urls for content with concurrent.futures.ThreadPoolExecutor() as executor: content_list_a = list(executor.map(get_content, url_list_a)) content_list_b = list(executor.map(get_content, url_list_b)) content_dictionary = dict(zip(url_list_b, content_list_b)) #get content similarities via polyfuzz model = PolyFuzz("TF-IDF") model.match(content_list_a, content_list_b) data = model.get_matches() #map similarity data back to urls def get_key(argument): for key, value in content_dictionary.items(): if argument == value: return key return key with concurrent.futures.ThreadPoolExecutor() as executor: result = list(executor.map(get_key, data["To"])) #create a dataframe for the final results to_zip = list(zip(url_list_a, result, data["Similarity"])) df = pd.DataFrame(to_zip) df.columns = ["From URL", "To URL", "% Identical"] #export to a spreadsheet with open("redirect_map.csv", "w", newline="") as file: columns = ["From URL", "To URL", "% Identical"] writer = csv.writer(file) writer.writerow(columns) for row in to_zip: writer.writerow(row)
スクリプト 2: メタ ディスクリプションをまとめて書く
メタ ディスクリプションは直接的なランキング要因ではありませんが、オーガニック クリック率の向上に役立ちます。 メタ ディスクリプションを空白のままにしておくと、Google が独自のディスクリプションを作成する可能性が高くなります。
SEO 監査でメタ ディスクリプションが欠落している URL が多数示されている場合、特に e コマース Web サイトの場合、それらすべてを手作業で記述するのは困難な場合があります。
このスクリプトは、そのプロセスを自動化することで時間を節約することを目的としています。
スクリプトの仕組み
- まず、スクリプトは TXT ファイル (urls.txt) から URL のリストをインポートします。
- 次に、URL のすべてのコンテンツを解析します。
- コンテンツが解析されると、155 文字未満になるようにメタ ディスクリプションが作成されます。
- 結果を CSV ファイルにエクスポートします。
スクリプトを入手する
!pip install sumy from sumy.parsers.html import HtmlParser from sumy.nlp.tokenizers import Tokenizer from sumy.nlp.stemmers import Stemmer from sumy.utils import get_stop_words from sumy.summarizers.lsa import LsaSummarizer import csv #1) imports a list of URLs from a txt file with open('urls.txt') as f: urls = [line.strip() for line in f] results = [] # 2) analyzes the content on each URL for url in urls: parser = HtmlParser.from_url(url, Tokenizer("english")) stemmer = Stemmer("english") summarizer = LsaSummarizer(stemmer) summarizer.stop_words = get_stop_words("english") description = summarizer(parser.document, 3) description = " ".join([sentence._text for sentence in description]) if len(description) > 155: description = description[:152] + '...' results.append({ 'url': url, 'description': description }) # 4) exports the results to a csv file with open('results.csv', 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=['url','description']) writer.writeheader() writer.writerows(results)
スクリプト 3: N-gram を使用してキーワードを分析する
N グラムは新しい概念ではありませんが、依然として SEO に役立ちます。 それらは、キーワード データの大規模なセット全体でテーマを理解するのに役立ちます。
このスクリプトの仕組み
このスクリプトは、キーワードを 1 グラム、2 グラム、3 グラムに分割する TXT ファイルに結果を出力します。
- まず、すべてのキーワードの TXT ファイル (keyword.txt) をインポートします。
- 次に、Counter という Python ライブラリを使用して、N グラムを分析および抽出します。
- 次に、結果を新しい TXT ファイルにエクスポートします。
このスクリプトを入手
#Import necessary libraries import re from collections import Counter #Open the text file and read its contents into a list of words with open('keywords.txt', 'r') as f: words = f.read().split() #Use a regular expression to remove any non-alphabetic characters from the words words = [re.sub(r'[^a-zA-Z]', '', word) for word in words] #Initialize empty dictionaries for storing the unigrams, bigrams, and trigrams unigrams = {} bigrams = {} trigrams = {} #Iterate through the list of words and count the number of occurrences of each unigram, bigram, and trigram for i in range(len(words)): # Unigrams if words[i] in unigrams: unigrams[words[i]] += 1 else: unigrams[words[i]] = 1 # Bigrams if i < len(words)-1: bigram = words[i] + ' ' + words[i+1] if bigram in bigrams: bigrams[bigram] += 1 else: bigrams[bigram] = 1 # Trigrams if i < len(words)-2: trigram = words[i] + ' ' + words[i+1] + ' ' + words[i+2] if trigram in trigrams: trigrams[trigram] += 1 else: trigrams[trigram] = 1 # Sort the dictionaries by the number of occurrences sorted_unigrams = sorted(unigrams.items(), key=lambda x: x[1], reverse=True) sorted_bigrams = sorted(bigrams.items(), key=lambda x: x[1], reverse=True) sorted_trigrams = sorted(trigrams.items(), key=lambda x: x[1], reverse=True) # Write the results to a text file with open('results.txt', 'w') as f: f.write("Most common unigrams:\n") for unigram, count in sorted_unigrams[:10]: f.write(unigram + ": " + str(count) + "\n") f.write("\nMost common bigrams:\n") for bigram, count in sorted_bigrams[:10]: f.write(bigram + ": " + str(count) + "\n") f.write("\nMost common trigrams:\n") for trigram, count in sorted_trigrams[:10]: f.write(trigram + ": " + str(count) + "\n")
スクリプト 4: キーワードをトピック クラスターにグループ化する
新しい SEO プロジェクトでは、キーワード調査は常に初期段階にあります。 1 つのデータセットで何千ものキーワードを扱うことがあり、グループ化が難しくなります。
Python を使用すると、キーワードを類似のグループに自動的にクラスター化して、傾向の傾向を特定し、キーワード マッピングを完成させることができます。
このスクリプトの仕組み
- このスクリプトは、最初にキーワードの TXT ファイル (keywords.txt) をインポートします。
- 次に、スクリプトは TfidfVectorizer と AffinityPropagation を使用してキーワードを分析します。
- 次に、各トピック クラスターに数値を割り当てます。
- 結果は csv ファイルにエクスポートされます。
このスクリプトを入手
import csv import numpy as np from sklearn.cluster import AffinityPropagation from sklearn.feature_extraction.text import TfidfVectorizer # Read keywords from text file with open("keywords.txt", "r") as f: keywords = f.read().splitlines() # Create a Tf-idf representation of the keywords vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(keywords) # Perform Affinity Propagation clustering af = AffinityPropagation().fit(X) cluster_centers_indices = af.cluster_centers_indices_ labels = af.labels_ # Get the number of clusters found n_clusters = len(cluster_centers_indices) # Write the clusters to a csv file with open("clusters.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["Cluster", "Keyword"]) for i in range(n_clusters): cluster_keywords = [keywords[j] for j in range(len(labels)) if labels[j] == i] if cluster_keywords: for keyword in cluster_keywords: writer.writerow([i, keyword]) else: writer.writerow([i, ""])
スクリプト 5: キーワード リストを定義済みトピックのリストに一致させます
これは前のスクリプトと似ていますが、キーワードのリストを定義済みのトピックのセットに一致させることができる点が異なります。
これは、システム クラッシュを防ぐためにキーワードを 1,000 のバッチで処理するため、大量のキーワード セットに最適です。
このスクリプトの仕組み
- このスクリプトは、キーワード リスト (keywords.txt) とトピック リスト (topics.txt) をインポートします。
- 次に、トピックとキーワード リストを分析し、最も近いものに一致させます。 一致するものが見つからない場合は、その他として分類されます。
- 結果は CSV ファイルにエクスポートされます。
このスクリプトを入手
import pandas as pd import spacy from spacy.lang.en.stop_words import STOP_WORDS # Load the Spacy English language model nlp = spacy.load("en_core_web_sm") # Define the batch size for keyword analysis BATCH_SIZE = 1000 # Load the keywords and topics files as Pandas dataframes keywords_df = pd.read_csv("keywords.txt", header=None, names=["keyword"]) topics_df = pd.read_csv("topics.txt", header=None, names=["topic"]) # Define a function to categorize a keyword based on the closest related topic def categorize_keyword(keyword): # Tokenize the keyword tokens = nlp(keyword.lower()) # Remove stop words and punctuation tokens = [token.text for token in tokens if not token.is_stop and not token.is_punct] # Find the topic that has the most token overlaps with the keyword max_overlap = 0 best_topic = "Other" for topic in topics_df["topic"]: topic_tokens = nlp(topic.lower()) topic_tokens = [token.text for token in topic_tokens if not token.is_stop and not token.is_punct] overlap = len(set(tokens).intersection(set(topic_tokens))) if overlap > max_overlap: max_overlap = overlap best_topic = topic return best_topic # Define a function to process a batch of keywords and return the results as a dataframe def process_keyword_batch(keyword_batch): results = [] for keyword in keyword_batch: category = categorize_keyword(keyword) results.append({"keyword": keyword, "category": category}) return pd.DataFrame(results) # Initialize an empty dataframe to hold the results results_df = pd.DataFrame(columns=["keyword", "category"]) # Process the keywords in batches for i in range(0, len(keywords_df), BATCH_SIZE): keyword_batch = keywords_df.iloc[i:i+BATCH_SIZE]["keyword"].tolist() batch_results_df = process_keyword_batch(keyword_batch) results_df = pd.concat([results_df, batch_results_df]) # Export the results to a CSV file results_df.to_csv("results.csv", index=False)
SEO のための Python の使用
Python は、SEO の専門家にとって非常に強力で用途の広いツールです。
あなたが初心者であろうとベテランの実践者であろうと、この記事で紹介した無料のスクリプトは、SEO における Python の可能性を探るための優れた出発点となります。
直感的な構文と膨大な数のライブラリを備えた Python は、面倒なタスクを自動化し、複雑なデータを分析し、Web サイトのパフォーマンスに関する新しい洞察を得るのに役立ちます。 それでは、試してみませんか?
幸運を祈ります。コーディングをお楽しみください。
この記事で表明された意見はゲスト著者のものであり、必ずしも Search Engine Land ではありません。 スタッフの著者はここにリストされています。