使用電子表格的SEO專業人員Python簡介

[ad_1]

使用電子表格的SEO專業人員Python簡介

在SEO社區中採用Python方面,2019年遠遠超出了我的期望。

隨著新的一年的開始,我聽到更多的SEO專業人士希望加入其中,但由於最初的學習曲線而感到沮喪,因此我決定撰寫此介紹性文章,目的是讓更多的人參與其中並做出貢獻。

大多數SEO工作涉及處理電子表格,當您與多個品牌一起使用或隨著時間的推移重複相同的分析時,必須手動重做。

當您在Python中實現相同的工作流程時,您可以輕鬆地複製工作,甚至可以自動化整個工作流程。

我們將在學習代碼的同時學習Python基礎知識 約翰·穆勒 最近在填充Google表格的Twitter上共享。我們將修改他的代碼以添加簡單的可視化。

設置Python環境

與使用Excel或Google表格相似,使用Python時有兩個主要選項。

您可以在本地計算機上安裝和運行Python,也可以使用Google Colab或Jupyter筆記本在雲中運行它。

讓我們逐一回顧一下。

在本地計算機上使用Python

我通常選擇在Mac上運行無法在雲中運行的軟體時使用Mac,例如,當我需要使Web瀏覽器自動化時。

您需要下載三個軟體包:

  • 水蟒。
  • Visual Studio代碼。
  • 代碼的Python綁定。

https://www.anaconda.com/distribution/ 下載並安裝適用於您操作系統的Python 3.7。 Anaconda包含Python和數據分析所需的大多數庫。

這將需要一段時間才能完成。

完成後,搜索Anaconda Navigator並啟動它。

單擊以啟動JupyterLab,它將通過JupyterLab會話在瀏覽器中打開一個新選項卡。

單擊大圖標以啟動Python 3筆記本,您正在閱讀以開始鍵入或複製/粘貼代碼段。

您可以認為此筆記本類似於新的Excel工作表。

下一步是可選的。

https://code.visualstudio.com/download 並下載並為您的計算機安裝Visual Studio Code。

當我需要用Python和JavaScript編寫代碼或編寫JavaScript代碼時,我會親自使用Visual Studio Code。如果要將筆記本代碼轉換為命令行腳本,也可以使用它。

在Jupyter筆記本中進行原型製作更容易,並且當所有事情都可以正常工作時,可以使用Visual Studio Code將所有內容放到其他人可以從命令行使用的腳本或應用程序中。

確保為VSC安裝Python擴展。你可以找到它 這裡

Visual Studio代碼具有 對Jupyter Notebook的內置支持

您可以通過鍵入關鍵字Command + Shift + P並選擇選項「 Python Jupyter Notebook」來創建一個。

在雲端使用Python

我的大部分Python工作都是在Google Colab筆記本上完成的,因此這是我的首選。

https://colab.research.google.com/ 您可以跳過下載和安裝步驟。

單擊該選項以啟動一個新的Python 3筆記本,您將擁有一個等效的新Google表格。

學習Python和Pandas的基礎知識

Mueller分享了一個 Colab筆記本 從Wikipedia中提取數據並使用該數據填充Google表格。

專業程序員需要學習編程語言的內容,這可能會花費大量時間和精力。

對於SEO從業人員來說,我認為採用更簡單的方法來研究和改編現有代碼會更好。如果您嘗試這樣做,請分享您的反饋意見,看看我是否正確。

我們會在考慮實際情況的基礎上,使用您在典型的Python編程教程中學習的大多數相同基礎知識。

首先,將Mueller的筆記本保存到您的Google雲端硬碟中。

單擊鏈接後。選擇文件>將副本保存在雲端硬碟中。

這裡是 Google工作表示例 與筆記本的輸出。

整體工作流程

Mueller希望獲得與台式機相比在移動設備中表現更好的主題創意。

他了解到,名人,娛樂和醫療內容在移動設備上效果最佳。

讓我們通讀代碼和注釋,以大致了解他如何解決此問題。

我們有幾個難題。

  1. 一個 空的Google工作表 有6個預填充的列和7個需要填充的列
  2. 空的Google工作表在單獨的標籤中包含數據透視表,該數據透視表顯示移動視圖佔Wikipedia中所有視圖的70.59%
  3. 筆記本代碼通過調用一個稱為update_spreadsheet_rows的輔助函數,以成對方式填充了7個缺失列。
  4. helper函數接收要更新的列的名稱,並接收可以返回這些列的值的調用函數。
  5. 填充所有列後,我們得到一個 最終的Google工作表 其中包括更新的數據透視表,並對該主題進行了分類。

