APP下载

医药科研信息网络抓取方法研究

2017-10-12◆曾

网络安全技术与应用 2017年10期
关键词:关键字网址网页

◆曾 凯

(天津市医药科学研究所联合办 天津 300020)

医药科研信息网络抓取方法研究

◆曾 凯

(天津市医药科学研究所联合办 天津 300020)

本文介绍了医药科研信息抓取系统中用到的数据抓取方法。为了高效地抓取网页内容,该方法采用带偏好的宽度优先遍历方式访问网页,将待访问的网址存放于高效的内存数据库BerKeley DB中,用布隆过滤器过滤已经抓取过的网址。通过Delphi xe7开发系统提供的WebBrowser控件和微软公司的MSHTML组件获取网页文本,将待提取数据文本划分成数据行,将数据行及相应的链接存入到对象数组中,用关键字在对象数组中匹配搜索时可实现精确和模糊搜索两种方式。并利用计算机的多线程技术提高网页抓取速度,利用多核优势带来的并行编程技术提高对网页内容中关键字的搜索速度。以万方医学网和中国知网为实际案例,阐述了数据抓取过程及结果,并提供了简化的Delphi xe7示例程序,结果表明,该方法能有效方便地应用于医药科研信息的采集。

网页内容识别;数据采集;宽度优先遍历算法;内存数据库;布隆过滤器;多线程技术;多核并行编程技术

0 引言

在医药领域中从事科研工作,经常需要从互联网上获取大量的医学及医药方面的信息,服务科研工作。这些信息涉及范围广、更新快,需要科研人员经常从众多的网站中查找,费时费力。如果借助计算机技术,根据他们提供的关键词在其关注的科研网站上自动搜寻相关信息,自动抓取数据,存入数据库,进行加工处理,成为服务医药科研工作的“数据平台”,为医药科研领域实施科学管理和科学研究提供重要的信息资源,就可以为科研工作者分析、利用信息资源进行科学管理、决策和开展大规模、高水平医药研究提供了有力的技术工具。如Butler,Leone,willenborg[1],以及Antweiler与Frank[2]等都利用互联网网页抓取技术获取数据,很好地服务于研究工作。本文详细阐述网页内容抓取的实现技术、验证窗口自动登录的方法和先进的并行编程技术,以详实的编程代码展示实现方法,该方法能简单、方便地获取网上信息资源。此外,简要介绍带偏好的宽度优先遍历算法、布隆过滤器的工作原理、内存数据库的优势及多线程爬虫的结构。

1 互联网数据采集一般过程

互联网数据采集是指利用互联网搜索引擎技术实现有针对性、行业性、精准性的数据抓取,并按照一定规则和筛选标准进行数据归类,并形成数据库文件的一个过程[3]。互联网拥有海量的数据,每日更新得非常快。网页一般由文本、图片、Flash动画、表格、声音等元素组成。网页数据具有分布广、格式多样、非完全结构化或半结构化等大数据的典型特点。因此,在定位和访问网页内某数据项时,需根据网页各元素的特征进行,可通过采集者的分析指引灵活进行[4-5]。数据抓取过程一般包括以下几个步骤:

(1)确定抓取目标网址。先进入关注的网站,找到含有所需数据的网页,判断数据的准确性及抓取的难易程度,避免应用了防采集措施的网站。

(2)仔细分析页面内容及其组织方式,确定抓取规则。由于网页含有的元素和特性的数量十分巨大,除文字信息外,还有大量的页面元素和其它多媒体数据。抓取前须了解网页元素特点,确定所寻找的数据在网页源文件代码中的识别规则。可根据网页源文件代码进行分析。规则是:网址规则;网页各元素的识别规则;数据行。

(3)借助数据抓取软件或编程,依据规则抓取数据。

2 医药科研信息采集系统涉及到的几项关键技术

2.1 网站遍历

对网站的遍历采用的是带偏好的宽度优先遍历方式。

