0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

网页爬虫及其用到的算法和数据结构

算法与数据结构 来源:快课网 作者:Jay13 2022-12-02 11:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

网络爬虫,是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互 联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索 引擎提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即 时,因此其性能的优劣直接影响着搜索引擎的效果。

网络爬虫程序的优劣,很大程度上反映了一个搜索引擎的好差。不信,你可以随便拿一个网站去查询一下各家搜索对它的网页收录情况,爬虫强大程度跟搜索引擎好坏基本成正比。

1.世界上最简单的爬虫——三行情诗

我们先来看一个最简单的最简单的爬虫,用python写成,只需要三行。

import requests
url="http://www.cricode.com"
r=requests.get(url)

上面这三行爬虫程序,就如下面这三行情诗一般,很干脆利落。

是好男人,

就应该在和女友吵架时,

抱着必输的心态。

2.一个正常的爬虫程序

上面那个最简单的爬虫,是一个不完整的残疾的爬虫。因为爬虫程序通常需要做的事情如下

1)给定的种子URLs,爬虫程序将所有种子URL页面爬取下来

2)爬虫程序解析爬取到的URL页面中的链接,将这些链接放入待爬取URL集合中

3)重复1、2步,直到达到指定条件才结束爬取

因此,一个完整的爬虫大概是这样子的:

import requests                       #用来爬取网页
from bs4 import BeautifulSoup         #用来解析网页
seds = ["http://www.hao123.com",      #我们的种子
              "http://www.csdn.net",
              "http://www.cricode.com"]
sum = 0                               #我们设定终止条件为:爬取到100000个页面时,就不玩了
 
while sum < 10000 :
    if sum < len(seds):
         r = requests.get(seds[sum])
         sum = sum + 1
         do_save_action(r)
         soup = BeautifulSoup(r.content)               
         urls = soup.find_all("href",.....)                     //解析网页
         for url in urls:
              seds.append(url)
 
    else:
         break

3.现在来找茬

上面那个完整的爬虫,不足20行代码,相信你能找出20个茬来。因为它的缺点实在是太多。下面一一列举它的N宗罪:

1)我们的任务是爬取1万个网页,按上面这个程序,一个人在默默的爬取,假设爬起一个网页3秒钟,那么,爬一万个网页需要3万秒钟。MGD,我们应当考虑开启多个线程(池)去一起爬取,或者用分布式架构去并发的爬取网页。

2)种子URL和后续解析到的URL都放在一个列表里,我们应该设计一个更合理的数据结构来存放这些待爬取的URL才是,比如队列或者优先队列。

3)对各个网站的url,我们一视同仁,事实上,我们应当区别对待。大站好站优先原则应当予以考虑。

4)每次发起请求,我们都是根据url发起请求,而这个过程中会牵涉到DNS解析,将url转换成ip地址。一个网站通常由成千上万的URL,因此,我们可以考虑将这些网站域名的IP地址进行缓存,避免每次都发起DNS请求,费时费力。

5)解析到网页中的urls后,我们没有做任何去重处理,全部放入待爬取的列表中。事实上,可能有很多链接是重复的,我们做了很多重复劳动。

6)…..

4.找了这么多茬后,很有成就感,真正的问题来了,学挖掘机到底哪家强?

现在我们就来一一讨论上面找茬找出的若干问题的解决方案。

1)并行爬起问题

我们可以有多重方法去实现并行。

多线程或者线程池方式,一个爬虫程序内部开启多个线程。同一台机器开启多个爬虫程序,如此,我们就有N多爬取线程在同时工作。能大大减少时间。

此外,当我们要爬取的任务特别多时,一台机器、一个网点肯定是不够的,我们必须考虑分布式爬虫。常见的分布式架构有:主从(Master——Slave)架构、点对点(Peer to Peer)架构,混合架构等。

说道分布式架构,那我们需要考虑的问题就有很多,我们需要分派任务,各个爬虫之间需要通信合作,共同完成任务,不要重复爬取相同的网页。分派任务我们要做到公平公正,就需要考虑如何进行负载均衡。负载均衡,我们第一个想到的就是Hash,比如根据网站域名进行hash。

