如果你想了解一个网站的内容,尤其是大型出版商的内容,你会从哪里开始呢?
我通常对以下问题感兴趣:
他们发布的频率和数量是多少?
他们的出版活动是否有每日、每周、每月或每年的趋势?
他们写什么主题,或者他们卖什么产品?
他们的话题有什么趋势?哪些话题的数量在增加,哪些没有?
内容或产品是如何跨语言、地区、类别或作者划分的?
在最基本的形式中,站点地图只需要有“loc”标签(在父“url”标签下)。
从本质上讲,站点地图可以只是一个url列表。允许使用其他可选标签,最重要的是:
“lastmod”,
“changefreq”,
“优先级”,
在某些情况下,还有“alternate”。
如果您在站点地图中有“lastmod”(大多数知名站点都有),那么您可以获得与发布活动和趋势相关的所有信息。然后,url的丰富程度决定了您可以提取多少信息,但请记住,如果url的结构没有像example.com/product/12345这样的实际信息,那么您将无法从站点地图中获得多少信息。
本教程的目标是使站点地图不那么无聊!
我将分析BuzzFeed的站点地图,因为他们有“lastmod”以及一致和丰富的url,我们将能够回答上面提出的所有问题。
这将用作“发布日期”的代理,这不是100%准确,因为页面会更新。总的来说,我发现,如果事情发生了变化,他们往往会在一两天内做出一些纠正,而大多数人则不会。
分析用Python
我将使用Python进行分析,本文的交互式版本可以在这里找到。如果你想继续学习的话,我鼓励你去看看。这样,你就可以做出改变,探索你可能感兴趣的其他事情。
数据可视化也是交互式的,因此您将能够更好地缩放、悬停和探索。如果你不懂编程,你可以安全地忽略所有的代码片段(无论如何我将解释)。
我们开始吧。
为了获得表格格式的站点地图,我将使用advertools包中的sitemap_to_df函数。“df”是DataFrame的缩写,它基本上是一个数据表。
您只需将站点地图的URL(或站点地图索引URL)传递给该函数,它就会以表格格式返回站点地图。如果您给它一个站点地图索引,那么它将遍历所有子站点地图并提取url和任何其他可用的数据。除了广告工具,我还将使用pandas进行数据操作,以及使用plot进行数据可视化。
检索站点地图的BuzzFeed,并合并到一个DataFrame
来自“buzzfeed”DataFrame的示例行
上面是我们的DataFrame的一个小子集——“lastmod”是索引,我们有两列;“loc”是URL, “sitemap”是检索URL的站点地图的URL。
“NaT”代表“not-a-time”,它是日期/时间对象的缺失值表示。如您所见,我们有大约50万个url要浏览。
提取站点地图类别
如果您查看站点地图的url,您将看到它们包含网站类别,例如:
https://www.buzzfeed.com/sitemap/buzzfeed/ 2019 _5.xml
https://www.buzzfeed.com/sitemap/购物/ 2018 _13.xml
这有助于理解URL属于哪个类别。
为了从这些url中提取类别,下面一行用正斜杠字符分隔XML url,并获取结果列表的第五个元素(索引4)。提取的文本将被分配到一个名为sitemap_cat的新列。
提取站点地图类别并放置在新列“sitemap_cat”中。
现在我们有了一个显示类别的列,我们可以计算它们有多少个url,并概览每个类别下的相对内容量。
下面的代码只是对该列中的值进行计数,并对结果DataFrame进行格式化。
每个类别的文章数量,以及百分比
很明显,“buzzfeed”是主要的类别,基本上是主要的网站,相比之下,其他的都很小。
在继续之前,有必要更好地理解我们在开始时看到的NaT值。让我们看看它们属于哪一类。
“lastmod”不可用的类别(前五个)
前五个属于“视频”,但对于所有缺失的值都是如此吗?
下面一行获取DataFrame Buzzfeed的一个子集(索引包含缺失值的子集),然后获取sitemap_cat列,并计算唯一值的数量。因为我们看到有些值是“video”,如果唯一值的个数是1,那么所有缺失日期的类别都属于“video”。
“lastmod”不可用的唯一类别的数量
我们现在发现了数据集中的一个限制,我们知道它影响了2.1%的url。
但是,我们不知道它们所代表的流量和/或收入的百分比。我们将无法分析与视频url有关的日期问题。我们也无法获得有关这些url内容的任何信息:
视频url示例
出版趋势
现在让我们来看看他们每年发表多少篇文章,以及是否有更高/更低的出版年份。
下面的代码按“A”(对于年度)重新采样DataFrame,并计算每年的行数。如果你更熟悉电子表格的话,它基本上就是一个数据透视表。
每年文章数
文章年柱状图
从2010年(3514篇)到2011年(12k篇),以及2011年到2012年(46k篇),我们可以看到文章的急剧增长。
一个网站几乎不可能在连续两年内将其发布活动增加近四倍,两倍和两倍。他们可能进行了一些收购、内容合作,或者数据集存在问题。
月度趋势
当我们稍后检查作者时,我们将看到这种突然增长的可能答案。让我们进一步放大,看看每月的趋势。
每月样本文章数
每月文章数柱状图
这一数据证实了上述趋势,并显示出更为突然的变化。
2010年4月,他们发表了1249篇文章,前一个月发表了354篇。我们可以在2011年4月看到类似的事情发生。现在几乎可以肯定的是,这不是他们出版活动的有机自然增长。
每周趋势
我们也可以看看一周中每天的趋势。
按星期发表的文章
这没什么好奇怪的。他们在工作日发表的文章数量相当稳定,几乎是周末的两倍。例如,您可以在不同的时间段内运行它,以查看在几年或几个月之间是否有任何更改。
类别年度趋势
我们还可以按类别查看年度趋势,看看是否有什么突出的。下面的代码遍历所有类别,并创建每年文章数量的图表。
按类别分类的年度文章
在这里我可以看到两件事。首先是2019年“购物”文章从1732篇跃升至6845篇,2020年有望超过这一数字。看来这对他们来说很有效。检查一些这些文章,你可以看到,他们正在运行联盟计划和促进一些产品。
其次,这张图表可能具有很大的误导性。比如,Tasty最近才被BuzzFeed收购,你可以看到它占据了一小部分内容。但如果你查看他们的Facebook页面,你会发现他们有近1亿的粉丝。因此,请记住这一点,保持怀疑,并尽可能从其他来源验证信息。
URL结构
现在我们可以分析从url中获得的任何信息,这里是一个随机样本:
url的随机样本
一般模板似乎是在形式buzzfeed.com/{language}/{author}/{article-title},英语文章没有“/en/”在他们。
现在让我们为语言创建一个新列,这可以通过提取出现在两个斜杠之间的任意两个字母的模式来完成。如果没有可用的,它将被“en”填充。现在我们可以看到每种语言(或某些情况下的国家)的文章数量。
每种语言的文章数
按语言分类的文章柱状图
我们还可以看到每个月每种语言的文章数量,以便更好地查看。
每月文章数-按语言
作者数据提取
现在让我们对作者进行相同的过程。和前面一样,我们将“loc”列拆分为“/”,提取倒数第二个元素,并将其放入新的“author”列中。之后,我们可以按作者数文章。
新增“作者”栏
代码计数和格式的文章,每个作者的数量
每位作者的文章数(历史)
“那么一点点。%”显示截至当前行的作者文章数的累积百分比。
例如,前三位作者占文章总数的6.6%(当然,“视频”不是作者,所以我们将忽略它)。你还可以看到,一些顶级作者实际上是其他新闻机构,而不是人。
我手动检查了“赫芬顿邮报”的几篇文章,得到了一个404错误。下面的代码片段浏览了一个随机的URL示例,其中作者是“huffpost”,并打印了URL和响应。
url及其响应的随机样本
这是数据集的另一个问题。
顶级贡献者的文章已经不存在了。我没有全部检查,正确的方法是检查所有50万个url来量化这个问题。
大型新闻机构的大量文章的存在可能是BuzzFeed上内容量突然增加的问题的答案。
在你的站点地图上有404绝对是一个问题,但在我们的情况下,他们没有删除它们是很好的,因为我们有一个更好的网站历史视图,即使许多url已经不存在了。这也意味着可能还有其他不存在的url被删除了,而我们不知道。我说过怀疑吗?
对于这么大的一个网站,你可以预料到一些问题,特别是回到七八年前,很多事情都发生了变化,很多事情都不再相关了。因此,让我们对最近的一段时间,即2019年和2020年(第一季度)做同样的练习。
代码用于计算2019 - 2020第一季度每位作者的文章
2019 - 2020年第一季度文章数量排名第一的作者
现在所有的顶级作者似乎都是个人,而不是组织。
我们还可以看到,前20名在这一时期产生了21.5%的内容。我们可以看到每个作者发表了多少篇文章,以及这个数字占该时期总文章的百分比。
如果你想知道每个作者每月写多少篇文章:
代码产生每月文章每个作者
按作者分类的每月文章数
自上而下的方法
以上是一种探索性方法,我们对作者一无所知。现在我们知道了一点,我们可以使用自上而下的方法。
下面的函数接受任意数量的作者姓名,并绘制每个作者每月的文章数,以便您可以比较任意两个或更多作者。让我们从顶级新闻机构开始。
绘制和比较作者发表活动(每月文章数)的函数
每月为‘ fabdrabfeed ’, ‘huffpost’, ‘hollywoodreporter’和‘soft’的文章
从所有数据来看,2011年4月文章数量的激增似乎更有可能是由于内容合作关系。我们还可以看到,与《赫芬顿邮报》的合作关系于2013年11月结束,至少从sitemap上可以看出。
以下是前三名作者在过去五个季度的趋势。
‘ryanschocket2’, ‘daves4’, ‘noradominick’每月文章数
内容分析
现在我们进入URL的最后一部分—包含文章标题的段码。到目前为止,基本上都是通过按日期、类别、语言和作者对内容进行分类来创建元数据。
鼻涕虫也可以用同样的方法提取到它们自己的列中。我还用空格替换了破折号,以便更容易分割和分析。
新专栏增加了“鼻涕虫”
为了查看鼻涕虫,我创建了其中一个只包含英文文章的子集。
物品弹头的随机样本
word_frequency函数
最简单的方法就是数一数鼻涕虫里的单词。word_frequency函数为我们做到了这一点。
请注意,此功能在默认情况下会删除停止词,这是一个可供探索的集合。在许多情况下,您可能需要编辑这个列表,因为在某个上下文中可能是停词,但在另一个上下文中可能不是。
文章标题中最常用的词
如果一个单词没有传达太多的信息,我们可以将phrase_len值指定为2来计算两个单词的短语(tokens是它的另一个名称)。
最常用的两个单词短语
分析主题
就像我们比较作者一样,我们可以使用相同的方法,为单词创建一个类似的函数,这些单词将作为要分析的主题。
函数用于比较所选单词在不同时间的外观
这是三个最常出现的名人的名字,“quiz”似乎也很受欢迎,所以我把它们进行了比较。
每月文章“金·卡戴珊”,“麦莉·赛勒斯”,“贾斯汀·比伯”,&“测验”
这些数据表明,《赫芬顿邮报》和其他媒体发布的内容可能是名人过多。它也显示了测验有多受欢迎,以及他们对测验的巨大关注。
这就引出了一个问题:这些测试是关于什么的?要做到这一点,我们可以选取包含“quiz”这个单词的鼻涕虫的一个子集,然后只计算这些鼻涕虫中的单词。这样,我们就可以知道他们在测验中使用了什么主题。
与quiz一起出现频率最高的单词
现在,你可以开始分析了!
总结
现在我们对数据集的大小和结构有了一个很好的概述,并且发现了数据中的一些问题。为了更好地构建它,我们创建了一些列,以便更容易地按语言、类别、作者、日期以及文章标题进行聚合。
显然,你不能仅仅通过站点地图获得网站的完整视图,但它们提供了一种非常快速的方式来获得关于发布活动和内容的大量信息,如上所示。我们处理“lastmod”的方式非常标准(许多站点还提供发布时间而不仅仅是日期),但是每个站点的url都是不同的。
在做好准备并熟悉可能面临的一些陷阱之后,现在可以开始对内容进行适当的分析。您可能想要探索一些想法:主题建模、词共现、实体提取、文档聚类,并针对不同的时间范围和我们创建的任何其他可用参数执行这些操作。