对网站的遍历可分为宽度优先和深度优先遍历两种方式。深度优先遍历在深度遍历子网页时容易陷入“黑洞”。所以本系统采用带偏好的宽度优先遍历。宽度优先遍历(BFS)算法是用分层搜索的方式遍历网页,将网站首页作为起始点,采用层次遍历的方式,逐层访问网页[6]。带偏好的宽度优先遍历算法比传统的宽度优先遍历算法有更高的效率。在访问同一层的网页时,把重要网页的 URL链接地址从队列中“挑”出来优先抓取该网页内容。为了判断该网页是否重要,需要用到链接分析方法。本系统采用的是Google使用的PageRank算法,该算法并不是简单地根据指向网页的链接总数来计算,而是采用了运算法则:

PR(A)=(1-d)+d(PR(T1)/C(T1)+…+PR(Tn)/C(Tn))。

PR(A):网页A的PageRank值;

PR(Ti):链接到A的Ti网页的PageRank值;

C(Ti):网页Ti的出站链接数量;

d:阻尼系数,0

由于本系统访问的网站拥有数量巨大的网页,所以为获得网页的重要性PR(A),使用了近似的计算方法来计算。即给每个网页一个初始值,例如:PR(A)为1,再按照PageRank算法,循环进行有限次运算,得到近似的PR(A)值。

2.2 数据结构

本系统网络爬虫使用最关键的数据结构是非常流行的内存数据库,即Berkeley DB。

网络爬虫要访问的网页链接地址通常存放于队列中,即内存数据结构。当面临的网页链接可能成千上万时,内存数据结构就不适合这些应用了。而本系统使用的内存数据库Berkeley DB可以解决该问题[7-8]。它能存储大量数据,当数据超出内存容量时,能把它存储在硬盘上;存取数据速度非常快;能够支持多线程访问[9-10]。

2.3 使用布隆过滤器构建Visited表

在网络爬虫访问网页时,为了判断该网址是否访问过,需将该网址与 Visited表(即存放访问过的网址)中的网址做比较,如果存在,说明访问过了,就跳过该网址。计算机中的集合Visited表采用哈希表的方式存放。优点是快速,缺点是占用较多的存储空间。如果哈希表巨大,它存储效率低的问题就突显了。而布隆过滤器只需哈希表1/8至1/4的大小就能解决问题[11]。

布隆过滤器是一个很长的二进制向量和一系列随机映射函数。工作原理是,假定Visited表里存储了2亿个网址,先建立一个20亿二进制常量,它们的初始值为0。对于每个网址,用8个不同随机数产生器产生8个信息指纹(f1,f2,…,f8)。再用一个随机数产生器G把这8个信息指纹映射到20亿中的8个二进制位中g1,g2,…,g8。这8个二进制位全部设置为1。所有网址都按此算法存放,节省存储空间的布隆过滤器就建立好了。

布隆过滤器如何判断某网址是否访问过?用8个随机数产生器(F1,F2,…,F8)对这个网址产生8个信息指纹,然后将这8个指纹对应到布隆过滤器的8个二进制位,分别是T1,T2,…,T8。如果网址在Visited表中,则T1,T2,…,T8对应的8个二进制位一定是1。

布隆过滤器的不足之处是它有极小的可能将一个未访问过的网址判断为已访问过了。因为有可能某个网址正巧对应8个都被设置成1的二进制位。不过这种出错的概率为万分之一以下。可以建立一个名单,存储容易误判的网址[12]。

2.4 使用多线程技术提高爬虫的抓取速度

采用多线程并行抓取能同时获得同一个网站的多个网页,能极大地减少抓取网站的时间[13-15]。Delphi中有一个线程类TThread是用来实现多线程编程的。多线程爬虫的结构见图1。

3 医药科研信息采集过程

医药科研人员将需要搜索的信息作为关键字存入关键字数据库中。将他们平常关注的网站的网址存入网址数据库中。如果需关注的网站有用户身份验证需求,就需要将用户名和密码事先存入数据库中,以便自动登录完成验证。网页搜索方式可设定为当前网页搜索和子网页搜索。准备工作做好后,操作时选择关注的网址、需搜索的关键字和网页搜索方式,点击开始。系统会依次进入各网站,进入到网站后获取网页,提取文本,搜索关键字,如果找到了,将关键字所在的语句和相关的链接存入数据库中。显示查看结果时,在界面左则中选择感兴趣的关键字,右则窗口上半部显示含有该关键字的多个标题,点击某个标题,右则下半部就显示该标题所在的网页。结果见图2。

