Python构建网页爬虫原理分析


Posted in Python onDecember 19, 2017

既然本篇文章说到的是Python构建网页爬虫原理分析,那么小编先给大家看一下Python中关于爬虫的精选文章:

网络爬虫是当今最常用的系统之一。最流行的例子是 Google 使用爬虫从所有网站收集信息。除了搜索引擎之外,新闻网站还需要爬虫来聚合数据源。看来,只要你想聚合大量的信息,你可以考虑使用爬虫。

建立一个网络爬虫有很多因素,特别是当你想扩展系统时。这就是为什么这已经成为最流行的系统设计面试问题之一。在这篇文章中,我们将讨论从基本爬虫到大型爬虫的主题,并讨论在面试中可能会遇到的各种问题。

1 - 基本解决方案

如何建立一个基本的网络爬虫?

在系统设计面试之前,我们已经在《系统设计面试之前需要知道的八件事》中谈到,就是从简单的东西开始。让我们专注于构建在单线程上运行的基本网页爬虫。有了这个简单的解决方案,我们可以继续优化。

要抓取单个网页,我们只需要向相应的 URL 发出 HTTP GET 请求,并解析响应数据,这是抓取工具的核心。考虑到这一点,一个基本的网络爬虫可以这样工作:

以包含我们要抓取的所有网站的网址池开始。

对于每个 URL,发出 HTTP GET 请求来获取网页内容。

解析内容(通常为 HTML)并提取我们想要抓取的潜在网址。

添加新的网址到池中,并不断抓取。

这取决于具体问题,有时我们可能会有一个独立的系统来生成抓取网址。例如,一个程序可以不断监听 RSS 订阅,并且对于每个新文章,都可以将该 URL 添加到爬取池中。

2 - 规模问题

众所周知,任何系统在扩展后都会面临一系列问题。在网络爬虫中,将系统扩展到多台机器时,有很多东西可能出错。

在跳转到下一节之前,请花几分钟的时间思考一下分布式网络爬虫的瓶颈,以及如何解决这个问题。在这篇文章的其余部分,我们将讨论解决方案的几个主要问题。

3 - 抓取频率

你多久爬一次网站?

这听起来可能不是什么大事,除非系统达到一定的规模,而且你需要非常新鲜的内容。例如,如果你想要获取上一小时的最新消息,则抓取工具可能需要每隔一小时不断抓取新闻网站。但是这有什么问题呢?

对于一些小型网站,他们的服务器很可能无法处理这种频繁的请求。一种方法是遵循每个站点的robot.txt。对于不知道robot.txt是什么的人,这基本是网站与网络爬虫交流的标准。它可以指定不应该抓取什么文件,大多数网络爬虫都遵循配置。另外,你可以为不同的网站设置不同的抓取频率。通常,每天只有几个网站需要被多次抓取。

4 - 去重

在一台机器上,你可以将 URL 池保留在内存中,并删除重复的条目。但是,分布式系统中的事情变得更加复杂。基本上,多个爬虫可以从不同的网页中提取相同的 URL,他们都希望将这个 URL 添加到 URL 池中。当然,多次抓取同一页面是没有意义的。那么我们如何去重复这些网址?

一种常用的方法是使用 Bloom Filter。简而言之,布隆过滤器是一个节省空间的系统,它允许你测试一个元素是否在一个集合中。但是,它可能有误报。换句话说,如果布隆过滤器可以告诉你一个 URL 绝对不在池中,或者可能在池中。

为了简要地解释布隆过滤器是如何工作的,空布隆过滤器是m位(全0)的位数组。还有k个散列函数,将每个元素映射到m位中的一个。所以当我们在布隆过滤器中添加一个新的元素(URL)时,我们将从哈希函数中得到k位,并将它们全部设置为1.因此,当我们检查一个元素的存在时,我们首先得到k位,如果它们中的任何一个不是1,我们立即知道该元素不存在。但是,如果所有的k位都是1,这可能来自其他几个元素的组合。

布隆过滤器是一个非常常用的技术,它是一个完美的解决方案,用于在网络爬虫中去重网址。

5 - 解析

从网站获取响应数据后,下一步是解析数据(通常是 HTML)来提取我们所关心的信息。这听起来像一个简单的事情,但是,可能很难使其健壮。

我们面临的挑战是,你总是会在 HTML 代码中发现奇怪的标记,URL 等,很难涵盖所有的边界情况。例如,当 HTML 包含非 Unicode 字符时,你可能需要处理编解码问题。另外,当网页包含图片,视频甚至PDF 时,也会造成奇怪的行为。

另外,一些网页都像使用 AngularJS 一样通过 Javascript 呈现,你的抓取工具可能无法得到任何内容。

我会说没有银弹,不能为所有的网页做一个完美的,健壮的爬虫。你需要大量的健壮性测试,以确保它能够按预期工作。

总结

还有很多我还没有涉及到的有趣的话题,但是我想提一下其中的一些,这样你就可以思考了。有一件事是检测循环。许多网站包含链接,如A->B->C->A,你的爬虫可能会永远运行。想想如何解决这个问题?

另一个问题是 DNS 查找。当系统扩展到一定的水平时,DNS 查找可能是一个瓶颈,你可能要建立自己的 DNS 服务器。

与许多其他系统类似,扩展的网络爬虫可能比构建单个机器版本困难得多,并且在系统设计面试中可以讨论许多事情。尝试从一些朴素的解决方案开始,并继续优化它,这可以使事情变得比看起来更容易。

以上就是我们总结的关于网页爬虫的相关文章内容,大家如果还有其他想知道的可以在下方的留言区域讨论,感谢大家对三水点靠木的支持。

Python 相关文章推荐
python分割文件的常用方法
Nov 01 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python 打印对象的所有属性值的方法
Sep 11 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
python输出数学符号实例
May 11 Python
python中线程和进程有何区别
Jun 17 Python
Matplotlib配色之Colormap详解
Jan 05 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 #Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 #Python
Python实现矩阵加法和乘法的方法分析
Dec 19 #Python
分析python切片原理和方法
Dec 19 #Python
python实现redis三种cas事务操作
Dec 19 #Python
Python2/3中urllib库的一些常见用法
Dec 19 #Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 #Python
You might like
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php 调用远程url的六种方法小结
2009/11/02 PHP
php 运行效率总结(提示程序速度)
2009/11/26 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
Python3匿名函数用法示例
2018/07/25 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python类中super() 的使用解析
2019/12/19 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
Python如何输出百分比
2020/07/31 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
毕业生的求职信范文分享
2013/12/04 职场文书
企业宣传方案
2014/03/04 职场文书
保护黄河倡议书
2014/05/16 职场文书
环境卫生标语
2014/06/09 职场文书
员工安全生产责任书
2014/07/22 职场文书
督导岗位职责范本
2015/04/10 职场文书
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL