CN115248887A - 一种基于流式下载的爬虫方法 - Google Patents
一种基于流式下载的爬虫方法 Download PDFInfo
- Publication number
- CN115248887A CN115248887A CN202110992076.7A CN202110992076A CN115248887A CN 115248887 A CN115248887 A CN 115248887A CN 202110992076 A CN202110992076 A CN 202110992076A CN 115248887 A CN115248887 A CN 115248887A
- Authority
- CN
- China
- Prior art keywords
- downloading
- firmware
- link
- download
- file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/951—Indexing; Web crawling techniques
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明属于网络爬虫技术领域,本发明公布了一种基于流式下载的爬虫方法。本发明为了解决爬虫在并发下载固件时内存占用过大的问题而设计。本发明基于Vert.x框架实现,采用单线程事件驱动的异步工作模式;将固件的自动化下载分为爬取链接和下载固件两个模块,首先爬取链接模块将爬取的链接放入Redis中,其次下载模块从Redis中获取链接进行下载;用正则表达式获取固件链接;采取两种方法实现流式下载,分别是直接使用Vert.x框架提供的Stream接口和利用HTTP的Range字段。由此,异步工作模式不需要等待网络I/O,提高了CPU利用率;通过将系统划分成两个模块,降低了爬虫系统的耦合性;采用流式下载的方式能够大幅降低内存占用,支持更高的并发下载的同时也提高了系统的稳定性。该发明主要用于有下载大量文件需求的爬虫任务。
Description
技术领域:
本发明属于网络爬虫技术领域,特别是涉及到一种基于流式下载的爬虫方法。
背景技术:
随着大数据时代的来临,庞大的数据集促进了技术的进步,然而传统的人工手动采集方式已经无法满足海量数据的获取。爬虫是一种自动化高效地获取互联网中感兴趣信息的技术。现有的爬虫能够定向地抓取目标网页的资源,通常采集的是文字或者图片。为了支撑大规模固件的分析,我们需要开发一个自动化下载固件的爬虫系统来自动化的下载大量固件。
现有的爬虫方法常采用多线程的方式,对于那些文字或者图片的爬取任务来说,每个任务仅占用较短的线程时间,因此多线程的方式足以满足需求,而对于本发明用于自动化下载固件,比普通的页面抓取需要更长的网络io时间,每个任务会长时间的阻塞线程,需要并发的进行更多的任务,即多个固件的同时下载,这时多线程的方式不再高效,多线的方法依然是每个线程处理一个请求,操作系统层面靠的是快速切换线程实现多个任务的并行,当线程数量较多,会使得大量资源耗费在线程切换上面,而异步的方式是一个线程来处理所有的请求,底层应用到了io多路复用,因此在同时处理大量io请求的情况下异步的方式优于多线程的方式。
采用异步的方式实现,提高了并发量,同时也带来了新的问题。下载文字或者图片通常是将网页上的资源读取到内存中,然后统一写入磁盘。下载文件也可以沿用这种方式,但同样是将文件读入内存中,由于文件体积变大,量变导致质变,即内存不足以容纳过大的文件,尤其是在并发的下载文件时,下载完成之前资源都被保存在内存中,内存被大量的占用,限制了下载的并发度,甚至导致程序崩溃。
综上所述,并发需求与下载需求在内存上产生的冲突导致了现有爬虫方案不能很好的解决固件收集的任务,因此,如何在提高爬虫并发量的同时,能够大幅降低下载文件的内存占用是目前现有技术中存在的主要问题。
发明内容:
为解决当前爬虫下载文件内存占用过大的问题,本发明提出的基于流式下载的爬虫方法可以有效降低爬虫在并发下载文件时内存占用过大的问题。
本发明请求保护一种基于流式下载的爬虫方法,其特征在于,包括:
步骤A,所述的确认目标网站特征包括以下步骤:
A1.找到目标网站的下载中心;
A2.找到从下载中心进入到每个固件下载链接的方式;
A3.得到从根页面获得所有下载链接的规律;
A4.分析发送Http请求需要携带的参数以及参数规律。
步骤B,所述的分析链接的规律包括以下步骤:
B1.打开目标网页的源代码;
B2.定位到固件下载链接位置的前端代码;
B3.找出固件下载链接与其他非固件下载链接的区别;
B4.根据找出的规律写出正则表达式。
步骤C,所述的基于Vert.x框架搭建爬虫系统包括以下步骤:
C1.创建Vertx对象;
C2.根据Vertx对象创建WebClient对象;
C3.创建Redis链接;
C4.根据分析出的请求参数构建好Http相关参数;
C5.按照规律从根页面开始抓取固件下载链接。
步骤D,所述的爬取固件下载链接包括以下步骤:
D1.根据已找出的规律从根页面开始遍历;
D2.用正则表达式去匹配得到的Http响应;
D3.对获取到的链接根据后缀名称进行过滤;
D4.将过滤后符合需求的固件下载链接储存到Redis的集合中。
步骤E,所述的下载模块进行下载:
E1.类似权利要求4的方式构建固件下载模块;
E2.设置客户端的最大空闲时间与链接超时时间;
E3.循环地从Redis中获取链接并删除:
E4.发送Http Head请求获取文件大小,以及判断是否支持Range方式下载;
E5.如果文件大小小于50MB则进行流式下载,否则直接跳过;
E6.下载成功则重复该步骤,直至Redis中不存在固件下载链接;
E7.下载超时或者链接断开导致下载失败则将固件下载链接放入Redis失败队列。
步骤F,所属的处理下载失败的固件链接:
F1.查看Redis中的失败队列;
F2.将该队列重新放回原Redis队列;
F3.对这些链接重新下载;
F4.多次下载失败的链接手动下载或者直接舍弃。
1)本发明采用两种方式实现流式下载;
2)方法一,利用Vert.x框架自带的Stream接口;
3)具体是在发送Head请求的函数上设置回调函数,判断文件大小,符合要求则打开待写入的文件,设置回调函数发送Http请求并将请求响应转化成BodyCodec.pipe(asyncFileAsyncResult.result()),其中asyncFileAsyncResult.result()是打开文件的写入流。
4)在Http请求上设置回调函数处理下载失败的情况,首先删除已经打开的文件,因为下载失败的情况这个文件是空的或者不完整的,然后将固件下载链接放入Redis的失败队列中。
5)方法二,利用Http协议的Range请求,这个方法需要目标网站支持Range方式的请求;
6)也是在发送Head请求的函数上设置回调函数,判断文件大小,符合要求则以追加写入的方式打开待写入的文件,然后以回调的方式递归的发送Http请求,使得每个片段下载完成后自动调用回调函数下载下一个文件片段,当Range字段偏移超出content-length时终止递归;
7)递归下载的过程中任一片段下载失败都会导致整个固件文件的下载失败,此处与方法一的处理方式相同。
附图说明:
图1是本申请实施例提供的一种基于流式下载的爬虫方法中爬取链接模块的流程图。
图2是本申请实施例提供的一种基于流式下载的爬虫方法中固件下载模块的流程图。
图3是本申请实施例提供的一种基于流式下载的爬虫方法中流式下载实现方式的流程图。
具体实施方式:
下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。下面列举的实施例仅为对本发明技术方案的进一步理解和实施,并不构成对本发明权利要求的进一步限定,因此,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供一种基于流式下载的爬虫方法,该方法通过将Vert.x异步框架与流式下载技术结合,成功地解决了利用爬虫系统下载固件时内存占用过多,超出可用内存导致系统崩溃的问题。由此,提升了爬虫系统在下载固件时的系统稳定性,使得爬虫能同时下载更多的固件,进一步压榨服务器与网络的性能,最终提升了固件数据采集的效率,缩短了项目开发周期。
传统非流式的下载方法会在文件全部下载完成后,将内容从内存中写入磁盘,若是下载文件过大,或者许多个文件同时下载,将导致内存占用飙升,最终导致爬虫系统崩溃,降低了系统的可用性;而流式下载可以每次处理部分内容,直到下载完成,即每下载一部分就增量地写入磁盘,大幅降低内存占用,提高了爬虫系统的可用性。
下面分别进行详细说明。
本发明基于Vert.x异步框架实现,Vert.x是一种小而轻的高性能异步、非阻塞、响应式全栈java web 框架,是基于netty的、运行在jvm之上的、支持多种编程语言的框架。它使用单线程事件驱动的异步工作模式,比较适合爬虫这种io密集型的任务。
本发明将链接的爬取与根据链接下载固件分成两个模块,先是将所有的固件链接爬取下载存储到 redis中,然后固件下载模块从redis中取出链接进行下载,这样一来就解耦了链接爬取与固件下载,可以使得两个模块独立的演化。这样就可以实现增量下载,因为大量的固件很难一次性的下载完毕,通常都需要多次启动爬虫程序,将链接存储在redis中,每次下载完成后就删除redis中对应的固件链接,能够实现每次启动程序接着上次下载停止的部分继续下载,而不会重复的下载某些固件,若是将链接的爬取与固件下载集成在一起,为了不重复下载还需要设计一个去重的模块,即使能够不重复的下载也不能避免爬虫重复的游走,依然浪费时间。除此之外还能实现分布式下载,若是单一服务器的带宽不能满足需求,可以在多个服务器上部署爬虫,从同一个redis中获取链接进行分布式下载,而redis的单线程模型可以天然的避免固件被多个服务器重复下载,所以这种设计易于拓展,即解耦链接爬取与固件下载能带来大量好处。
参照附图1,爬取链接模块的流程主要分为三步,首先将起始页面放入队列,然后根据规则爬取所有可能包含固件链接的页面,从每个遍历到的页面中提取出链接,最后对每个链接根据后缀名进行过滤,将符合条件的固件链接放入Redis中。
其中解析网页使用的是正则表达式而不是XPath或BeautifulSoup等工具,这样做主要是为了提升效率,正则表达式比起其他方式具有更高的效率。由于该方法只需要提取出网页中的固件链接,对其他的网页结构并不关心,因此没必要解析整个网页的结构,正则表达式足以满足我们的需求。用正则表达式提取出链接后,需要判断一下该链接是否指向一个固件文件,根据的是文件名后缀主要是zip,bin等。
参照附图2,是固件下载模块的流程,由于体积大的固件下载较慢,占用空间大并且难以模拟运行成功,所以本专利爬虫在下载之前先判断文件大小,文件大小大于50MB的自动跳过,只下载那些小于50MB 的固件,方法是在发送get请求之前先发送head请求,head请求只会返回http头,不返回http内容,因此可以迅速的响应,通过判断head请求的响应中的content-length字段是否小于52428800即可知道该固件大小是否小于50MB。同时设置HTTP连接空闲时间上限,以便及时关闭长时间没有速度的下载任务。
经判断文件大小,符合条件则开始下载,下载成功则保存文件继续下载新的固件,而下载失败时,为了尽可能全面的下载固件,下载失败的链接将被放入失败的队列中单独存储起来,以便后续重新下载或是手动下载。
本专利实现了两种流式下载方法,第一种是vert.x框架的Stream,打开一个文件转换成WriteStream,然后将收到的http响应转换成ReadStream,把内容从ReadStream写入WriteStream中就实现了流式的下载。第二种是利用Http手动实现的分段下载。
参照附图3,是本发明利用Http协议实现流式下载的流程,利用http头部的range字段,预先设置好每次读取的长度,然后递归的发起http请求携带不同的range参数,直到下载完整。具体来说,递归指的是每次下载完成一段后,递归的调用函数本身下载下一段,这样做是为了保持文件的有序,若是并发的下载所有片段,最终组合成一个文件会带来麻烦,后部片段下载完成也需要等待前面的写入磁盘才能进行写入,这个时候只能保存在内存中,这就可能与非流式下载的方法产生相同的内存占用问题。另外,这个方法需要预先知道对面的http服务器是否支持range的方式,可以在head请求中得知若是返回字段包括Accept-Ranges:bytes则说明可以采用range的方式进行下载,这一步可以与获取文件大小同时进行,即只发送一次head请求可以同时获得文件大小和是否支持range。
Claims (8)
1.一种基于流式下载的爬虫方法,包括以下步骤:
A.确认目标网站特征
观察目标网站,获取固件链接的目录结构,找出固件链接的分布规律,最终能够通过一个根页面获取到所有固件的下载链接。
B.分析链接的规律
得出能够精确提取出链接的正则表达式。
C.基于Vert.x框架搭建爬虫系统
Vert.x框架使用单线程事件驱动的异步工作模式,比较适合爬虫这种io密集型的任务。
D.爬取固件下载链接
根据链接的后缀过滤出固件文件,将链接储存到Redis中.
E.使用下载模块进行下载
循环地从Redis中获取链接,判断文件大小,下载文件大小小于50MB的固件,若是下载失败还要把链接放到Redis失败队列中。
F.处理下载失败的固件链接
可选择的方法有:放回原队列重新下载、手动下载或抛弃。
2.根据权利要求1所述的一种基于流式下载的爬虫方法,其特征在于:
步骤A,所述的确认目标网站特征包括以下步骤:
A1.找到目标网站的下载中心;
A2.找到从下载中心进入到每个固件下载链接的方式;
A3.得到从根页面获得所有下载链接的规律;
A4.分析发送Http请求需要携带的参数以及参数规律。
3.根据权利要求1所述的一种基于流式下载的爬虫方法,其特征在于:
步骤B,所述的分析链接的规律包括以下步骤:
B1.打开目标网页的源代码;
B2.定位到固件下载链接位置的前端代码;
B3.找出固件下载链接与其他非固件下载链接的区别;
B4.根据找出的规律写出正则表达式。
4.根据权利要求1所述的一种基于流式下载的爬虫方法,其特征在于:
步骤C,所述的基于Vert.x框架搭建爬虫系统包括以下步骤:
C1.创建Vertx对象;
C2.根据Vertx对象创建WebClient对象;
C3.创建Redis链接;
C4.根据分析出的请求参数构建好Http相关参数;
C5.按照规律从根页面开始抓取固件下载链接。
5.根据权利要求1所述的一种基于流式下载的爬虫方法,其特征在于:
步骤D,所述的爬取固件下载链接包括以下步骤:
D1.根据已找出的规律从根页面开始遍历;
D2.用正则表达式去匹配得到的Http响应;
D3.对获取到的链接根据后缀名称进行过滤;
D4.将过滤后符合需求的固件下载链接储存到Redis的集合中。
6.根据权利要求1所述的一种基于流式下载的爬虫方法,其特征在于:
步骤E,所述的下载模块进行下载:
E1.类似权利要求4的方式构建固件下载模块;
E2.设置客户端的最大空闲时间与链接超时时间;
E3.循环地从Redis中获取链接并删除;
E4.发送Http Head请求获取文件大小,以及判断是否支持Range方式下载;
E5.如果文件大小小于50MB则进行流式下载,否则直接跳过;
E6.下载成功则重复该步骤,直至Redis中不存在固件下载链接;
E7.下载超时或者链接断开导致下载失败则将固件下载链接放入Redis失败队列。
7.根据权利要求1所述的一种基于流式下载的爬虫方法,其特征在于:
步骤F,所属的处理下载失败的固件链接:
F1.查看Redis中的失败队列;
F2.将该队列重新放回原Redis队列;
F3.对这些链接重新下载;
F4.多次下载失败的链接手动下载或者直接舍弃。
8.根据权利要求6所述的一种基于流式下载的爬虫方法,其特征在于:
1)本发明采用两种方式实现流式下载;
2)方法一,利用Vert.x框架自带的Stream接口;
3)具体是在发送Head请求的函数上设置回调函数,判断文件大小,符合要求则打开待写入的文件,设置回调函数发送Http请求并将请求响应转化成BodyCodec.pipe(asyncFileAsyncResult.result()),其中asyncFileAsyncResult.result()是打开文件的写入流。
4)在Http请求上设置回调函数处理下载失败的情况,首先删除已经打开的文件,因为下载失败的情况这个文件是空的或者不完整的,然后将固件下载链接放入Redis的失败队列中。
5)方法二,利用Http协议的Range请求,这个方法需要目标网站支持Range方式的请求;
6)也是在发送Head请求的函数上设置回调函数,判断文件大小,符合要求则以追加写入的方式打开待写入的文件,然后以回调的方式递归的发送Http请求,使得每个片段下载完成后自动调用回调函数下载下一个文件片段,当Range字段偏移超出content-length时终止递归;
7)递归下载的过程中任一片段下载失败都会导致整个固件文件的下载失败,此处与方法一的处理方式相同。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110992076.7A CN115248887A (zh) | 2021-11-29 | 2021-11-29 | 一种基于流式下载的爬虫方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110992076.7A CN115248887A (zh) | 2021-11-29 | 2021-11-29 | 一种基于流式下载的爬虫方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115248887A true CN115248887A (zh) | 2022-10-28 |
Family
ID=83696250
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110992076.7A Pending CN115248887A (zh) | 2021-11-29 | 2021-11-29 | 一种基于流式下载的爬虫方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115248887A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116599877A (zh) * | 2023-07-19 | 2023-08-15 | 国家计算机网络与信息安全管理中心江西分中心 | 一种基于爬虫技术的IPv6的链接测试方法 |
-
2021
- 2021-11-29 CN CN202110992076.7A patent/CN115248887A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116599877A (zh) * | 2023-07-19 | 2023-08-15 | 国家计算机网络与信息安全管理中心江西分中心 | 一种基于爬虫技术的IPv6的链接测试方法 |
CN116599877B (zh) * | 2023-07-19 | 2023-09-15 | 国家计算机网络与信息安全管理中心江西分中心 | 一种基于爬虫技术的IPv6的链接测试方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Heydon et al. | Mercator: A scalable, extensible web crawler | |
US10534671B1 (en) | Container image layer compaction | |
RU2646349C2 (ru) | Способ и система для обработки данных | |
CN104778270A (zh) | 一种用于多文件的存储方法 | |
CN111177159B (zh) | 一种数据处理的系统、方法和数据更新设备 | |
CN108776682A (zh) | 基于对象存储的随机读写对象的方法和系统 | |
CN113918793A (zh) | 一种多源科创资源数据采集方法 | |
WO2020010724A1 (zh) | 前端静态资源的管理方法、装置、计算机设备及存储介质 | |
CN115248887A (zh) | 一种基于流式下载的爬虫方法 | |
CN112465046A (zh) | 海量小文件的人工智能训练的方法、系统、设备及介质 | |
CN1293493C (zh) | 机群文件服务系统及其输入输出处理方法 | |
CN116016702A (zh) | 一种应用可观测数据采集处理方法、装置及介质 | |
CN111949619A (zh) | 动态目录生成方法、系统、电子设备及存储介质 | |
Fan et al. | Gear: Enable efficient container storage and deployment with a new image format | |
JP2003271670A (ja) | 情報収集装置、情報収集方法及びプログラム | |
CN108762979B (zh) | 一种基于匹配树的终端信息备份方法及备份设备 | |
CN113157658B (zh) | 客户端日志收集分发方法、装置及计算机设备 | |
CN110968704B (zh) | 一种RADOS Gateway的多媒体处理方法 | |
CN100486177C (zh) | 一种网管对网元进行同步操作的方法及其系统 | |
CN102360382A (zh) | 一种高速对象并行存储系统目录复制方法 | |
CN115061630A (zh) | 一种数据迁移方法、装置、设备及介质 | |
CN111858489B (zh) | 一种基于自适应元数据模板的多源异构空间数据归档方法 | |
CN111061719B (zh) | 数据收集方法、装置、设备和存储介质 | |
CN113704203A (zh) | 一种日志文件的处理方法及装置 | |
US11886439B1 (en) | Asynchronous change data capture for direct external transmission |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |