我欲疾风前行 2018-11-09
本文内容将与大家一起从简书的文章页面抓取文章标题、作者、发布时间以及正文内容,并且将抓取到的这些信息存入Excel表格中。本文对简书文章的抓取仅为Python的学习交流,尊重作者著作权,不对抓取到的文章做其他用途。本文使用Chrome浏览器对页面中需要抓取的内容进行分析。
关注小编后私信PDF 领取《Python爬虫相关书籍》....
首先我们从简书首页点开一篇文章。现在我们来从页面中提取文章标题信息。按下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的函数如下:
关于这个函数的详细解析请阅读:手把手教你用Python抓取简书文章链接。
将批量获取文章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表格的全部过程。