图2 显示搜索结果

3.1 网页源文件内容获取

自动输入用户名和密码,实现网页的自动登录。

在访问含论文及综述类信息资源的网站时,如天津图书馆电子网站、中国知网等,这类网站往往需要用户名及密码。本系统可以找到输入框,将存入数据库中的用户名及密码分别带入到输入框中,完成自动登录。代码如下:

WebBrowser1.OleObject.document.all.item(

“username”,0).value:=’0001’//找到用户名的输入框,输入用户名

WebBrowser1.OleObject.document.all.item(

“password”,0).value:=’AAAA’//找到密码的输入框,输入密码

3.2 下载网页内容并解析

目前网站开发技术很多,网页格式因此各不相同,如流行的格式有html、xml、asp、jsp等,但无论如何,它们都是通过HTTP协议将数据传输到客户浏览器的。

获取网页源文件内容的过程是,先实现对网页的下载,再解析网页。本系统在 Delphi xe7应用程序开发环境中调用WebBrowser 控件实现网页信息的获取功能,达到下载目的。通过 WebBrowser 控件的 Document文档接口对象实现对网页的解析,方法简单实用,分以下几个步骤:(1)创建WebBrowser 控件;(2)通过控件方法Navigate连接到指定的网址;(3)通过控件属性Document获取对控件内显示网页的访问途径。(4)通过as将 WebBrowser.Document转换为 Ihtmldocument2接口类型,用Ihtmldocument2接口访问网页Html的源文件文本。因为MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素.Ihtmldocument2接口是 MSHTML里的一个对象,用Ihtmldocument2的InnerHTML属性可以获得网页源文件内容。

例如,下述为基于Delphi用于读取网页源文件的部分代码。它返回指定网页源文件文本。

WebBrowser1.Navigate(Trim(Edit4.Text));//用 WebBrowser控件打开网页,Edit4.Text指定网址

str_html:=(webBrowser1.Document as IHtmlDocument2).Body.innerHTML;//将网页内容存入str_html字符串变量中。

3.3 判断网页中是否含有所需的关键字

通过查找关键字,判断网页中是否含有所需要的内容,有两种方法可以实现。(1)采用正则表达式,搜索关键字。优点:善于捕获字符串,尤其是匹配url,email这种纯文本的字符。缺点:只适合匹配文本字面,不适合匹配文本意义;贪婪匹配符号很容易造成大量的回溯,性能有时候会有上百万倍的下降;正则的替换功能较差:甚至没有基本的截取字符串或者把首字母改变大小写的功能。该方法用于在不常用的网站中搜索内容。(2)通过自编的代码实现类似的功能,在特定的环境中具有针对性、实用性和灵活性。该方法用于在常用的网站中搜索内容。

(1)为了采用正则表达式,在Delphi中使用第三方正则组件PerlRegEx。

部分代码:

Uses PerlRegEx;

………

RegEx := TPerlRegEx;

Try

RegEx.Subject := str_html;// str_html 存放网页源文件内容。

RegEx.RegEx :=’分子靶向|儿童食道|结直肠肿瘤’;

if RegEx.Match then ....

finally

RegEx.free

end;

有时想获取网页中符合特定格式的链接,用正则表达式实现的效果最好。

图1 多线程爬虫的结构

想捕获的链接是“ ”

正则表达式为:<[aA] s+ [hH] [rR] [eE] [fF]=s*(“|’)?(.*)(1)(s[^>]*)*?>(.*?)< /[aA]>

(2)通过自编的代码实现类似的功能。从源文件内容中去除代码,提取文字内容。

例如为了从医学文献网站上搜寻相关的信息,就要在获取源文件内容后,对数据进行提取并解析。源文件代码中经常会包含、、、等标签,文字内容会显示在一对标签的中间,如。“儿童食道异物的治疗策略”是带有链接的文本,该文本的前面有一个标识是“>”,可以作为执行提取文本操作的开始标识,后面有一个“<”,可作为结束标识。获得文本后,还需要获得相关链接。该文本前面的“href="”可作为链接地址的开始标识,链接地址后面的“"”可作为链接地址的结束标识,从而提取完整的链接地址。将文本和链接地址分别存入到对象数组中,以便查寻结果时使用。见图3,图4。

图3 万方医学网首页

图4 首页部分源代码

声名类TKey_Link,存放文本和链接地址

TKey_Link=class(Tpersistent)

public

Fkey:string; 存放文本

FLink:string; 存放该文本的链接地址

end;

用函数 GetKey_Link提取文本和链接地址,存入对象数组FGroupKey_Link中。该函数用到了pos函数,pos的功能是得到子串在父串中第一次出现的位置,用pos分别获得开始标识“>”和结束标识“<”的位置,这两个位置中间的内容就是文本内容。代码如下:

Function TForm1.GetKey_Link(webBrowser:TwebBrowser) :TObjectList;

var

……

FGroupKey_Link:TObjectList; //定义对象数组

FKey_Link:TKey_Link;

begin

FGroupKey_Link:=TObjectList.Create;//定义对象数组

str_html:=(webBrowser.Document as IHtmlDocument2).Body.innerHTML;//将网页源文件内容存入str_html字符串变量中。

p1:=pos('>',str_html);//获得开始标识的位置

while (p1>0) do

begin

str_front:=copy(str_html,1,p1);//获得开始标识之前的内容,含标识符

str_html:=copy(str_html,p1+1,length(str_html)-p1);获得开始标识之后的内容

if (copy(str_html,1,4)='',str_html);

str_html:=copy(str_html,p5+Length('-->'),Length(str_html)-(p5+Length('-->')-1));

end;

p2:=pos('<',str_html);获得结束标识的位置

str_chart:=trim(copy(str_html,1,p2-1));截取两标识之间的文本内容

if (length(str_chart)>0) then

begin

FKey_Link:=Tkey_Link.Create;

strPress:='';

for j:=1 to Length(str_chart) do

strPress:=strPress+trim(copy(str_chart,j,1));

str_chart:=strPress;

FKey_Link.Fkey:=str_chart;将截取的文本内容存入对象的属性Fkey中。

str_Link:='';

p3:=pos('href="',str_front);//该文本如果含链接地址,就将地址存入str_Link中

if(p3>0) then

begin

str_front:=copy(str_front,p3+Length('href="'),Length(str_front)-(p 3+Length('href="'))+1);

p4:=pos('"',str_front);

if (p4>0) then

begin

str_Link:=copy(str_front,1,p4-1);

end;

end;

if (Length(trim(str_Link))>0) then

begin

……去掉地址中无用的字符。

FKey_Link.FLink:=str_Link;将地址存入对象的属性Flink中

end;

FGroupKey_Link.Add(FKey_Link);//将对象存入对象数组

end;

str_html:=copy(str_html,p2+1,length(str_html)-p2);//截取结束标识之后的文本,以便继续搜索

p1:=pos('>',str_html);

end;

Result:=FGroupKey_Link;

end;

(3)利用计算机的多核优势,在提取的文字内容中以并行方式搜索关键字,提取所需数据。

获得网页文本后,根据定义的关键字,对网页文本进行匹配搜索以提取所需数据。

定义FKeyName为字符串数组,存放关键字,如FKeyName[0]:='分子靶向'; FKeyName [1]:='儿童食道';……FKeyName [7]:=’结直肠肿瘤' 。"

将FkeyName数组的元素分别带入到isExist函数中,用isExist函数在存放网页文字内容的对象数组FGroup中遍历查询关键字,若找到,返回真,将含有关键字的语句和链接地址存入数据库中[16]。

本系统在isExist函数中采用了先进的并行编程技术。现在计算机都有多个 CPU单元,在开发中利用多核优势进行并行编程[17-18],可以节约系统的运行时间,提高工作效率[19-20]。在Delphi xe7中,有一个简化并行运行任务的库,叫做并行编程库。并行编程库在System.Threading单元中,其中提供了很多有用的特性。使用并行库,应把for循环用类函数TParallel.For替代,并传递一个匿名方法[21]。

关键代码如下:function

