使用电子表格的SEO专业人员Python简介

谷歌seo

在SEO社区中采用Python方面,2019年远远超出了我的期望。

随着新的一年的开始,我听到更多的SEO专业人士希望加入其中,但由于最初的学习曲线而感到沮丧,因此我决定撰写此介绍性文章,目的是让更多的人参与其中并做出贡献。

大多数SEO工作涉及处理电子表格,当您与多个品牌一起使用或随着时间的推移重复相同的分析时,必须手动重做。

当您在Python中实现相同的工作流程时,您可以轻松地复制工作,甚至可以自动化整个工作流程。

我们将在学习代码的同时学习Python基础知识约翰·穆勒最近在填充Google表格的Twitter上共享。我们将修改他的代码以添加简单的可视化。

使用WikipediaAPI,出于好奇的目的,我引入了更多字段:)。试算表:https://t.co/OSBENEubgt–Colab代码:https://t.co/sTAb1vk8N4

-?约翰(@JohnMu)2020年1月3日

设置Python环境

与使用Excel或Google表格相似,使用Python时有两个主要选项。

您可以在本地计算机上安装和运行Python,也可以使用GoogleColab或Jupyter笔记本在云中运行它。

让我们逐一回顾一下。

在本地计算机上使用Python

我通常选择在Mac上运行无法在云中运行的软件时使用Mac,例如,当我需要使Web浏览器自动化时。

您需要下载三个软件包:

  • 水蟒。
  • VisualStudio代码。
  • 代码的Python绑定。

去https://www.anaconda.com/distribution/下载并安装适用于您操作系统的Python3.7。Anaconda包含Python和数据分析所需的大多数库。

这将需要一段时间才能完成。

完成后,搜索AnacondaNavigator并启动它。

单击以启动JupyterLab,它将通过JupyterLab会话在浏览器中打开一个新选项卡。

单击大图标以启动Python3笔记本,您正在阅读以开始键入或复制/粘贴代码段。

您可以认为此笔记本类似于新的Excel工作表。

下一步是可选的。

去https://code.visualstudio.com/download并下载并为您的计算机安装VisualStudioCode。

当我需要用Python和JavaScript编写代码或编写JavaScript代码时,我会亲自使用VisualStudioCode。如果要将笔记本代码转换为命令行脚本,也可以使用它。

在Jupyter笔记本中进行原型制作更容易,并且当所有事情都可以正常工作时,可以使用VisualStudioCode将所有内容放到其他人可以从命令行使用的脚本或应用程序中。

确保为VSC安装Python扩展。你可以找到它这里。

VisualStudio代码具有对JupyterNotebook的内置支持。

您可以通过键入关键字Command+Shift+P并选择选项“PythonJupyterNotebook”来创建一个。

在云端使用Python

我的大部分Python工作都是在GoogleColab笔记本上完成的,因此这是我的首选。

去https://colab.research.google.com/您可以跳过下载和安装步骤。

单击该选项以启动一个新的Python3笔记本,您将拥有一个等效的新Google表格。

学习Python和Pandas的基础知识

Mueller分享了一个Colab笔记本从Wikipedia中提取数据并使用该数据填充Google表格。

专业程序员需要学习编程语言的内容,这可能会花费大量时间和精力。

对于SEO从业人员来说,我认为采用更简单的方法来研究和改编现有代码会更好。如果您尝试这样做,请分享您的反馈意见,看看我是否正确。

我们会在考虑实际情况的基础上,使用您在典型的Python编程教程中学习的大多数相同基础知识。

首先,将Mueller的笔记本保存到您的Google云端硬盘中。

单击链接后。选择文件>将副本保存在云端硬盘中。

这里是Google工作表示例与笔记本的输出。

整体工作流程

Mueller希望获得与台式机相比在移动设备中表现更好的主题创意。

哪种内容在移动设备上比通过台式机更有用?维基百科来营救!显然,名人/娱乐和医疗内容主导着移动。https://t.co/lvEdYmNPB2……还有,波美拉尼亚人?

-?约翰(@JohnMu)2019年12月30日

他了解到,名人,娱乐和医疗内容在移动设备上效果最佳。

让我们通读代码和注释,以大致了解他如何解决此问题。

我们有几个难题。

  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。使用“文章”列

defget_PageId(title):

#从Wikipedia获取页面描述

defget_description(pageId):

我们有两个Python函数来检索字段。Python函数像Google表格中的功能但是您可以通过任何方式定义他们的行为。他们接受输入,对其进行处理,然后返回输出。