Python構建基塊

讓我們學習一些常見的Python構建基塊,同時回顧一下Mueller的代碼如何檢索值以填充兩個欄位:PageId和Description。

#獲取Wikipedia頁面ID-一堆項目所需的ID。使用「文章」列

def get_PageId(title):

#從Wikipedia獲取頁面描述

def get_description(pageId):

我們有兩個Python函數來檢索欄位。 Python函數Google表格中的功能 但是您可以通過任何方式定義他們的行為。他們接受輸入,對其進行處理,然後返回輸出。

這是我們調用get_PageId(「 Avengers:Endgame」)時獲得的PageId

‘44254295’

這是我們調用get_description(pageId)時獲得的描述

‘漫威影業公司製作的2019年超級英雄電影’

#符號後的所有內容均視為 Python注釋 並且被忽略。您可以使用注釋來記錄代碼的意圖。

讓我們逐行逐步介紹get_PageId函數,以了解如何獲取我們正在傳遞的文章標題的ID。

#調用Wikipedia API以獲取具有給定標題的文章的PageId。

  q = {「操作」:「查詢」,「格式」:「 json」,「屬性」:「信息」,「標題」:標題}

q是一個 Python字典。它包含鍵值對。如果您查找「 action」的值,則會得到「 query」,依此類推。例如,您可以使用q執行此類查詢[「action」]。

「動作」是 Python字元串。它代表文本信息。

「標題」:標題將「標題」鍵映射到 Python變數 我們作為輸入傳遞給函數的標題。除最後一個鍵和值外,所有鍵和值均經過硬編碼和顯式表示。這是執行此功能後字典的外觀。

q = {「 action」:「 query」,「 format」:「 json」,「 prop」:「 info」,「 titles」:「 Avengers:Endgame」}

在下一行中。

url =「 https://en.wikipedia.org/w/api.php?」 + urllib.parse.urlencode(q)

這裡我們有一個 Python模塊 函數urllib.parse.urlencode。模塊功能就像提供標準功能的Google表格功能一樣。

在調用模塊或庫函數之前,我們需要導入包含它們的模塊。

筆記本頂部的這一行可以做到這一點。

導入urllib.parse

讓我們澄清一下電話,看看我們得到的輸出。

urllib.parse.urlencode({「 action」:「 query」,「 format」:「 json」,「 prop」:「 info」,「 titles」:「 Avengers:Endgame」})

您可以找到有關urlencode模塊功能的詳細文檔 這裡。它的工作是將URL參數的字典轉換為查詢字元串。查詢字元串是問號後面URL的一部分。

這是我們運行它後得到的輸出。

「 action = query&format = json&prop = info&titles = Avengers%3A + Endgame」

添加urlencode的結果後,這就是我們的URL定義行。

url =「 https://en.wikipedia.org/w/api.php?」 +「 action = query&format = json&prop = info&titles = Avengers%3A + Endgame」

此處的+符號將字元串連接成一個字元串。

url =「 https://en.wikipedia.org/w/api.php?action=query&format=json&prop=info&titles=Avengers%3A+Endgame」

此結果字元串是筆記本發送到Wikipedia的API請求。

在下一行代碼中,我們打開動態生成的URL。

響應= requests.get(URL)

requests.get是Python第三方模塊函數。您需要使用以下工具安裝第三方庫 Python工具 點子

!pip install –upgrade -q請求

您可以在筆記本前面添加!來運行筆記本中的命令行腳本和工具。

後面的代碼!不是Python代碼。它是Unix shell代碼。這個 文章 提供最常用的shell命令的完整列表。

安裝第三方模塊後,需要像使用標準庫一樣導入它。

匯入要求

這是轉換後的呼叫的樣子。