TForm1.isExist(str:string;webBrowser:TMozillaBrowser;isAll:Boolean=true):Boolean;

var

i,j:integer;

FGroup:TObjectList;

isExist:Boolean;

begin

isExist:=false;

FGroup:=GetKey_Link(webBrowser);//从网页中获取文本内容,存入对象数组中

TParallel.For(1,FGroup.Count-1,procedure(I: Integer)//在数组中做关键字的遍历查询,找到返回真

begin

if (isAll=true) then

begin

if (str=TKey_Link(FGroup[i]).Fkey) then//完全匹配

begin

isExist:=true;

break;

end;

end

else

begin

if (pos(str,TKey_Link(FGroup[i]).Fkey)>0) then//部分匹配

begin

isExist:=true;

break;

end;

end;

end);

FreeAndNil(FGroup);

Result:=isExist;

end;

4 结束语

医药科学研究的一个关键环节是数据获取。互联网蕴含的海量数据具有免费、实时等特点,是重要的数据来源渠道。本文介绍的数据抓取技术,可有效从互联网大量的信息中找到所需信息收集起来以供研究。所提供的Delhpi xe7示例代码简单、实用,可使人们依据需要,便捷准确地定制抓取方案,成为数据获取的得力助手。

[1]Marty Butler,Andrew J Leone,Michael Willenborg.An empirical analysis of auditor reporting and its association with abnormal accruals[J].Journal of Accounting and Economics,2004.

[2]Werner Antweiler,Murray Z Frank.Is all that talk just noise?The information content of Internet stock message boards[J].Journal of Finance,2004.

[3]杨铠懋.搜索引擎的研究与设计[D].电子科技大学,2010

[4]周立柱,林玲.聚焦爬虫技术研究综述[J].计算机应用,2005.

[5]刘金红,陆余良.主题网络爬虫研究综述[J].计算机应用研究,2007.

[6]李浩.网络蜘蛛的研究与实现[J].科技信息,2012.

[7]万玛宁,关永,韩相军.嵌入式数据库典型技术SQLite与BerKeley DB的研究[J].微计算机信息,2006.

[8]宋丽娜.嵌入式数据库典型技术-SQLite和BerKeley DB的研究[J].科技信息(学术研究),2008.

[9]虞珊,周彩兰,郭凤玲.BerKeley DB在网络信息挖掘中的应用[J].计算机与现代代,2008.

[10]刘巍巍,徐成,李仁发.嵌入式数据库Berkeley DB的原理与应用[J].科学技术与工程,2005.

[11]徐娜,刘四维,汪翔,倪卫明.基于Bloom Filter的网页去重算法[J].微型电脑应用,2011.

[12]于振国.基于Bloom Filter的大规模网页去重策略研究[J].现代图书情报技术,2008.

[13]李建宏,何玉珠.多线程技术在复杂数据采集系统中的应用.电子测量技术,2008.

[14]眭俊华,刘慧娜,王建鑫等.多核多线程技术综述[J].计算机应用,2013.

[15]李鹏.多线程技术在数据通信中的应用[J].信息产业,2013.

[16]卢超,梅卫峰,陈俊良等.基于感兴趣度的WWW个性化信息发现[J].计算机科学,2002.

[17]吴继燕.多核技术及发展趋势[J].哈尔滨轴承,2007.

[18]李晓明,王韬,刘东,杜江凌.走进多核时代[J].计算机科学与探索,2008.

[19]周伟明.多核计算与程序设计[M].武汉:华中科技大学出版社,2008.

[20]Akhter S.多核程序设计技术[M].李宝峰,译.北京:电子工业出版社,2008.

[21]多核系列教材编写组.多核程序设计[M].北京:清华大学出版社,2007.

猜你喜欢

关键字网址网页
履职尽责求实效 真抓实干勇作为——十个关键字,盘点江苏统战的2021
本刊网址变更通知
基于HTML5与CSS3的网页设计技术研究
火眼金睛快速显示链接的网址
成功避开“关键字”
基于CSS的网页导航栏的设计
基于HTML5静态网页设计
基于URL和网页类型的网页信息采集研究
本刊关于网址的郑重申明
本刊关于网址的郑重申明