分享

爬虫快速入门,给我半小时就能带你流畅的爬取数据!Python的魅力

 ly88 2018-07-08


  • 开放数据集下载;

  • API读取;

  • 爬虫。

前两种方法,我都已经做过一些介绍,这次说说爬虫。

进群:125240963   即可获取数十套PDF哦!


概念

许多读者对爬虫的定义,有些混淆。咱们有必要辨析一下。

维基百科是这么说的:


也就是说,用爬虫(或者机器人) 自动 替你完成网页抓取工作,才是你真正想要的。

数据抓下来干什么呢?

一般是先存储起来,放到数据库或者电子表格中,以备检索或者进一步分析使用。

所以,你真正想要的功能是这样的:


目标

要抓取网页数据,我们先制订一个小目标。

目标不能太复杂。但是完成它,应该对你理解抓取(Web Scraping)有帮助。


这篇文章里,我把之前的发布的数据科学系列文章做了重新组织和串讲。

文中包含很多之前教程的标题和对应链接。例如下图红色边框圈起来的部分。


假设你对文中提到教程都很感兴趣,希望获得这些文章的链接,并且存储到Excel里,就像下面这个样子:




请选择左侧的 Python 3.6 版本下载安装。

如果你需要具体的步骤指导,或者想知道Windows平台如何安装并运行Anaconda命令,请参考我为你准备的视频教程。


看到演示目录下两个Pipfile开头的文件了吗?它们就是 pipenv 的设置文档。

pipenv 工具会依照它们,自动为我们安装所需要的全部依赖软件包。


上图里面有个绿色的进度条,提示所需安装软件数量和实际进度。

装好后,根据提示我们执行:



你可以直接点击文件列表中的第一项ipynb文件,可以看到本教程的全部示例代码。

你可以一边看教程的讲解,一边依次执行这些代码。


但是,我 建议 的方法,是回到主界面下,新建一个新的空白 Python 3 笔记本。


请跟着教程,一个个字符输入相应的内容。这可以帮助你更为深刻地理解代码的含义,更高效地把技能内化。


准备工作结束,下面我们开始正式输入代码。





这么多链接啊!

很兴奋吧?

不过,你发现没有?这里许多链接,看似都不完全。例如第一条结果,只有:



这回看着是不是就舒服多了?

我们的任务已经完成了吧?链接不是都在这里吗?

链接确实都在这里了,可是跟我们的目标是不是有区别呢?

检查一下,确实有。

我们不光要找到链接,还得找到链接对应的描述文字呢,结果里包含吗?

没有。

结果列表中的链接,都是我们需要的吗?



电脑看到的网页,是这个样子的。


为了让你看得清楚源代码,浏览器还特意对不同类型的数据用了颜色区分,对行做了编号。

数据显示给电脑时,上述辅助可视功能是没有的。它只能看见一串串字符。


如同你要发送包裹给某个人,可以按照“省-市-区-街道-小区-门牌”这样的结构来写地址,快递员也可以根据这个地址找到收件人。

同样,我们对网页中某些特定内容感兴趣,可以依据这些标记的结构,顺藤摸瓜找出来。

这是不是意味着,你必须先学会HTML和CSS,才能进行网页内容抓取呢?

不是的,我们可以借助工具,帮你显著简化任务复杂度。

这个工具,Google Chrome浏览器自带。

我们在样例文章页面上,点击鼠标右键,在出现的菜单里面选择“检查”。


这时,屏幕下方就会出现一个分栏。


我们点击这个分栏左上角(上图红色标出)的按钮。然后把鼠标悬停在第一个文内链接(《玉树芝兰》)上面,点击一下。


此时,你会发现下方分栏里面,内容也发生了变化。这个链接对应的源代码被放在分栏区域正中,高亮显示。


确认该区域就是我们要找的链接和文字描述后,我们鼠标右键选择高亮区域,并且在弹出的菜单中,选择 Copy -> Copy selector。