这是我们调用get_PageId(“Avengers:Endgame”)时获得的PageId

‘44254295’

这是我们调用get_description(pageId)时获得的描述

‘漫威影业公司制作的2019年超级英雄电影’

#符号后的所有内容均视为Python注释并且被忽略。您可以使用注释来记录代码的意图。

让我们逐行逐步介绍get_PageId函数,以了解如何获取我们正在传递的文章标题的ID。

#调用WikipediaAPI以获取具有给定标题的文章的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工具点子

!pipinstall–upgrade-q请求

您可以在笔记本前面添加!来运行笔记本中的命令行脚本和工具。

后面的代码!不是Python代码。它是Unixshell代码。这个文章提供最常用的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”)

这就是APIURL的样子。您可以在浏览器中尝试一下。

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

这是响应的样子。

{“ns”:0,
“pageid”:44254295,
“条款”:{“别名”:[“AvengersEndgame”,“AvengersEndGame”,“Avengers4”],
“描述”:[“2019superherofilmproducedbyMarvelStudios”],
“标签”:[“Avengers:Endgame”]},
“标题”:“复仇者联盟:残局”}

这是将逐步理解Python中的控制流的代码。

#有些页面没有描述,所以我们不能盲目地获取价值

  如果rs中的“术语”和rs中的“描述”[“terms”]:

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

其他:

    结果=“”

  返回结果

此部分检查响应结构(上面)是否包含名为“terms”的键。它使用PythonIf…其他控制流运算符。控制流运算符是大多数语言(包括Python)中算法的算法基石。

如果rs中的“terms”

如果此检查成功,则使用rs查找此类密钥的值。[“terms”]

我们希望结果是另一本字典,并检查它是否存在具有值“description”的键。

rs中的“说明”[“terms”]

如果两项检查均成功,则我们提取并存储描述值。

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

我们期望最终值是一个Python列表,并且我们只想要第一个元素,就像以前一样。

和蟒蛇逻辑运算符将两个检查合并到一个检查中,两个检查都必须为真。

如果检查为假,则说明为空字符串。

结果=“”从Python填充Google表格

有了对Python基本构建块的扎实了解,现在我们可以专注于Mueller笔记本最激动人心的部分:使用从Wikipedia中提取的值自动填充Google表格。

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

defupdate_spreadsheet_rows(fieldName,parameterName,functionToCall,forceUpdate=False):

  #浏览电子表格,使用计算出的数据更新列“fieldName”

  #by’functionToCall(parameterName)’。这样做时显示进度条。

  #仅计算/更新没有值的行,除非forceUpdate=True。

让我们逐步介绍该功能的一些有趣部分。

第三方模块涵盖了更新Google表格的功能。

我们需要先安装并导入它,然后才能使用它。

!pipinstall–upgrade-qgspread

导入gspread

Mueller选择将纸张转换成大熊猫数据框,虽然正如他在评论中提到的那样,这不是必需的,但是我们也可以借此机会学习一些熊猫。

update_spreadsheet_rows(“PageId”,“Article”,get_PageId)

在填充一列的每个辅助函数的结尾,我们都有一个类似于上面的调用。

我们正在传递相关的列和将获得相应值的函数。

在Python中使用参数传递函数名称时,不是传递数据而是传递代码以执行该函数。据我所知,这不是您可以在电子表格中执行的操作。

columnNr=df.columns.get_loc(fieldName)+1#输出字段的列号

我们想知道的第一件事是我们需要更新哪一列。当我们运行上面的代码时,我们得到7,这是工作表中PageId的列位置(从1开始)。

对于索引,在df.iterrows()中行:

在这行代码中,我们还有另一个控制流运算符PythonFor循环。For循环使您可以遍历表示集合的元素,例如列表和字典。

在上面的例子中,我们遍历一个字典,其中索引变量将保存键,而行变量将保存值。

更确切地说,我们正在迭代Python字典检视,字典视图就像字典的只读且更快的副本,非常适合迭代。

当您打印序号时,实际上并没有得到这些值,但是Python迭代器宾语。

与手动访问集合相比,迭代器是可以按需访问数据,需要较少的内存并且执行速度更快的功能。

指数:

2

行:

文章CésarAlonsodelasHeras

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

查看1,944,569

PartMobile79.06%

ViewsMobile1,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变量来创建pandasDataframe。

从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导入语言环境

从语言环境导入atoilocale.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月

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/167306.html

(0)

相关推荐