響應= request.get(「 https://en.wikipedia.org/w/api.php?action=query&format=json&prop=info&titles=Avengers%3A+Endgame」)

您可以在瀏覽器中打開此請求,並查看來自Wikipedia的API響應。函數調用使我們無需手動打開Web瀏覽器即可執行此操作。

request.get調用的結果存儲在Python變數響應中。

這就是結果的樣子。

{「 batchcomplete」:「」,
「 query」:{「 pages」:{「 44254295」:{「 contentmodel」:「 wikitext」,
「 lastrevid」:933501003,
「長度」:177114,
「 ns」:0,
「 pageid」:44254295,
「 pagelanguage」:「 en」,
「 pagelanguagedir」:「 ltr」,
「 pagelanguagehtmlcode」:「 en」,
「 title」:「 Avengers:Endgame」,
「感動」:「 2020-01-03T17:13:02Z」}}}}

您可以將這種複雜的數據結構視為字典,其中某些值包括其他字典,依此類推。

代碼的下一行將數據結構切成小方塊,以提取PageId。

結果=列表(response.json()[“query”][“pages”].keys())[0]

讓我們逐步了解它如何獲得它。

response.json()[“query”]

當我們查詢關鍵字「 query」的值時,我們得到了一個較小的字典。

{「頁面」:{「 44254295」:{「 contentmodel」:「 wikitext」,
「 lastrevid」:933501003,
「長度」:177114,
「 ns」:0,
「 pageid」:44254295,
「 pagelanguage」:「 en」,
「 pagelanguagedir」:「 ltr」,
「 pagelanguagehtmlcode」:「 en」,
「 title」:「 Avengers:Endgame」,
「感動」:「 2020-01-03T17:13:02Z」}}}

然後,我們在這個較小的字典中查找「 pages」的值。

response.json()[“query”][“pages”]

我們得到的甚至更小。我們正在深入研究大型響應數據結構。

{「 44254295」:{「 contentmodel」:「 wikitext」,
「 lastrevid」:933501003,
「長度」:177114,
「 ns」:0,
「 pageid」:44254295,
「 pagelanguage」:「 en」,
「 pagelanguagedir」:「 ltr」,
「 pagelanguagehtmlcode」:「 en」,
「 title」:「 Avengers:Endgame」,
「感動」:「 2020-01-03T17:13:02Z」}}

PageId在數據結構的此部分的兩個位置可用。作為唯一鍵,或作為嵌套字典中的值。

約翰做出了最明智的選擇,那就是使用鑰匙來避免進一步的探索。

response.json()[“query”][“pages”].keys()

此調用的響應是鍵的Python字典視圖。您可以了解更多有關 詞典視圖 在這篇文章中。

dict_keys([“44254295”])

我們有想要的東西,但格式不正確。

下一步,我們將字典視圖轉換為 Python清單

列表(response.json()[“query”][“pages”].keys())

這就是轉換的樣子。

[“44254295”]

Python列表就像Google工作表中的行。它們通常包含多個用逗號分隔的值,但是在這種情況下,只有一個。

最後,我們從列表中提取我們關心的唯一元素。第一個。

列表(response.json()[“query”][“pages”].keys())[0]

Python列表中的第一個元素從索引0開始。

這是最終結果。

「 44254295」

由於這是一個標識符,最好保留為字元串,但是如果我們需要一個數字來執行算術運算,我們將進行另一次轉換。

int(列表(response.json()[“query”][“pages”].keys())[0])

在這種情況下,我們得到一個 Python整數

44254295

字元串和整數之間的主要區別是可以對它們執行的操作類型。如您所見,我們可以使用+運算符來連接兩個字元串,但是如果我們在兩個數字中使用相同的運算符,則會將它們加在一起。

「 44254295」 +「 3」 =「 442542953」

44254295 + 3 = 44254298

附帶一提,我應該提到 q,這是一個很酷的命令行工具,可讓您直接從JSON切片和切塊 捲曲 調用(另一個很棒的命令行工具)。 curl允許您執行與此處的requests模塊相同的操作,但有一定的局限性。

到目前為止,我們已經學習了如何創建函數和數據類型,這些函數和數據類型使我們能夠從第三方站點(本例中為Wikipedia)提取數據和過濾數據。

讓我們在John的筆記本中調用下一個函數,以學習另一個重要的構建塊:流控制結構。

get_description(「 442542953」)

這就是API URL的樣子。您可以在瀏覽器中嘗試一下。

「 https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageterms&pageids=44254295」

這是響應的樣子。

{「 ns」:0,
「 pageid」:44254295,
「條款」:{「別名」: [「Avengers Endgame」, 「Avengers End Game」, 「Avengers 4」],
「描述」: [「2019 superhero film produced by Marvel Studios」],
「標籤」: [「Avengers: Endgame」]},
「標題」:「復仇者聯盟:殘局」}

這是將逐步理解Python中的控制流的代碼。

#有些頁面沒有描述,所以我們不能盲目地獲取價值

  如果rs中的「術語」和rs中的「描述」[“terms”]:

    結果= rs[“terms”][“description”][0]

其他:

    結果=「」

  返回結果

此部分檢查響應結構(上面)是否包含名為「 terms」的鍵。它使用 Python If…其他控制流運算符。控制流運算符是大多數語言(包括Python)中演算法的演算法基石。

如果rs中的「 terms」

如果此檢查成功,則使用rs查找此類密鑰的值。[「terms」]

我們希望結果是另一本字典,並檢查它是否存在具有值「 description」的鍵。

rs中的「說明」[“terms”]

如果兩項檢查均成功,則我們提取並存儲描述值。

結果= rs[“terms”][“description”][0]

我們期望最終值是一個Python列表,並且我們只想要第一個元素,就像以前一樣。

蟒蛇 邏輯運算符將兩個檢查合併到一個檢查中,兩個檢查都必須為真。

如果檢查為假,則說明為空字元串。

結果=「」
從Python填充Google表格

有了對Python基本構建塊的紮實了解,現在我們可以專註於Mueller筆記本最激動人心的部分:使用從Wikipedia中提取的值自動填充Google表格。

#helper函數,使用函數更新電子表格中的所有行

def update_spreadsheet_rows(fieldName,parameterName,functionToCall,forceUpdate = False):

  #瀏覽電子表格,使用計算出的數據更新列「 fieldName」

  #by’functionToCall(parameterName)’。這樣做時顯示進度條。

  #僅計算/更新沒有值的行,除非forceUpdate = True。

讓我們逐步介紹該功能的一些有趣部分。

第三方模塊涵蓋了更新Google表格的功能。

我們需要先安裝並導入它,然後才能使用它。

!pip install –upgrade -q gspread

導入gspread

Mueller選擇將紙張轉換成 大熊貓 數據框,雖然正如他在評論中提到的那樣,這不是必需的,但是我們也可以藉此機會學習一些熊貓。

update_spreadsheet_rows(「 PageId」,「 Article」,get_PageId)

在填充一列的每個輔助函數的結尾,我們都有一個類似於上面的調用。

我們正在傳遞相關的列和將獲得相應值的函數。

在Python中使用參數傳遞函數名稱時,不是傳遞數據而是傳遞代碼以執行該函數。據我所知,這不是您可以在電子表格中執行的操作。

columnNr = df.columns.get_loc(fieldName)+ 1#輸出欄位的列號

我們想知道的第一件事是我們需要更新哪一列。當我們運行上面的代碼時,我們得到7,這是工作表中PageId的列位置(從1開始)。

對於索引,在df.iterrows()中行:

在這行代碼中,我們還有另一個控制流運算符 Python For循環。 For循環使您可以遍歷表示集合的元素,例如列表和字典。

在上面的例子中,我們遍歷一個字典,其中索引變數將保存鍵,而行變數將保存值。

更確切地說,我們正在迭代 Python字典檢視,字典視圖就像字典的只讀且更快的副本,非常適合迭代。

當您列印序號時,實際上並沒有得到這些值,但是 Python迭代器 賓語。

與手動訪問集合相比,迭代器是可以按需訪問數據,需要較少的內存並且執行速度更快的功能。

指數:

2

行:

文章CésarAlonso de las Heras

網址https://en.wikipedia.org/wiki/César_Alonso_de_…

查看1,944,569

PartMobile 79.06%

ViewsMobile 1,537,376

桌面407,193

網頁編號18247033

描述

WikiInLinks

WikiOutLinks

ExtOutLinks

WikidataId

維基數據實例

名稱:2,dtype:對象

sdsdsds

這是for循環的示例迭代。我列印了索引和行值。

#如果我們已經做過,除非設置了’forceUpdate’,否則不要重新計算。

    如果forceUpdate或不行[fieldName]:

      結果= functionToCall(行[parameterName])

forceUpdate是一個 Python布爾值 默認為False的值。布爾值只能為true或false。

行[「PageId」] 最初為空,所以不行[「PageId」] 為true,將執行下一行。或運算符僅在標誌forceUpdate為true時才允許下一行執行後續運行。

結果= functionToCall(get_PageId)

這是調用我們的自定義函數以獲取頁面ID的代碼。

示例迭代的結果值為39728003

當您仔細查看該功能時,您會注意到我們使用了該功能中未定義的df。該代碼位於筆記本的開頭。

#轉換為DataFrame並進行渲染。

#(一個DataFrame實在是太過分了,但是我想和他們一起玩更多:))

將熊貓作為pd導入

df = pd.DataFrame.from_records(worksheetRows)

該代碼使用第三方模塊pandas從Google表格行創建數據框。我建議閱讀 10分鐘到熊貓文章 熟悉一下這是一個非常強大的數據處理庫。

最後,讓我們看看如何更新Google表格。

行[fieldName] =結果#本地保存

      worksheet.update_cell(index + 1,columnNr,result)#更新工作表

此代碼可以翻譯成。

行[“PageId”] = 39728003#本地保存

      worksheet.update_cell(3 + 1,7,39728003)#更新工作表

這是更新Google工作表的代碼。在update_spreadsheet_rows函數中也未定義變數工作表,但是您可以在筆記本的開頭找到它。

#驗證(詳細複製和粘貼密鑰),並閱讀電子表格

#(這總是令人困惑,但它可以工作)

從google.colab導入身份驗證

auth.authenticate_user()

導入gspread

從oauth2client.client導入GoogleCredentials

gc = gspread.authorize(GoogleCredentials.get_application_default())

#從電子表格中獲取所有數據

工作表= gc.open(spreadsheetName).sheet1

worksheetRows = worksheet.get_all_values()

我將這段代碼留在了最後,因為它是最後執行的東西,而且比以前的代碼還要複雜。但是,這是您需要在筆記本中執行的第一件事。

首先,我們導入第三方模塊gspread,並在Chrome中完成Oauth身份驗證以訪問Google表格。

#從電子表格中獲取所有數據

工作表= gc.open(「 Wikipedia-Views-2019」)。sheet1

worksheetRows = worksheet.get_all_values()

我們使用worksheet變數來操縱Google工作表,並使用worksheetRows變數來創建pandas Dataframe。

從Python可視化

現在我們開始您的作業。

我編寫了代碼,以部分複製John的數據透視表並繪製一個簡單的條形圖。

使用電子表格的SEO專業人員Python簡介「 width =」 362「 height =」 424「 srcset =」「 src =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/01/bar-plot -5e1661693a353.png

您的工作是將此代碼添加到筆記本的副本中,並添加print(varible_name)語句以了解我在做什麼。這就是我分析約翰代碼的方式。

這是代碼。

#從Python可視化

df.groupby(「 WikidataInstance」)。agg({「 ViewsMobile」:np.sum,「 ViewsDesktop」:np.sum})

#匯總無效,因為數字中包含逗號

#這會產生錯誤ValueError:無法分析位置0處的字元串「 1,038,950,248」
#pd.to_numeric(df[“ViewsMobile”])

#StackOverflow是你的朋友:)

#https://stackoverflow.com/questions/22137723/convert-number-strings-with-commas-in-pandas-dataframe-to-float
導入語言環境

從語言環境導入atoi
locale.setlocale(locale.LC_NUMERIC,“)

#df[[“ViewsMobile”, “ViewsDesktop”]].applymap(atoi)

df[“ViewsMobile”] = df[“ViewsMobile”].apply(atoi)

df[“ViewsDesktop”] = df[“ViewsDesktop”].apply(atoi)

#我們再試一次就可以了
totals_df = df.groupby(「 WikidataInstance」)。agg({「 ViewsMobile」:np.sum,「 ViewsDesktop」:np.sum})

totals_df

#這裡我們繪圖
totals_df.head(20).plot(kind =「 bar」)
了解更多的資源

如果您已經了解了這一點,並且想了解更多信息,建議您按照本文中包含的鏈接進行操作,並練習其中的代碼段。 本指南

在大多數的結尾 我的專欄,我分享了來自SEO社區的有趣的Python項目。請考慮檢查您感興趣的對象,並像我們在這裡一樣研究它們。

但是,更好的是,看看您如何能夠添加一些簡單但有價值的東西,並可以分享回來!

圖片積分

屏幕快照由作者拍攝,2020年1月

相關文章