下方出现的高亮内容就发生了变化:


我们还是用鼠标右键点击高亮部分,拷贝出 selector。


然后我们直接把获得的标记路径写到 Jupyter Notebook 里面。

sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a'

用我们刚才编制的函数,看看输出结果是什么?

print(get_text_link_from_sel(sel))

输出如下:

[('如何用Python做词云?', 'https:///post/5b34a409f265da599f68dc3b')]

检验完毕,函数没有问题。



好了,我们要找的内容,全都在这儿了。

但是,我们的工作还没完。

我们还得把采集到的信息输出到Excel中保存起来。

还记得我们常用的数据框工具 Pandas 吗?又该让它大显神通了。

import pandas as pd

只需要这一行命令,我们就能把刚才的列表变成数据框:

df = pd.DataFrame(get_text_link_from_sel(sel))

让我们看看数据框内容:

df


内容没问题,不过我们对表头不大满意,得更换为更有意义的列名称:

df.columns = ['text', 'link']

再看看数据框内容:

df



小结

本文为你展示了用Python自动网页抓取的基础技能。希望阅读并动手实践后,你能掌握以下知识点:

  • 网页抓取与网络爬虫之间的联系与区别;

  • 如何用 pipenv 快速构建指定的 Python 开发环境,自动安装好依赖软件包;

  • 如何用 Google Chrome 的内置检查功能,快速定位感兴趣内容的标记路径;

  • 如何用 requests-html 包来解析网页,查询获得需要的内容元素;

  • 如何用 Pandas 数据框工具整理数据,并且输出到 Excel。

或许,你觉得这篇文章过于浅白,不能满足你的要求。

文中只展示了如何从一个网页抓取信息,可你要处理的网页成千上万啊。

别着急。

本质上说,抓取一个网页,和抓取10000个网页,在流程上是一样的。

而且,从咱们的例子里,你是不是已经尝试了抓取链接?

有了链接作为基础,你就可以滚雪球,让Python爬虫“爬”到解析出来的链接上,做进一步的处理。

将来,你可能还要应对实践场景中的一些棘手问题:

  • 如何把抓取的功能扩展到某一范内内的所有网页?

  • 如何爬取Javascript动态网页?

  • 假设你爬取的网站对每个IP的访问频率做出限定,怎么办?

  • ……

这些问题的解决办法,我希望在今后的教程里面,一一和你分享。

需要注意的是,网络爬虫抓取数据,虽然功能强大,但学习与实践起来有一定门槛。

当你面临数据获取任务时,应该先检查一下这个清单:

  • 有没有别人已经整理好的数据集合可以直接下载?

  • 网站有没有对你需要的数据提供API访问与获取方式?

  • 有没有人针对你的需求,编好了定制爬虫,供你直接调用?

如果答案是都没有,才需要你自己编写脚本,调动爬虫来抓取。

为了巩固学习的知识,请你换一个其他网页,以咱们的代码作为基础修改后,抓取其中你感兴趣的内容。

如果能把你抓取的过程记录下来,在评论区将记录链接分享给大家,就更好了。

因为 刻意练习 是掌握实践技能的最好方式,而 教是最好的学 。

祝顺利!

思考

本文主要内容讲解完毕。

这里给你提一个疑问,供你思考:

我们解析并且存储的链接,其实是有重复的:


这并不是我们的代码有误,而是在《 如何用《玉树芝兰》入门数据科学? 》一文里,本来就多次引用过一些文章,所以重复的链接就都被抓取出来了。

但是你存储的时候,也许不希望保留重复链接。

这种情况下,你该如何修改代码,才能保证抓取和保存的链接没有重复呢?

讨论

你对Python爬虫感兴趣吗?在哪些数据采集任务上使用过它?有没有其他更高效的方式,来达成数据采集目的?欢迎留言,把你的经验和思考分享给大家,我们一起交流讨论。

进群:125240963  即可获取数十套PDF哦!


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多