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