从网页抓取数据(你期待已久的Python网络数据爬虫教程来了。(二) )
优采云 发布时间: 2021-11-25 16:15从网页抓取数据(你期待已久的Python网络数据爬虫教程来了。(二)
)
您期待已久的 Python 网络数据爬虫教程就在这里。本文将向您展示如何从网页中查找有趣的链接和解释性文本,将它们抓取并存储在 Excel 中。
(由于微信公众号外部链接的限制,文章中的部分链接可能无法正确打开,如有需要,请点击文章末尾的“阅读原文”按钮访问该版本可以正常显示外链。)
需要
我在公众号后台,经常能收到读者的评论。
许多评论都是来自读者的问题。只要我有时间,我会花时间尝试和回答。
但是,有些评论乍一看并不清楚。
例如,以下内容:
一分钟后,他可能觉得不对劲(可能是我想起来了,我用简体中文写了文章),于是又用简体中文发了一遍。
我突然恍然大悟。
这位读者以为我的公众号设置了关键词推送对应的文章功能。所以在阅读了我的其他数据科学教程后,我想看一下“爬虫”这个话题。
抱歉,我当时没有写爬虫。文章。
而且我的公众号暂时没有这种关键词推送。
主要是因为我懒。
这样的消息收到了很多,也能体会到读者的需求。不止一位读者表示对爬虫教程感兴趣。
如前所述,目前主流和合法的网络数据采集方式主要分为三类:
前两种方法我已经做了一些介绍,这次就说说爬虫。
概念
很多读者对爬虫的定义有些困惑。我们需要对其进行分析。
维基百科是这样说的:
网络爬虫(英文:web crawler),又称网络蜘蛛(spider),是一种用于自动浏览万维网的网络机器人。它的目的一般是编译一个网络索引。
这是问题。您不打算成为搜索引擎。为什么您对网络爬虫如此热衷?
事实上,很多人所指的网络爬虫与另一个功能“网页抓取”混淆了。
在维基百科上,后者解释如下:
网页抓取、网页采集或网页数据提取是用于从网站提取数据的数据抓取。网页抓取软件可以直接使用超文本传输协议或通过网页浏览器访问万维网。
如果看到了,即使是用浏览器手动复制数据,也叫网页抓取。你是不是立刻觉得自己强大了很多?
然而,这个定义还没有结束:
虽然网络抓取可以由软件用户手动完成,但该术语通常是指使用机器人或网络爬虫实现的自动化流程。
换句话说,使用爬虫(或机器人)自动为您完成网页抓取,才是您真正想要的。
数据有什么用?
通常,首先将其存储并放置在数据库或电子表格中以供检索或进一步分析。
所以,你真正想要的功能是这样的:
找到链接,获取网页,抓取指定信息,并存储。
这个过程可能会反过来,甚至滚雪球。
您想以自动化的方式完成它。
知道了这一点,您应该停止盯着爬虫。爬虫的开发目的是为搜索引擎索引数据库。您已经在轰炸蚊子以获取一些数据并使用它。
要真正掌握爬虫,需要有很多基础知识。比如HTML、CSS、Javascript、数据结构……
这也是我一直犹豫要不要写爬虫教程的原因。
不过这两天看到王朔编辑的一段话,很有启发:
我喜欢讲一个替代的八分之二定律,就是花20%的努力去理解一件事的80%。
既然我们的目标很明确,那就是从网络上抓取数据。那么你需要掌握的最重要的能力就是如何快速有效地从一个网页链接中抓取你想要的信息。
一旦你掌握了它,你不能说你已经学会了爬行。
但是有了这个基础,您可以比以前更轻松地获取数据。尤其是对于很多“文科生”的应用场景,非常有用。这就是赋权。
而且,更容易进一步了解爬虫的工作原理。
这可以看作是对“第二十八条替代法”的应用。
Python 语言的重要特性之一是它可以使用强大的软件工具包(其中许多由第三方提供)。您只需要编写一个简单的程序即可自动解析网页并抓取数据。
本文向您展示了这个过程。
目标
为了抓取网络数据,我们首先设定一个小目标。
目标不能太复杂。但要完成它,它应该可以帮助您了解 Web Scraping。
随便选一本我最近出版的小书文章作为爬取的目标。题目是《如何用《玉树智兰》入门数据科学?》。
在这个文章中,我重新整理了一下之前发布的数据科学系列文章。
这篇文章收录许多来自以前教程的标题和相应的链接。例如下图中红色边框包围的部分。
假设你对文章中提到的教程很感兴趣,希望得到这些文章的链接并存入Excel,如下图:
您需要提取和存储非结构化的分散信息(自然语言文本中的链接)。
我们对于它可以做些什么呢?
即使不会编程,也可以通读全文,一一找到这些文章链接,手动复制文章标题和链接分别保存在Excel表格中.
但是,这种手动采集 方法效率不高。
我们使用 Python。
环境
要安装 Python,更简单的方法是安装 Anaconda 包。
请到此网站下载最新版本的 Anaconda。
请选择左侧的Python3.6版本下载安装。
如果您需要具体的分步说明,或者想知道如何在Windows平台上安装和运行Anaconda命令,请参考我为您准备的视频教程。
安装Anaconda后,请到本网站下载本教程的压缩包。
下载解压后,会在生成的目录(以下简称“demo目录”)中看到如下三个文件。
打开终端,使用cd命令进入demo目录。如果不知道怎么使用,也可以参考视频教程。
我们需要安装一些环境依赖包。
首先执行:
pip install pipenv
这里安装的是一个优秀的Python包管理工具pipenv。
安装完成后,请执行:
pipenv install
有没有看到demo目录下Pipfile开头的两个文件?它们是pipenv的配置文件。
pipenv 工具会根据它们自动安装我们需要的所有依赖包。
上图中有一个绿色的进度条,表示要安装的软件数量和实际进度。
安装完成后,按照提示执行:
pipenv shell
在这里,请确保您的计算机上已安装 Google Chrome 浏览器。
我们执行:
jupyter notebook
默认浏览器(谷歌浏览器)会打开并启动 Jupyter notebook 界面:
可以直接点击文件列表中的第一个ipynb文件,查看本教程的所有示例代码。
可以一边看教程,一边一一执行这些代码。
但是,我建议的方法是返回主界面并创建一个新的空白 Python 3 notebook。
请按照教程一一输入相应的内容。这可以帮助您更深入地理解代码的含义并更有效地内化您的技能。
准备工作结束,下面开始正式输入代码。
代码
读取网页进行分析抓取,需要用到的软件包是requests_html。我们这里不需要这个包的所有功能,只要读取里面的HTMLSession即可。
from requests_html import HTMLSession
然后,我们建立一个会话,即让 Python 作为客户端与远程服务器进行对话。
session = HTMLSession()
前面提到过,我们计划采集信息的网页是“如何使用“玉树智兰”开始数据科学?“一篇文章。
我们找到它的 URL 并将其存储在 url 变量名称中。
url = 'https://www.jianshu.com/p/85f4624485b9'
下面的语句使用session的get函数来获取这个链接对应的整个网页。
r = session.get(url)
网页里有什么?
我们告诉 Python 将服务器返回的内容视为 HTML 文件类型。不想看HTML中乱七八糟的格式描述符,直接看正文部分。
所以我们执行:
print(r.html.text)
这是得到的结果:
我们心里清楚。检索到的网页信息正确,内容完整。
好吧,让我们来看看如何接近我们的目标。
我们首先使用简单粗暴的方法尝试获取网页中收录的所有链接。
将返回的内容作为HTML文件类型,我们检查links属性:
r.html.links
这是返回的结果:
这么多链接!
兴奋的?
但是你找到了吗?这里的许多链接似乎不完整。比如第一个结果,只有:
'/'
这是什么?是链接抓取错误吗?
不,这种看起来不像链接的东西叫做相对链接。它是一个链接,相对于我们网页采集所在域名()的路径。
就像我们在国内邮寄快递包裹,一般填表的时候写“XX省,XX市……”,前面不需要加国名。只有国际快递,才需要写国名。
但是如果我们想要获取所有可以直接访问的链接呢?
这很简单,只需要一个 Python 语句。
r.html.absolute_links
在这里,我们想要的是一个“绝对”链接,所以我们会得到以下结果:
这次感觉好些了吗?
我们的任务已经完成了吧?链接不都在这里吗?
链接确实在这里,但它们与我们的目标不同吗?
检查它,确实如此。
我们不仅要找到链接,还要找到链接对应的描述文字。是否收录在结果中?
不。
结果列表中的链接是我们所需要的吗?
不。看长度,我们可以感觉到很多链接不是文中描述的其他数据科学文章的URL。
这种直接列出 HTML 文件中所有链接的简单粗暴的方法不适用于此任务。
那么我们应该怎么做呢?
我们必须学会清楚地告诉 Python 我们在寻找什么。这是网络爬行的关键。
想一想,如果你想要一个助手(人类)为你做这件事怎么办?
你会告诉他:
》找到文本中所有可以点击的蓝色文本链接,将文本复制到Excel表格中,然后右键复制对应的链接,复制到Excel表格中。每个链接在Excel中占一行,然后文本和链接各占一个单元格。”
虽然这个操作执行起来比较麻烦,但是小助手在理解之后可以帮你执行。
同样的描述,你试着告诉电脑……对不起,它不明白。
因为你和你的助手看到的网页是这样的。
电脑看到的网页是这样的。
为了让大家看清楚源码,浏览器还特意用颜色来区分不同类型的数据,并对行进行编号。
当数据显示到电脑上时,上述辅助视觉功能不可用。它只能看到字符串。
我能做什么?
仔细观察,你会发现在这些HTML源代码中,在文字和图片链接内容前后都有一些用尖括号括起来的部分,称为“标记”。
所谓HTML就是一种标记语言(HyperText Markup Language)。
商标的作用是什么?它可以将整个文件分解为多个层。