如何使用Python抓取数据? (1)网页爬网
优采云 发布时间: 2020-08-07 13:22如何使用Python抓取数据? (1)网页爬网
期待已久的Python Web数据采集器教程在这里. 本文向您展示了如何从网页中找到有趣的链接和说明文字,抓取它们并将其存储在Excel中.
要求
我处于官方帐户的后台,经常收到读者的评论.
许多评论是读者的问题. 只要有时间,我就会花时间尝试回答.
但是,有些评论乍一看不清楚.
例如,这个:
一分钟后,他可能会感到不对(可能是因为我记得我用简体中文写了这篇文章),所以他再次用简体中文发了信.
忽然忽隐忽现.
该读者认为我的官方帐户具有关键字推送功能. 因此,在阅读了其他数据科学教程之后,我想看一下主题“ Crawlers”.
对不起,我还没有写一篇关于爬虫的文章.
此外,我的官方帐户暂时还没有设置这种关键字推送.
主要是因为我很懒.
我们收到了很多这样的消息,我很感激读者的需求. 不止一位读者表示对爬虫教程感兴趣.
如前所述,当前的主流和合法网络数据采集方法主要分为三类:
我已经介绍了前两种方法中的一些,这次我将讨论爬虫.
概念
许多读者对采集器的定义有些困惑. 我们需要对其进行分析.
这是维基百科所说的:
Web爬网程序(英语: Web crawler),也称为网络蜘蛛(蜘蛛),是一种用于自动浏览万维网的网络机器人. 其目的通常是编译Web索引.
这是问题. 您不打算成为搜索引擎. 您为什么对网络爬虫如此热衷?
实际上,很多人提到的网络爬虫与另一个功能“网络抓取”相混淆.
在Wikipedia上,对于后一种解释:
网站抓取,网站采集或网站数据提取是用于从网站提取数据的数据抓取. Web抓取软件可以使用超文本传输协议或通过Web浏览器直接访问万维网.
我看不到它,即使您使用浏览器手动复制数据,也称为网络抓取. 您是否立即感到自己更坚强?
但是,此定义尚未结束:
虽然网络抓取可由软件用户手动完成,但该术语通常是指使用bot或网络采集器实现的自动化流程.
换句话说,您真正想要的是使用采集器(或机器人)为您自动完成网络搜寻.
数据是什么?
通常,它首先存储,然后放置在数据库或电子表格中以进行检索或进一步分析.
所以,您真正想要的功能是:
找到链接,获取网页,获取指定的信息并存储.
此过程可能会往复甚至滚雪球.
您想自动完成它.
了解这一点,不要一直盯着爬行器. 采集器的开发目的是为搜索引擎建立数据库索引. 您已经在轰炸蚊子,以获取一些数据并使用它.
要真正掌握爬虫,您需要具备很多基本知识. 例如HTML,CSS,Javascript,数据结构...
这就是为什么我犹豫不写爬虫教程.
但是在过去的两天里,我看到了主编王朔的一段话,这很有启发性:
我喜欢谈论另一种28法则,那就是付出20%的努力来理解一件事情的80%.
因为我们的目标很明确,所以它是从Web上获取数据. 然后,您需要掌握的最重要的功能是如何快速有效地从网页链接中获取所需的信息.
如果您掌握了它,就不能说您已经学会了爬网.
但是有了这个基础,您可以比以前更轻松地获取数据. 特别是对于“文科生”的许多应用场景,它非常有用. 这就是授权.
此外,进一步了解履带的工作原理变得更加容易.
这也是“第28条替代法”的适用.
Python语言的重要功能之一是它可以使用功能强大的软件工具箱(其中许多由第三方提供). 您只需要编写一个简单的程序即可自动解析网页并获取数据.
本文向您展示了此过程.
目标
要抓取网络数据,我们首先要设定一个小目标.
目标不能太复杂. 但是要完成它,它对您了解Web Scraping应该很有帮助.
只需选择我最近发表的一本简短的书作为爬行对象. 标题为“如何使用“玉树之兰”入门数据科学?”.
在本文中,我重新组织和讨论了以前发表的一系列数据科学文章.
本文收录许多以前的教程的标题和相应的链接. 例如,下图中用红色边框包围的部分.
假设您对本文提到的教程非常感兴趣,并希望获得这些文章的链接并将其存储在Excel中,如下所示:
您需要提取并存储非结构化的分散信息(自然语言文本中的链接).
我该怎么办?
即使您不知道如何编程,也可以通读全文,逐一找到这些文章的链接,手动复制文章标题和链接,然后将它们保存在Excel表中.
但是,这种手动采集方法效率不高.
我们使用Python.
环境
要安装Python,更简单的方法是安装Anaconda软件包.
请转到此网站下载最新版本的Anaconda.
请选择左侧的Python 3.6版本以下载并安装.
如果您需要具体的分步说明,或者想知道如何在Windows平台上安装和运行Anaconda命令,请参阅我为您准备的视频教程.
安装Anaconda后,请访问此网站以下载本教程的压缩包.
下载并解压缩后,您将在生成的目录(以下称为“演示目录”)中看到以下三个文件.
打开终端,并使用cd命令进入演示目录. 如果您不知道如何使用它,也可以参考视频教程.
我们需要安装一些依赖于环境的软件包.
首先执行:
pip install pipenv
此处的安装是出色的Python包管理工具pipenv.
安装后,请执行:
pipenv install
您是否在演示目录中看到以Pipfile开头的两个文件?它们是pipenv的配置文件.
pipenv工具将根据它们自动安装我们需要的所有依赖包.
在上图中,绿色进度条指示要安装的软件数量和实际进度.
安装后,按照提示执行:
pipenv shell
在这里,请确保您的计算机上已安装Google Chrome.
我们执行:
jupyter notebook
默认浏览器(Google Chrome)将打开并启动Jupyter笔记本界面:
您可以直接单击文件列表中的第一个ipynb文件,以查看本教程中的所有示例代码.
您可以在观看本教程的说明时一一执行这些代码.
但是,我建议的方法是返回主界面并创建一个新的空白Python 3笔记本.
请按照教程进行操作,并逐一输入相应的内容. 这可以帮助您更深入地了解代码的含义,并更有效地内化技能.
准备工作已经结束,让我们开始正式输入代码.
代码
阅读网页以进行分析和爬网,需要使用的软件包是requests_html. 我们不需要这里的所有程序包功能,只需阅读其中的HTMLSession.
from requests_html import HTMLSession
然后,我们建立一个会话,即让Python充当客户端与远程服务器进行对话.
session = HTMLSession()
如前所述,我们计划采集信息的网页是“如何使用“ Yushu Zhilan”入门数据科学?” “一篇文章.
我们找到它的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,并且每个Grid的文本和链接均占据一个单元格. ”
尽管此操作执行起来很麻烦,但助手可以在理解后帮助您执行它.
相同的描述,您可以尝试告诉计算机...对不起,它听不懂.
因为您和您的助手看到的网页是这样的.
计算机看到的网页如下所示.
为了让您清楚地看到源代码,浏览器还故意使用颜色来区分不同类型的数据,并对行进行编号.
当数据显示到计算机时,上述辅助视觉功能不可用. 它只能看到字符串.
我该怎么办?
仔细观察,您会发现在这些HTML源代码中,文本和图片链接内容的前后都有一些用尖括号括起来的部分,称为“标签”.
所谓的HTML是一种标记语言(超文本标记语言).
标签的目的是什么?可以将整个文件分解为多个层.