Python爬虫教程:简书文章的抓取与存储

“Hello 我 是 大 白,带 你 进 入 Python 世界”

welcome to the Python world

本文内容将与大家一起从简书的文章页面抓取文章标题、作者、发布时间以及正文内容,并且将抓取到的这些信息存入Excel表格中。本文对简书文章的抓取仅为Python的学习交流,尊重作者著作权,不对抓取到的文章做其他用途。本文使用Chrome浏览器对页面中需要抓取的内容进行分析。

首先我们从简书首页点开一篇文章。现在我们来从页面中提取文章标题信息。按下F12进入开发者模式,即下图中下方区域。

点击图中第1处红框的按钮,此时可以通过鼠标点击页面中的元素来定位到对应的HTML代码。再按下图中第2处红框即文中的标题,此时下方区域将定位到我们选中的标题的HTML代码,即图中第3处红框的HTML代码:

这是一个H1标签,可以从中看到我们需要的文章标题内容,我们可以通过定位class属性值为title的H1标签来找到这个标签并从中提取出文章标题。

用同样的方法来找到作者和发布时间这两个元素的HTML代码:

需要特别说明的,文中作者信息所在的是一个A标签,即第三行代码所示,此处的A标签并没有诸如class、name、id之类可以用来定位到这个标签的特殊属性,因此我们需要往上寻找,直到找到存在可以用来定位的特殊属性的父标签。例如这个作者信息所在的A标签的父标签是一个SPAN标签,存在一个值为name的class属性,因此我们可以通过定位到这个SPAN标签来提取作者信息。

发布时间所在的是一个class属性值为publish-time的SPAN标签,我们可以通过定位到这个SPAN标签来提取发布时间信息。

对于文章正文HTML代码的提取就有一些技巧了,按照上面的方法,如果直接用鼠标点击正文中的某一段内容时,定位到的只是这一段内容的P标签,而我们需要提取的是所有正文内容。这时我们可以点击段落之间的空白处,这样就可以定位到这个段落所在的DIV标签,而这个DIV标签包含我们需要的所有正文内容,如下图所示:

这样定位到的DIV标签的内容如下:

可以看到这个DIV标签包含我们所需的所有正文内容,并且正文内容都是一段接着一段的写在许多P标签中的。我们可以通过遍历这个DIV中的P标签,依次提取每一段的内容,这样就能获取文章正文的所有内容了。

经过上述分析,我们清楚的知道了标题、作者、发布时间以及正文内容这些信息应该如何从HTML代码中提取,现在我们就可以来编写一个用来从简书的文章页中提取这些信息的Python函数:

前9行代码即导入以及简书主页URL和headers的定义,关于headers的说明可以阅读之前的文章:

手把手教你用Python抓取简书文章链接

get_info(url)就是我们用来从简书的文章页提取文章标题、作者、发布时间以及正文内容的函数,其中需要文章页的URL作为参数。

第14、15行通过requests.get方法获取指定URL的HTML代码,并生成BeautifulSoup对象以便于对HTML代码进行解析。

第16、17、18行代码则根据前文分析得到的规则,分别提取了文章标题、作者以及发布时间的信息,注意别漏了最后的text,通过text属性来从find函数定位到的标签中提取到我们所需的信息。

之后就是对文章正文内容的提取。首先定位到正文每一段的P标签所在的DIV标签,再遍历这个DIV标签中所有的P标签,将P标签中的内容依次放入p_list数组,最后再通过join函数,使用换行符将所有段落拼接到一起。

最后再返回由提取到的文章标题、作者、发布时间、正文内容以及传进来的文章URL所组成的字典。在Python的函数中,使用字典来传递多个值是一个不错的选择,相当于封装了一个专门用来存储信息的对象。

结合上篇文章“手把手教你用Python抓取简书文章链接”中批量获取文章URL的函数,我们可以批量得到数十篇简书文章的内容,获取简书文章URL的函数如下:

将批量获取文章URL的函数与从文章中提取内容的函数结合到一起,就可以实现批量获取多篇文章的内容:

最后是对批量获取的文章内容进行存储处理,通常情况下,爬虫抓取到的数据都会存入数据库以方便后期的分析的等处理。本文简单起见,将把数据写入Excel文件进行存储:

用Python进行Excel文件的写入操作需要用到xlwt模块,我们先引入这个模块。

第6行首先创建一个Excel工作区,设定编码格式为UTF-8。

第7行则是在工作区中创建了一张表,即下图中红框框起来的Sheet1这种表的概念。

接着我们就可以往表中写入内容了,写入内容使用write方法,带有三个参数,分别是行数、列数以及内容。

我们首先要向表中写入每一列的标题。方便起见,我先创建了titles的列表,列表中的元素就是每一列的标题,再通过遍历这个列表,就可以实现通过一个for循环写入所有列的标题,而不用一行接着一行的手动调用write方法。

这里用到的enumerate方法是Python的内置方法,这个方法可以遍历列表并同时返回数据和数据下标,其中的数据下标就可以作为表格的列数。

第12到14行通过一个双重循环实现将获取到的批量数据写入表格中,其内部逻辑与写入列标题的代码相同。其中循环的i作为行数,j作为列数,要注意第1行为列标题,因此需要将i + 1处理。

最后再将工作区保存为info.xls文件即可。

完整的代码如下图所示:

执行完整的代码,稍等片刻后将在py文件同目录下将生成一个info.xls文件,打开生成的这个Excel表格可以看到如下内容:

至此我们通过60行的Python代码完成了从简书首页批量获取文章链接,再从文章中获取文章标题、作者、创建时间以及正文内容信息,最后存入Excel表格的全部过程。

喜欢的话转发给你身边的小伙伴

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181107B0FATP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励