[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月