负载均衡分派完任务之后,千万不要以为万事大吉了,万一哪台机器挂了呢?原先指派给挂掉的哪台机器的任务指派给谁?又或者哪天要增加几台机器,任务有该如何进行重新分配呢?

一个比较好的解决方案是用一致性Hash算法

2)待爬取网页队列

如何对待待抓取队列,跟操作系统如何调度进程是类似的场景。

不同网站,重要程度不同,因此,可以设计一个优先级队列来存放待爬起的网页链接。如此一来,每次抓取时,我们都优先爬取重要的网页。

当然,你也可以效仿操作系统的进程调度策略之多级反馈队列调度算法。

3)DNS缓存

为了避免每次都发起DNS查询,我们可以将DNS进行缓存。DNS缓存当然是设计一个hash表来存储已有的域名及其IP。

4)网页去重

说到网页去重,第一个想到的是垃圾邮件过滤。垃圾邮件过滤一个经典的解决方案是Bloom Filter(布隆过滤器)。布隆过滤器原理简单来说就是:建立一个大的位数组,然后用多个Hash函数对同一个url进行hash得到多个数字,然后将位数组中这些数字对应的位置为1。下次再来一个url时,同样是用多个Hash函数进行hash,得到多个数字,我们只需要判断位数组中这些数字对应的为是全为1,如果全为1,那么说明这个url已经出现过。如此,便完成了url去重的问题。当然,这种方法会有误差,只要误差在我们的容忍范围之类,比如1万个网页,我只爬取到了9999个,剩下那一个网页,who cares!

5)数据存储的问题

数据存储同样是个很有技术含量的问题。用关系数据库存取还是用NoSQL,抑或是自己设计特定的文件格式进行存储,都大有文章可做。

6)进程间通信

分布式爬虫,就必然离不开进程间的通信。我们可以以规定的数据格式进行数据交互,完成进程间通信。

7)……

废话说了那么多,真正的问题来了,问题不是学挖掘机到底哪家强?而是如何实现上面这些东西!:)

实现的过程中,你会发现,我们要考虑的问题远远不止上面这些。纸上得来终觉浅,觉知此事要躬行!

审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4760

    浏览量

    97144
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    41370
  • 爬虫
    +关注

    关注

    0

    文章

    87

    浏览量

    7949

