蔣輝 謝云潔
摘要:在數(shù)據(jù)爆炸的時(shí)代,人們通過搜索引擎從網(wǎng)上來查找自己所需要的數(shù)據(jù)。但并不是所有的網(wǎng)站都提供所需要的數(shù)據(jù)下載。網(wǎng)絡(luò)爬蟲技術(shù)可以將查找到的數(shù)據(jù)抓取下來,以供研究人員研究使用。Scrapy是使用Python語言開發(fā)開源的爬蟲框架。該文將利用Scrapy框架和Python語言設(shè)計(jì)和實(shí)現(xiàn)一個(gè)TarBase V8網(wǎng)站爬蟲,對(duì)其網(wǎng)站miRNA靶基因數(shù)據(jù)進(jìn)行獲取以及存儲(chǔ)。
關(guān)鍵詞:Scrapy;網(wǎng)絡(luò)爬蟲;搜索引擎;信息檢索;miRNA靶基因
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)20-0020-03
Design and Implementation of Web Crawler on rrarBase V 8 Web Site Based in Python
JIANG Hui, XIE Yun-jie
(School of Computer Science. University of South C.hina, Hengyang 421001, China)
Abstract: In the era of data explosion, we can get the information or data from the internet by using search engines. But not all web-sites provide the data downloads we need. These data can be captured from the internet for the researching purpose by using webcrawler technology. Scrapy is an open source web crawler framework which is developed by Python. In the paper, we design and de-velop a web crawler which is based on Scrapy framework and Python f'or capturing the miRNA targets data from the TarBase V8website.
Key words: scrapy; web crawler; search engine; information retrieval; miRNA targets
1背景
miRNA是一類非編碼的小分子RNA,其在生命活動(dòng)起著重要的作用。越來越多的研究表明miRNA與疾病的產(chǎn)生與發(fā)展有著重要的關(guān)系[1]。其機(jī)理是miRNA綁定到其靶基因上,使得靶基因降解或者翻譯抑制,致使該基因?qū)?yīng)的蛋白表達(dá)異常,從而導(dǎo)致疾病。在研究miRNA的過程中,生物學(xué)實(shí)驗(yàn)已經(jīng)證實(shí)了非常多的miRNA靶基因信息,并以論文的方式發(fā)表。也有生物信息學(xué)的研究人員通過文獻(xiàn)挖掘的方法將分布在這些發(fā)表在論文中的miRNA靶基因信息挖掘出來,并建立了完善的數(shù)據(jù)庫供相關(guān)人員查詢或下載。TarBase就是其中之一,但由于TarBase V8[2]的數(shù)據(jù)庫其官網(wǎng)只提供查詢和部分信息下載,因此要獲取這些數(shù)據(jù)就變得比較困難。網(wǎng)絡(luò)爬蟲技術(shù)可以從網(wǎng)貞上獲取用戶指定的信息,因此本文使用Python語言設(shè)計(jì)和實(shí)現(xiàn)了網(wǎng)絡(luò)爬蟲來獲取這些數(shù)據(jù)。
2 Scrapy框架簡介
Scrapy[3]是Scrapinghub公司開發(fā)的開源的網(wǎng)站爬蟲應(yīng)用框架,該框架基于Twistid異步網(wǎng)絡(luò)框架,使用Python語言開發(fā)。Scrapy以其開源性及優(yōu)秀的系統(tǒng)架構(gòu)獲得了廣泛的應(yīng)用。Scrapy組件間的低耦合性,極易擴(kuò)展性和組件的可定制開發(fā)性,使其可以靈活的完成各種需求。除爬蟲外,Scrapy框架還應(yīng)用在數(shù)據(jù)挖掘、信息處理、存儲(chǔ)歷史數(shù)據(jù)等方面。
Scrapy框架由引擎、調(diào)度器、爬蟲、項(xiàng)目管道、下載器中間件、下載器、爬蟲中間件等組件構(gòu)成。引擎負(fù)責(zé)數(shù)據(jù)和信號(hào)在不同組件間的傳遞;調(diào)度器是一個(gè)隊(duì)列,用來儲(chǔ)存請(qǐng)求的URL;爬蟲負(fù)責(zé)定義爬取的動(dòng)作及分析網(wǎng)頁;項(xiàng)目管道處理引擎?zhèn)鬟^來的數(shù)據(jù),如保存,查重和驗(yàn)證數(shù)據(jù);下載器中間件處理從引擎和下載器之間的數(shù)據(jù)傳遞;下載器負(fù)責(zé)從網(wǎng)絡(luò)上下載引擎?zhèn)鬟^來的請(qǐng)求;爬蟲中間件負(fù)責(zé)處理發(fā)送給爬蟲組件的Response及爬蟲組件產(chǎn)生的Item和Request。其框架的結(jié)構(gòu)圖如圖l所示。
3基于python的TarBase V8網(wǎng)站爬蟲設(shè)計(jì)與實(shí)現(xiàn)
大數(shù)據(jù)時(shí)代的到來,使得人們淹沒在數(shù)據(jù)的海洋,這些數(shù)據(jù)中蘊(yùn)含著大量的信息。對(duì)這些數(shù)據(jù)的深入研究可以發(fā)現(xiàn)更多有用的知識(shí)。網(wǎng)絡(luò)爬蟲技術(shù)可以從網(wǎng)絡(luò)上自動(dòng)的下載所需要的數(shù)據(jù)。本文設(shè)計(jì)了一個(gè)基于Scrapy框架的TarBase V8網(wǎng)站爬蟲,獲取其miRNA靶基因數(shù)據(jù)。
3.1需求分析
TarBase V8網(wǎng)站上記錄了每一對(duì)miRNA靶基因的所屬物種、驗(yàn)證這miRNA靶基因?qū)Φ纳飳?shí)驗(yàn)種類、支持文獻(xiàn)的PuLMed ID以及靶位點(diǎn)信息。將人類的miRNA名字“hsa-let-7a-5p”提交到網(wǎng)站的查詢頁面,服務(wù)器生成了URL用來查詢?cè)搈iRNA的靶基因,其結(jié)果網(wǎng)頁如圖2所示。
我們所需要的數(shù)據(jù)可以分為四個(gè)類型:第一,miRNA靶基因信息簡表,它描述miRNA靶基因?qū)Φ膍iRNA名字、基因名、支持文獻(xiàn)篇數(shù)以及用來實(shí)驗(yàn)的Cell lines、Tissues數(shù)目等數(shù)據(jù);第二,miRNA靶基因信息詳表,它描述每對(duì)miRNA靶基因的實(shí)驗(yàn)細(xì)節(jié),如具體的文獻(xiàn)、用來驗(yàn)證的生物學(xué)實(shí)驗(yàn)方法等;第三,miRNA靶基因綁定位點(diǎn)信息表,它描述miRNA靶基因?qū)χg的綁定細(xì)節(jié)。如具體的綁定位置、實(shí)驗(yàn)方法等;第四,統(tǒng)計(jì)信息表,它描述此miRNA查詢后的統(tǒng)計(jì)結(jié)果。
通過對(duì)服務(wù)器返回的html腳本的分析,前三類關(guān)系都是在同一個(gè)table標(biāo)簽里面,在
里面的結(jié)點(diǎn)包含了miRNA靶基因關(guān)系簡表信息,后面的里構(gòu)建了一個(gè)table保存miRNA和與之對(duì)應(yīng)的基因的實(shí)驗(yàn)細(xì)節(jié),第三類型數(shù)據(jù)位于第二個(gè)table下面的子節(jié)點(diǎn)table()。由以上分析得出,根據(jù)標(biāo)簽的class屬性可以區(qū)分所需數(shù)據(jù)類型。統(tǒng)計(jì)表則在另一個(gè)diy中,可以用來獲取。
TarBaseV8中的所使用的miRNA名字來源于miRNA信息數(shù)據(jù)庫miRBase[4](21版)。該數(shù)據(jù)庫中共有2588條人類的miRNA成熟體信息,可以每次獲取一個(gè)miRNA靶基因數(shù)據(jù),然后循環(huán)2588次,就能將該數(shù)據(jù)庫中miRNA靶基因信息全部獲取出來,并保存在數(shù)據(jù)庫中。
3.2系統(tǒng)設(shè)計(jì)
3.2.1系統(tǒng)架構(gòu)及其類的設(shè)計(jì)
根據(jù)需求,并結(jié)合SCrapy框架,此爬蟲分為兩個(gè)主要的模塊:數(shù)據(jù)獲取模塊和數(shù)據(jù)存儲(chǔ)模塊。其整體的結(jié)構(gòu)如圖3所示。
這樣設(shè)計(jì)使得模塊之間功能獨(dú)立相互獨(dú)立,降低了模塊間的耦合性。數(shù)據(jù)庫用來保存從網(wǎng)頁上獲取的數(shù)據(jù),隨機(jī)User-Agent和動(dòng)態(tài)IP代理池解決了網(wǎng)站反爬蟲的問題。
圖4為系統(tǒng)的類圖,其中g(shù)etmiRNACount類為獲得統(tǒng)計(jì)信息表結(jié)果的類,ltem是一個(gè)字典類型,用于保存從網(wǎng)頁中解析到的統(tǒng)計(jì)信息結(jié)果;在search方法中解析網(wǎng)頁,其他的一些方法用于數(shù)據(jù)庫的操作。TarBase.py.Tarbase類用于爬取miRNA靶基因信息簡表,在start_requests方法中構(gòu)造請(qǐng)求URL,在parse方法中解析獲取網(wǎng)頁中的數(shù)據(jù)。Spilder.get_second_third.py.TarhaseSpilder類用于爬取miRNA靶基因?qū)π畔⒃敱硪约敖壎ㄐ畔⒈?,在start_requests方法中根據(jù)在簡表中已經(jīng)獲取到的miRNA名和基因名構(gòu)造請(qǐng)求URL,在parse方法中解析獲取網(wǎng)頁中的數(shù)據(jù)。Item類型的類用于保存結(jié)構(gòu)性數(shù)據(jù),Tmiddler-wares.py.ProxyMiddleware類是一個(gè)下載器中間件,用于設(shè)置代理IP。
3.2.2數(shù)據(jù)庫的設(shè)計(jì)
根據(jù)上面對(duì)需求和網(wǎng)頁結(jié)構(gòu)的分析,可以創(chuàng)建四個(gè)實(shí)體類,分別是mirna_info(miRNA靶基因信息簡要信息),through-put_experiments(miRNA靶基因信息詳細(xì)信息),binding_site(miRNA靶基因綁定位點(diǎn)信息),mirna_count(統(tǒng)計(jì)信息),數(shù)據(jù)庫的物理模型,如圖5所示。
由于TarBase V8中的miRNA靶基因?qū)?shù)據(jù)量比較大,會(huì)使得數(shù)據(jù)表中的數(shù)據(jù)非常多,從而導(dǎo)致查詢速度變慢。而查詢的主要關(guān)鍵詞為MiRNA名稱和基因名稱,因此為所有表的miR-NA name和gene_name屬性創(chuàng)建了索引。由于一個(gè)miRNA靶基因?qū)τ写笥诘扔谝粭l詳情,以及大于等于一條綁定位點(diǎn)信息,所以其基數(shù)比約束都為1:n。
3.2.3遇到的問題及其解決方案
在系統(tǒng)的設(shè)計(jì)中要遇到如下4個(gè)問題。
1)爬蟲獲取網(wǎng)頁數(shù)據(jù)時(shí)無法建立前三個(gè)表數(shù)據(jù)之間關(guān)聯(lián)
由于TarBase V8網(wǎng)站網(wǎng)頁結(jié)構(gòu)的限制,以及爬蟲的并發(fā)操作等原因使得簡表數(shù)據(jù)與詳細(xì)表的數(shù)據(jù)以及綁定表數(shù)據(jù)之間沒有關(guān)聯(lián)。因此爬蟲所獲得的數(shù)據(jù)就是散亂的、相互之間沒有關(guān)系可循的。
為了解決這個(gè)問題,本文在設(shè)計(jì)了一個(gè)分步獲取數(shù)據(jù)的方法,先獲取所有miRNA靶基因信息簡表的數(shù)據(jù),為每一對(duì)miR-NA靶基因在數(shù)據(jù)表中生成唯一id號(hào)。這樣就可以根據(jù)簡表中的每對(duì)miRNA名和Gene名來構(gòu)造相應(yīng)的請(qǐng)求URL,來獲取miRNA靶基因信息詳表和miRNA靶基因綁定位點(diǎn)信息表的數(shù)據(jù),通過每個(gè)miRNA靶基因?qū)Φ奈ㄒ籭d就可以關(guān)聯(lián)這三張表中的數(shù)據(jù)。
其偽代碼如下:
BECIN:
//循環(huán)從已知miRNA名列表中得到miRNA名稱;
Foreach miRNA_name in miRNA_list(已知數(shù)據(jù)miRNA名列表)
URL=generate url for miRNA_name;
//根據(jù)miRNA名生成的URL請(qǐng)求爬取網(wǎng)頁數(shù)據(jù);
Html=spider(“URL”);
//將從網(wǎng)頁中篩選出所需要的信息并保存進(jìn)數(shù)據(jù)庫表;
Save(Find the data in Html);
//循環(huán)從第一次保存的數(shù)據(jù)表中得到miRNA名和基因名;
roreach miRNA-gene pair in miRNA_info(簡表)
//根據(jù)miRNA名和基因名再次生成請(qǐng)求URL;
URL=generate url for miRNA_name and Gene_name;
Html= spider(“URL”);
Sava(Find the data in Html);
END
2)無法為抓取統(tǒng)計(jì)數(shù)據(jù)頁面構(gòu)造URL
由于統(tǒng)計(jì)數(shù)據(jù)以ajax異步請(qǐng)求的方式獲得的,因此對(duì)獲取miRNA的統(tǒng)計(jì)數(shù)據(jù)帶來了一定的麻煩。對(duì)所抓得的統(tǒng)計(jì)數(shù)據(jù)進(jìn)行分析發(fā)現(xiàn),其URL的請(qǐng)求參數(shù)是一條sql語句,該語句中查詢條件是一串無規(guī)律的數(shù)字,這使得請(qǐng)求的URL構(gòu)造困難。為了解決這個(gè)問題,本文使用selenium和Webdriver[5]來模擬人操作瀏覽器的方式獲取ajax請(qǐng)求返回的數(shù)據(jù)。
Selenium是ThoughtWorks專門為Web應(yīng)用程序編寫的運(yùn)行在瀏覽器上的Web測試工具,它能夠像人操作瀏覽器那樣模擬操作瀏覽器。Wehdriver是基于selenium設(shè)計(jì)的操作瀏覽器的一套API,它針對(duì)不同語言有對(duì)應(yīng)的實(shí)現(xiàn)。
3)爬取數(shù)據(jù)時(shí)的翻頁
在查詢結(jié)果數(shù)據(jù)量大的情況下,TarBase V8網(wǎng)站會(huì)分頁展示結(jié)果。本文將采用遞歸的方式來做分頁請(qǐng)求并解析數(shù)據(jù)。
4)反反爬蟲技術(shù)
TarBase V8網(wǎng)站設(shè)置了反爬蟲機(jī)制來保證網(wǎng)站的正常運(yùn)行。,本文采用IP代理和設(shè)置隨機(jī)User-Agent來解決這個(gè)問題.lP代理設(shè)置是在爬蟲外部構(gòu)建一個(gè)動(dòng)態(tài)代理lP池,其能不斷的從網(wǎng)上獲取免費(fèi)的可以使用的代理IP,并定時(shí)更新動(dòng)態(tài)池中的數(shù)據(jù),然后將這些IP存人Redis數(shù)據(jù)庫中;隨機(jī)User-Agent的設(shè)置通過Python的第三方庫fake-useragent來生成。
為了讓此網(wǎng)站不發(fā)現(xiàn)是爬蟲程序在訪問,我們降低Scrapy框架中的并發(fā)數(shù)量并設(shè)置為10個(gè)。
4爬蟲的實(shí)現(xiàn)
本系統(tǒng)采用Python3.7,Selenium 3.141.0,Chromedriver和SCrapyl.6.0,Mysql 8.0來實(shí)現(xiàn)。
基于Scrapy框架的可定制性和易擴(kuò)展性,根據(jù)對(duì)系統(tǒng)的需求分析,需要?jiǎng)?chuàng)建暫存爬取數(shù)據(jù)的Item組件,實(shí)現(xiàn)spider組件,用于構(gòu)造請(qǐng)求的URL并調(diào)用parse方法解析請(qǐng)求返回的數(shù)據(jù),并將其暫存到Item中,經(jīng)引擎通過項(xiàng)目管道保存到數(shù)據(jù)庫中。隨后在scrapy框架的下載器中間件組件中,創(chuàng)建ProxyMiddle-ware類和RandomUserAgentMiddleware類,用以設(shè)置IP代埋和設(shè)置隨機(jī)User-Agent,創(chuàng)建getmiRNACount類。用selenium和webdriver來獲取通過ajax返回的統(tǒng)計(jì)結(jié)果的數(shù)據(jù);最后在pipe-line組件中實(shí)現(xiàn)數(shù)據(jù)的持久化。
5結(jié)束語
本文在分析TarBase V8網(wǎng)站網(wǎng)頁結(jié)構(gòu)的基礎(chǔ)上,使用py-thon語言和Scrapy框架設(shè)計(jì)與實(shí)現(xiàn)了TarBase V8網(wǎng)站數(shù)據(jù)爬蟲。針對(duì)網(wǎng)頁中各表數(shù)據(jù)之間無關(guān)聯(lián)性的問題,設(shè)計(jì)了分兩步獲取的方法來解決,即先獲取簡表信息,再根據(jù)簡表中的數(shù)據(jù)生成相應(yīng)的請(qǐng)求URL獲取詳表及綁定表的信息;針對(duì)ajax網(wǎng)頁局部渲染更新的問題,使用了selenium加無頭的chromedriver來解決;針對(duì)網(wǎng)站反爬蟲機(jī)制的問題,使用了隨機(jī)User-Agent和IP代理的方式來解決。本爬蟲在網(wǎng)絡(luò)狀態(tài)良好的情況下,爬取2588條miRNA的數(shù)據(jù)需要60多小時(shí),共爬取數(shù)據(jù)約100多萬條。
參考文獻(xiàn)
[1] Huang Y, Shen X J, Zou Q, et al. Biological functions of mi-croRNAs:a review[J]. Journal of Physiology and Biochemistry,2011, 67(1): 129-139.
[2] Karagkouni D. Paraskevopoulou M D, Chatzopoulos S. et al.DIAhrA-TarBase v8:a decade-long collecticm of experimental-ly supported miRNA ~ gene interactions[J]. Nucleic Acids Re-search. 2018, 46(DI): D239-D245.
[3]崔慶才.Python 3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)[M].北京:人民郵電出版社,2018.
[4] Kozomara A,Criffiths-Jones S.MiRBase:annotating high confi-dence microRNAs using deep sequencing data[J].Nucleic Ac-ids Research. 2014. 42(D1): D68-D73.
[5]時(shí)永坤.基于WehDriver的定向網(wǎng)絡(luò)爬蟲設(shè)計(jì)與實(shí)現(xiàn)[J].軟件,2016, 37(9): 94-97.
【通聯(lián)編輯:謝媛媛】
收稿日期:2020-05-08
基金項(xiàng)目:湖南省教育廳科研課題(項(xiàng)目編號(hào):17C1377)
作者簡介:蔣輝(1981-),男,湖南衡陽人,講師,碩士,主要研究方向?yàn)樯镄畔W(xué)、信息檢索與知識(shí)發(fā)現(xiàn)、軟件工程;謝云潔(1996一),男,學(xué)士。