如何设计爬虫系统?

简介: 爬虫系统是大厂设计类高频面试题,面对没有标准答案的问题,10年经验架构师来叨叨解题思路

作者 | 九章算法东邪老师

问题描述:如果让你来设计一个最基本的Web Crawler,该如何设计?需要考虑的因素有哪些?

解题思路

这个问题是面试中常见的设计类问题。没有标准答案。需要尽可能的回答出多一点的考虑因素。

实际上如果你没有做过相关的设计,想要回答出一个让面试官满意的结果其实并不是很容易。该问题并不局限于你在去面试搜索引擎公司时可能会问到。这里,我们从Junior Level和Senior Level两个角度来解答这个问题。

本题运用九章算法《系统架构设计》答题技巧则进行拆解,在课程中会有更详细的讲解。

1.如何抽象整个互联网

- Junior
抽象为一个无向图,网页为节点,网页中的链接为有向边。

- Senior
同上。

2.抓取算法

- Junior
采用BFS的方法,维护一个队列,抓取到一个网页以后,分析网页的链接,扔到队列里。

- Senior
采用优先队列调度,区别于单纯的BFS,对于每个网页设定一定的抓取权重,优先抓取权重较高的网页。对于权重的设定,考虑的因素有:1. 是否属于一个比较热门的网站 2. 链接长度 3. link到该网页的网页的权重 4. 该网页被指向的次数 等等。

进一步考虑,对于热门的网站,不能无限制的抓取,所以需要进行二级调度。首先调度抓取哪个网站,然后选中了要抓取的网站之后,调度在该网站中抓取哪些网页。这样做的好处是,非常礼貌的对单个网站的抓取有一定的限制,也给其他网站的网页抓取一些机会。

在我的《系统架构设计》第15章会通过对爬虫系统设计 (Web Crawler) 与 搜索建议系统设计 (Google Suggestion) 详细分析如下内容:

  • 多线程
  • 生产者消费者模型
  • 爬虫系统的演化:单线程,多线程,分布式
  • Trie 结构的原理及应用
  • 如何在系统设计中使用 Trie

3.网络模型

- Junior
多线程抓取。

- Senior
分别考虑单机抓取和分布式抓取的情况。对于Windows的单机,可以使用IOCP完成端口进行异步抓取,该种网络访问的方式可以最大程度的利用闲散资源。因为网络访问是需要等待的,如果简单的同时开多个线程,计算机用于线程间切换的耗费会非常大,这种用于处理抓取结果的时间就会非常少。IOCP可以做到使用几个线程就完成几十个线程同步抓取的效果。对于多机的抓取,需要考虑机器的分布,如抓取亚洲的站点,则用在亚洲范围内的计算机等等。

4.实时性

- Junior
无需回答

- Senior
新闻网页的抓取一般来说是利用单独的爬虫来完成。新闻网页抓取的爬虫的权重设置与普通爬虫会有所区别。首先需要进行新闻源的筛选,这里有两种方式,一种是人工设置新闻源,如新浪首页,第二种方式是通过机器学习的方法。新闻源可以定义链接数非常多,链接内容经常变化的网页。从新闻源网页出发往下抓取给定层级限制的网页所得到,再根据网页中的时间戳信息判断,就可以加入新闻网页。

5.网页更新

- Junior
无需回答。

- Senior
网页如果被抓下来以后,有的网页会持续变化,有的不会。这里就需要对网页的抓取设置一些生命力信息。当一个新的网页链接被发现以后,他的生命力时间戳信息应该是被发现的时间,表示马上需要被抓取,当一个网页被抓取之后,他的生命力时间戳信息可以被设置为x分钟以后,那么,等到x分钟以后,这个网页就可以根据这个时间戳来判断出,他需要被马上再抓取一次了。一个网页被第二次抓取以后,需要和之前的内容进行对比,如果内容一致,则延长下一次抓取的时间,如设为2x分钟后再抓取,直到达到一个限制长度如半年或者三个月(这个数值取决于你爬虫的能力)。如果被更新了,则需要缩短时间,如,x/2分钟之后再抓取。

6.总结

一般来说,上述5点是你可以去回答如何设计一个爬虫的5个角度。


九章算法,程序员的职场必修课。硅谷顶尖科技公司和国内一线互联网大厂IT工程师在线授课。课程类型丰富,涵盖算法类、项目实战类、小班训练营、VIP1对1私人服务等课程,帮助10w+学员成功拿到国内外顶尖大厂offer。

相关文章
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
178 4
|
1月前
|
数据采集 存储 XML
构建高效的Python爬虫系统
【9月更文挑战第30天】在数据驱动的时代,掌握如何快速高效地获取网络信息变得至关重要。本文将引导读者了解如何构建一个高效的Python爬虫系统,从基础概念出发,逐步深入到高级技巧和最佳实践。我们将探索如何使用Python的强大库如BeautifulSoup和Scrapy,以及如何应对反爬措施和提升爬取效率的策略。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在信息收集的海洋中航行得更远、更深。
46 6
|
2月前
|
数据采集 Java
爬虫系统学习
爬虫系统学习
|
5月前
|
数据采集 存储 监控
构建高效爬虫系统:设计思路与案例分析
构建高效爬虫系统涉及关键模块如爬虫引擎、链接存储、内容处理器等,以及用户代理池、IP代理池等反反爬策略。评估项目复杂性考虑数据规模、网站结构、反爬虫机制等因素。案例分析展示了电子商务价格比较爬虫的设计,强调了系统模块化、错误处理和合规性的重要性。爬虫技术需要不断进化以应对复杂网络环境的挑战。
125 1
|
6月前
|
数据采集 自然语言处理 Python
在 Django 中设计爬虫系统的数据模型与多对多关系
在构建爬虫系统时,设计合理的数据模型和多对多关系对系统的性能和可维护性至关重要。本文将探讨如何使用 Django 来设计爬虫系统的数据模型。
|
5月前
|
数据采集 NoSQL MongoDB
使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统
在这篇博客中,将展示如何使用多进程和 Scrapy 来构建一个高效的 Amazon 爬虫系统。通过多进程处理,提高爬虫的效率和稳定性,同时利用 Redis 进行请求调度和去重。
|
数据采集 自然语言处理 Java
爬虫系统的核心:如何创建高质量的HTML文件?
在网页抓取或爬虫系统中,HTML文件的创建是一项重要的任务。HTML文件是网页的基础,包含了网页的所有内容和结构。在爬虫系统中,我们需要生成一个HTML文件,以便于保存和处理网页的内容。
|
数据采集 存储 调度
使用多线程爬虫提高商品秒杀系统的吞吐量处理能力
使用多线程爬虫提高商品秒杀系统的吞吐量处理能力
|
数据采集 存储 分布式计算
构建可扩展的分布式爬虫系统
构建可扩展的分布式爬虫系统
|
数据采集 搜索推荐 前端开发
基于springboot+vue+爬虫实现电影推荐系统
基于springboot+vue+爬虫实现电影推荐系统
基于springboot+vue+爬虫实现电影推荐系统