对于程序员来讲,英文的重要性已不需要多言...
大多数优秀一手的编程资源,都是英文编写。
这篇教程爬取了「湾区日报」的英文文章,教程涉及到的代码都在链接:
https://github.com/junbin123/wanqu
在开始动工之前,先简单介绍一下什么是「湾区日报」?
「湾区日报」是一位在硅谷工作的工程师运营的一个博客网站。
他每天大量阅读,从中筛选出 5 篇优秀的文章,发表到网站上。
文章虽然是英文的,但好在作者是双语阅读者,每篇文章都有对应的中文简评以及阅读时长。
对于有心想学好英语的工程师,可以说是一举两得的学习资料了。
今天的任务就是扒下小于 5 分钟的文章,训练自己的英文阅读能力。
我们一共采取了下面几个步骤,来爬取网页内容:
连接获取网页内容
使用 BeautifulSoup 获取 html 内容
在 soup 对象里的循环搜索 HTML 元素
进行简单的数据清理
把数据写入 csv 文件中
准备开始
每次想用 Python 搞点事情,你的第一个问题应该是「我需要用到什么库」?
网页爬取方面,Python 从来不会让我们失望的,有好些库可以使用:
Beautiful Soup
Requests
Scrapy
......
这里我们就用强大的解析工具Beautiful Soup,它借助的是网页的结构和属性等特性。
开始前分析
首先打开湾区日报(https://wanqu.co/issues/1280/),明确我们要抓取文章的内容:标题、链接、阅读时长、简评
然后,打开「开发者工具」,分析代码结构:
从图中可以看到,每一期 5 篇文章被包含在标签中,每一篇文章都是一个标签。
也就是说,我们不需要太复杂的代码,只需要一个循环,就能读取到每一期 5 篇文章。
然后更改链接,重复上面的步骤,爬取每一期的文章。
另外,通过更换不同链接,我们看到,链接的后缀,就是期数,这简直不要太贴心了!
开始写代码
使用 BeautifulSoup 处理 html 内容
熟悉了网页结构,我们终于要拿起代码开工了。
首先导入各种模块。
除了上面提到BeautifulSoup可以帮助我们处理 HTML 结构。
还需导入requests模块,它负责连接到地址,并获取网页内容;以及csv库,把数据写入 csv 文件中。
下一步,使用requests得到网页的Response对象,然后用BeautifulSoup来解析Response的内容,把处理结果存在soup变量中。
尝试输出soup看看!
查找 HTML 元素
既然文章被包含在标签里,我们可以在soup对象里搜索到它,再用find_all方法,遍历前 5 个标签。
同样,尝试输出看看!
简单数据清洗
接着,我们可以先声明一个空列表,把表头数据作为第一个元素。
之后的添加数据,只需调用方法。
下一步,我们遍历 5 篇文章,提取关键信息,并保存在列表中。
其中,期数直接赋值;阅读时长需要用到正则表达式,所以需要在最开始导入模块:
上面代码,我们遍历了每篇文章,并获取标题、链接、阅读时长、简评
分析代码发现,标题被包含在节点,且节点在只出现一次,于是利用属性,获取节点元素包含的文本内容。
继续获取链接,它存在标签的属性中,但每个标签中不只有一个,所以我们还需要更多信息。非常幸运,我们看到这个,多了一个属性:,绝佳的定位信息!!
阅读时长的稍微麻烦,需要先得到字符串time_read_temp:,再使用正则表达式匹配出。
ps.需要注意的是,我在爬取文章的是时候,发现有一篇文章没有阅读时长,这会导致正则表达式匹配失败:
不过,不用当心,只需增加语句,捕获这个异常,跳过这个赋值。这部分代码可以到我的 GitHub 项目里下载:https://github.com/junbin123/wanqu
完成上面循环体,我们再打印一下articles的内容,这样可以在数据写入前,检查一下。
如果你也得到图片一样干净的数据,可以开始下一步了。
写入 CSV 文件
最后,我们把上面获取的数据,写入保存到 csv 文件中。
现在,你可以运行一下这个代码,不出意外,你会发现一个 csv 文件出现在目录中,打开后,应该下图:
基本流程跑通了,现在我们来解决另外 2 个问题?
如何筛选出阅读时长 1-5 分钟的文章?
如何爬取更多文章?
第一个问题比较简单,只需原来代码加上筛选语句就行了。
第二个问题解决思路是循环上面的步骤。
我把重构后的代码放在 GitHub 里,欢迎下载:https://github.com/junbin123/wanqu
最后
如果有什么没说清楚的,欢迎大家在下面留言,我会尽可能给大家解答的!
祝你的爬虫之旅有一个美好的开始!
领取专属 10元无门槛券
私享最新 技术干货