原文标题:网页爬虫及其用到的算法和数据结构

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    # 深度解析:爬虫技术获取淘宝商品详情并封装为API的全流程应用

    需求。本文将深入探讨如何借助爬虫技术实现淘宝商品详情的获取,并将其高效封装为API。 一、爬虫技术核心原理与工具 1.1 爬虫运行机制 网络爬虫本质上是一种遵循特定规则,自动抓取
    的头像 发表于 11-17 09:29 166次阅读

    通过优化代码来提高MCU运行效率

    最高。 避免在32位MCU上频繁使用8位char类型进行算术运算,因为可能需要符号扩展和截断。 谨慎使用浮点数,如果必须用,尽量用float而非double,并考虑使用定点数运算替代。 算法数据结构
    发表于 11-12 08:21

    Camellia算法的实现(基于开源蜂鸟E203协处理器)

    的输入。Camellia算法一共要用到四个不同的S盒,S盒的定义已在如上公式中给出。S盒处理后的数据还需要输出给P变换作为处理,P变换也为相应的异或运算。最后得出,F函数的输出结果。 上图所示为
    发表于 10-30 07:04

    AES加解密算法逻辑实现及其在蜂鸟E203SoC上的应用介绍

    算法的循环轮数就要增加2轮。 AES密码算法的内部结构由多个层构成,每一层都是对整个处理块16字节进行操作,并且循环多轮进行处理。在加密运算中,每一轮运算包含四种不同类型的层:密钥加法层、字节代换
    发表于 10-29 07:29

    国密系列算法简介及SM4算法原理介绍

    使用了Feistel结构(分组密码中的一种对称结构),其中密钥扩展部分也使用了Feistel结构,所以对数据和密钥的处理流程极为相似。下面对SM4加密过程进行阐述: 对于密钥扩展部分
    发表于 10-24 08:25

    从 0 到 1:用 PHP 爬虫优雅地拿下京东商品详情

    在电商数据驱动的时代, 商品详情数据 成为市场分析、价格监控、竞品调研的核心燃料。京东作为国内头部电商平台,其商品信息丰富、更新频繁,是数据开发者眼中的“香饽饽”。 本文将带你 从 0 到 1 ,用
    的头像 发表于 09-23 16:42 564次阅读
    从 0 到 1:用 PHP <b class='flag-5'>爬虫</b>优雅地拿下京东商品详情

    Nginx限流与防爬虫配置方案

    在互联网业务快速发展的今天,网站面临着各种流量冲击和恶意爬虫的威胁。作为运维工程师,我们需要在保证正常用户访问的同时,有效防范恶意流量和爬虫攻击。本文将深入探讨基于Nginx的限流与防爬虫解决方案,从原理到实践,为大家提供一套完
    的头像 发表于 09-09 15:52 649次阅读

    【HZ-T536开发板免费体验】6、使用protoc-gen-gorm生成标准化的数据结构

    在设计espnow协议的时候,考虑到我需要在esp32,Linux设备,web上使用相同的数据结构,那就需要考虑一下,是否使用一个通用的跨平台序列化数据结构。这时候我想起了protobuf,这个就是
    发表于 08-26 00:32

    盘点嵌入式就业所需要的技能有哪些?

    语言,如C/C++、Java等。 - 掌握操作系统原理,了解Linux/Android等操作系统的内核架构和驱动开发。 - 具备良好的数据结构算法基础,能够进行高性能计算和数据处理。 - 了解智能手机
    发表于 08-11 15:43

    ESP32-运行网页服务器(Web Server)-实用篇

    在前一篇文章《ESP32-运行网页服务器(WebServer)-入门篇》,我们介绍了ESP32运行网页服务器(WebServer)的原理,然后我们基于ESP32实现了一个demo代码;看到很多同学都留言发表了自己的看法,有很多同学都基于这个原理实现了很多有意思的应用;这里
    的头像 发表于 07-28 18:05 2807次阅读
    ESP32-运行<b class='flag-5'>网页</b>服务器(Web Server)-实用篇

    程序设计与数据结构

    的地址)出发,采用推导的方式,深入浅出的分析了广大C程序员学习和开发中遇到的难点。 2. 从方法论的高度对C语言在数据结构算法方面的应用进行了深入讲解和阐述。 3. 讲解了绝大多数C程序员开发
    发表于 05-13 16:45

    如何用Brower Use WebUI实现网页数据智能抓取与分析?

    ​ 作者:算力魔方创始人/英特尔创新大使刘力 Browser-use是一款能让AI智能体像人类一样操作网页的创新工具,与传统网络爬虫技术相比,Browser-use能模拟人浏览并操作网页,在采集网站
    的头像 发表于 04-17 17:48 891次阅读
    如何用Brower Use WebUI实现<b class='flag-5'>网页数据</b>智能抓取与分析?

    爬虫数据获取实战指南:从入门到高效采集

    爬虫数据获取实战指南:从入门到高效采集     在数字化浪潮中,数据已成为驱动商业增长的核心引擎。无论是市场趋势洞察、竞品动态追踪,还是用户行为分析,爬虫技术都能助你快速捕获目标信息。
    的头像 发表于 03-24 14:08 1256次阅读

    IP地址数据信息和爬虫拦截的关联

    IP地址数据信息和爬虫拦截的关联主要涉及到两方面的内容,也就是数据信息和爬虫。IP 地址数据信息的内容丰富,包括所属地域、所属网络运营商、访
    的头像 发表于 12-23 10:13 677次阅读

    康谋方案 | 多源相机数据采集与算法集成测试方案

    如何满足不同应用场景下对图像采集和算法测试的多样化需求?本文为您带来多源相机数据采集与算法集成测试方案,通过BRICKplus/BRICK2与ADTF的结合,轻松实现多源相机快速集成和数据
    的头像 发表于 12-11 09:59 4053次阅读
    康谋方案 | 多源相机<b class='flag-5'>数据</b>采集与<b class='flag-5'>算法</b>集成测试方案