[ad_1]
在SEO社區中採用Python方面,2019年遠遠超出了我的期望。
隨著新的一年的開始,我聽到更多的SEO專業人士希望加入其中,但由於最初的學習曲線而感到沮喪,因此我決定撰寫此介紹性文章,目的是讓更多的人參與其中並做出貢獻。
大多數SEO工作涉及處理電子表格,當您與多個品牌一起使用或隨著時間的推移重複相同的分析時,必須手動重做。
當您在Python中實現相同的工作流程時,您可以輕鬆地複製工作,甚至可以自動化整個工作流程。
我們將在學習代碼的同時學習Python基礎知識 約翰·穆勒 最近在填充Google表格的Twitter上共享。我們將修改他的代碼以添加簡單的可視化。
使用Wikipedia API,出於好奇的目的,我引入了更多欄位:)。試算表: https://t.co/OSBENEubgt – Colab代碼: https://t.co/sTAb1vk8N4
-?約翰(@JohnMu) 2020年1月3日
設置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希望獲得與台式機相比在移動設備中表現更好的主題創意。
哪種內容在移動設備上比通過台式機更有用?維基百科來營救!顯然,名人/娛樂和醫療內容主導著移動。https://t.co/lvEdYmNPB2 ……還有,波美拉尼亞人?
-?約翰(@JohnMu) 2019年12月30日
他了解到,名人,娛樂和醫療內容在移動設備上效果最佳。
讓我們通讀代碼和注釋,以大致了解他如何解決此問題。
我們有幾個難題。
- 一個 空的Google工作表 有6個預填充的列和7個需要填充的列
- 空的Google工作表在單獨的標籤中包含數據透視表,該數據透視表顯示移動視圖佔Wikipedia中所有視圖的70.59%
- 筆記本代碼通過調用一個稱為update_spreadsheet_rows的輔助函數,以成對方式填充了7個缺失列。
- helper函數接收要更新的列的名稱,並接收可以返回這些列的值的調用函數。
- 填充所有列後,我們得到一個 最終的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的數據透視表並繪製一個簡單的條形圖。
您的工作是將此代碼添加到筆記本的副本中,並添加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月