杜晓春 陆涛
摘要:随着大数据时代的来临,如何既快速高效又能大批量的获取所需数据成为大数据应用的一个重要问题,此时,网络爬虫技术显示出了它的优势。目前,国内外普遍使用的搜索引擎其实就是一种网络爬虫。网络爬虫通常仅仅下载网页内容的一部分,但是人们都希望下载的部分包括最多的相关页面,而不仅仅是一个随机的简单的站点。这就要求一个公共标准来区分网页的重要程度,这不仅与网页本身内容有关,与包含链接个数、访问数量等都有一定关系。而且这些爬虫程序大多都是后台保密的,因此大数据时代更加迫切的需要能够根据不同用户的不同需求设计出拥有有效搜索策略的网络爬虫。本文根据大数据时代下互联网应用对数据所产生的新需求,介绍了如何在提前设定抓取目标后,选择适当的网络链接,通过自行编写的网络爬虫程序将所需数据大批量地抓取出来。便于用户运用所获取的数据,通过相应的数据分析手段进行整理、挖掘,从而分析、决策。
关键词:网络爬虫;数据;程序;
在这个大数据时代,人们对数据的应用达到了前所未有的高度,截至2020年,人们产生的数据已经接近或超过了40ZB,而这些数据中很多都通过Web网页呈现。通过获取并分析这些数据可以帮助用户进行市场分析提前进行风险预警,同时也可以帮助用户进行管理决策从而留住自己公司的客户。
一、数据获取的常见方式
用户数据的获取有很多种方式,其中比较常用的主要包括通过已有的数据库进行查询,或者采用搜索引擎直接搜索等。其中前者技术已经十分成熟,数据也容易获得,但是这种方式一般需要专业人士进行维护,成本较高,同时随着数据量增多维护成本也直线上升。同时这种方式耗费硬件也很难做到跨多域。而后者(如百度、谷歌等)的优点是软件免费,使用简单,可是针对用户的不同需求难以定制,在进行数据分析时用户很难直接搜索到自己想要的数据。
因此,如果想根据不同用户需求设定数据获取目标,就需要自己搭建网络爬虫框架,编写网络爬虫程序将所需数据大批量地抓取出来,然后通过相关工具对数据进行统计分析。
二、网络爬虫的工作原理
网络爬虫其实是一个自动提取网页数据的程序,它从一个或多个初始网页的URL开始,先获得初始网页上的URL,再在抓取网页的过程中,不断从当前页面上获取新的URL放入队列,直到满足一定条件后停止[1]。它包括协议处理、URL处理、内容检测三个模块。其中协议处理模块为网络爬虫在爬行时提供必要的网络协议,URL处理模块和内容检测模块将会对已经爬取的网页进行去重。同时,所有被爬虫抓取的网页将会被系统存储,进行相应的分析、过滤,然后建立索引,以便之后的查询和检索。
通常网络爬虫再进行网页数据抓取时可以采用深度优先或者广度优先策略。深度优先被视作递归过程的一种,当爬虫以顺沿的形式向节点树以纵方向分布时,网页遍历图中不存在已访问的节点,它需要占用较大系统内存。广度优先则是爬虫以顺沿的形式向节点树宽度方向分布,抓取初始网页数据中所有信息,随机选择一个网址,并重复该过程,它的抓取效率相对较高[2]。
三、选择适合的开发技术
为了让所编写的网络程序跨平台、可扩展。并且为了方便用户使用,希望实现在爬取互联网中不同的网络站点和链接中的数据时,只需要对其中的核心算法进行修改即可。
目前运用python进行网络爬虫程序编写非常流行,它用运多线程,下载速度比较快,但是在解析网页时,python并没有比NodeJS快。本项目采用JavaScript语言编写,运行时需要使用NodeJS。通过CSS选择器和HTML分析找寻需要爬取的URL地址。为了获取数据样本的数量达到参考要求,在广度优先算法思想的基础上采用最佳优先搜索策略,按照一定的网页分析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取。它只访问经过网页分析算法预测为“有用”的网页。
四、编写网络爬虫程序
用网络爬虫获取网页信息其实就是把URL地址中的网络信息读取出来,并且保存到本地[3]。網络爬虫一般需要包括信息采集、信息提取、索引以及数据库等模块。模块之间需要协调分工,保证每个模块都能实现它需要实现的功能,同时,它们之间又有一定的工作流程,别入触发后面模块开始实施的条件就是前面模块任务的完成。在整个爬虫架构中,信息收集中的搜索策略和信息抽取模块所涉及的主题相关性的判断是最重要的部分,它们共同决定了使用网络爬虫是否可以准确地抓取用户真正需要的数据。
1、当需要爬出页面中所有的链接地址时,可以采用如下的程序。
var url=" https://search.jd.com/Search?keyword=%E5%8C%BB%E5%AD%A6&enc=utf-8&wq=%E5%8C%BB%E5%AD%A6&pvid=5d4df2bcfc9d400e8c2b31c57aac3e5c ";
//选择某个一页面(此处仅为举例说明,网络爬虫在爬取数据时需严格按照网络安全要求规范使用)
var http=require('nodegrass');
var cheerio=require('cheerio');
var todolist=[]; //定义一个数组
try
{
http.get(url,function(body,status,headers){
var $=cheerio.load(body);
$("a").each(function(){var href=$(this).attr("href");
//将该页面中所有的a标签都爬出来,并分别将其中的href值取出来。
todolist.push(href); //将href分别推入数组。
});
say(todolist);
},'utf8');
}
catch(ex)
{
say(ex);
}
function say(word)
{console.log(word);}
2、当需要爬完一个页面中的所有超链接再继续爬取每个超链接页面中的超链接时,就是递归,此时的程序代码需要进行调整,具体如下:
var url=" https://search.jd.com/Search?keyword=%E5%8C%BB%E5%AD%A6&enc=utf-8&wq=%E5%8C%BB%E5%AD%A6&pvid=5d4df2bcfc9d400e8c2b31c57aac3e5c ";
var http=require('nodegrass');
var cheerio=require('cheerio');
var todolist=[];
var index=0;//此处除了定义数组之外,还需要定义一个索引号。
go(url); //执行go函数
function go(url)
{
try
{
http.get(url,function(body,status,headers){
var $=cheerio.load(body);
$("a").each(function(){var href=$(this).attr("href");
todolist.push(href);
});
index+=1; //索引自加1,此命令忽略了索引为0的当前页面,从第二个页面开始爬取。
say("当前页面是:"+url+"这是第"+index+"个链接,队列现在一共有"+todolist.length+"个链接"); //显示整个数组,此时显示的是该页面的所有链接地址。
if(todolist.length>0) //如果todolist里面的内容非空,则跳下一个链接
{go(todolist[index])}; //递归,在go函数中继续执行go函数,从而实现超链接页面中的超链接页面的递归抓取。
},'utf8'); }
catch(ex)
{
say(ex);
index+=1;
go(todolist[index]); //如果前面某个页面执行出错,索引加1,直接执行下一个页面
}
}
function say(word)
{console.log(word);}
四、网络爬虫的实现
在数据获取的过程中,可以根据自身情况修改相应的程序代码,从而实现不同的抓取目的。比如这里想抓取京东上某个出版社在售的书名、价格等信息,则需要选择先将相应的商品链接地址复制到程序中,调用爬虫获取书籍资料。编写程序将批量数据插入数据库保存,然后启动程序执行数据爬取,在整个抓取过程中,数据库会不断更新,直至抓取完毕,如图1所示。
五、结语
随着大数据时代的发展,企业和个人对数据的需求都急剧增加。而如何能快速、跨地域的获取相对准确而又有价值的数据,网络爬虫技术无疑是最适合的方法。同时,随着網络数据的规模化、全面化和及时化发展,基于分布式计算的网络爬虫技术的应用迫在眉睫。网络爬虫技术的应用趋势将出现大规模的分布式系统,网络数据抓取也将日趋多元化、个性化发展[4]。
通过使用网络爬虫,人们可以方便的爬取所需的数据,便于研究分析,从而对未来进行推测或进行某种决策,这在大数据时代下是非常有意义的。但是网络不是法外之地,我们在使用网络爬虫时也需要注意无论是个人使用,还是科学研究和商业用途,必须遵循合法、合规的要求[5],更不要运用网络爬虫去做损人利己的事情。
参考文献
[1]卢江.基于爬虫技术的图书购买推荐与比价策略研究[J].科技资讯,2021(1):214-219.
[2]谢蓉蓉,徐慧等.基于网络爬虫的网页大数据抓取方法仿真[J].计算机仿真,2021,38(6):439-443.
[3]缪治.网络爬虫技术的研究与实现[J].中国新通信,2019.21(6):70.
[4]顾勤.网络爬虫技术原理及其应用研究[J].网络与通信技术,2021(4):174-176.
[5]李文华.解析网络爬虫技术原理[J].福建电脑,2021,37(1):95-96.
作者简介
[1]杜晓春(1982 - ),女,四川绵阳人,西安欧亚学院副教授,研究方向:计算机网络技术与创新人才培养。
[2]陆涛(1999-),男,陕西汉中人,西安欧亚学院通信工程专业2021届毕业生,现就职于陕西安康市石泉县供电分公司。
基金项目
2017年陕西省教育厅项目“大数据时代下网络爬虫技术的研究与应用”(17JK1038)