鄭鑫臻,吳韶波
(北京信息科技大學(xué),北京 100101)
時(shí)令旅游以隨氣候的季節(jié)變化而呈現(xiàn)明顯季相性特征的旅游資源為觀賞、娛樂(lè)對(duì)象,如春季賞花、秋季觀紅葉等[1]。常規(guī)時(shí)令旅游信息獲取主要基于歷史物候觀測(cè)數(shù)據(jù),首先根據(jù)空間位置、氣溫、降水等數(shù)據(jù),預(yù)測(cè)新一年觀賞花花期,然后通過(guò)物候觀測(cè)站點(diǎn)驗(yàn)證調(diào)整。物候數(shù)據(jù)一般從紙質(zhì)版《中國(guó)自然歷選編》《中國(guó)自然歷續(xù)編》《自然物候觀測(cè)年報(bào)》中選取,經(jīng)過(guò)人工錄入、校對(duì),轉(zhuǎn)化為電子表格資料,再進(jìn)行相關(guān)分析研究,不僅耗費(fèi)巨大的人力、物力和時(shí)間,而且難以滿(mǎn)足時(shí)令旅游活動(dòng)開(kāi)展的需求[2,3]。此外,植物生長(zhǎng)時(shí)令對(duì)氣候變化敏感,準(zhǔn)確預(yù)測(cè)花期成為了時(shí)令旅游首要解決的難題[4]。
隨著互聯(lián)網(wǎng)的普及,海量的互聯(lián)網(wǎng)數(shù)據(jù)蘊(yùn)含了大量的時(shí)令旅游信息。網(wǎng)絡(luò)爬蟲(chóng)(Web Crawler)技術(shù)是快速獲取時(shí)令旅游相關(guān)信息的全新手段[5]。本文在概述網(wǎng)絡(luò)爬蟲(chóng)關(guān)鍵技術(shù)的基礎(chǔ)上,以四川省桃花花期為研究對(duì)象,進(jìn)行了基于網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的時(shí)令旅游信息獲取案例實(shí)現(xiàn)。
Python語(yǔ)言是一種功能強(qiáng)大、語(yǔ)法簡(jiǎn)潔清晰的開(kāi)源編程語(yǔ)言,幾乎能在目前所有的操作系統(tǒng)上運(yùn)行。Python具有的豐富的標(biāo)準(zhǔn)庫(kù)和強(qiáng)大的第三方庫(kù)使其在爬蟲(chóng)開(kāi)發(fā)中具有非常明顯的優(yōu)勢(shì):當(dāng)模擬瀏覽器行為訪問(wèn)網(wǎng)站時(shí),Python的抓取接口比其他語(yǔ)言(如Java,C,C++等)更簡(jiǎn)潔;Python的requests庫(kù)能簡(jiǎn)潔高效地提取出網(wǎng)頁(yè)的HTML信息,Requests提供了HTTP所有的基本請(qǐng)求方式,如Post,Put,Delete,Head和Options等,在網(wǎng)絡(luò)爬蟲(chóng)中用于獲取網(wǎng)頁(yè)的HTML信息;Python提供的lxml庫(kù)能用簡(jiǎn)潔的代碼解析HTML標(biāo)簽,用于將可能不合法的HTML解析為統(tǒng)一格式,查找、定位標(biāo)簽,訪問(wèn)標(biāo)簽屬性、文本內(nèi)容等,完成文本提取工作[6]。
通用的網(wǎng)絡(luò)爬蟲(chóng)框架結(jié)構(gòu)如圖1所示。

圖1 通用的網(wǎng)絡(luò)爬蟲(chóng)框架結(jié)構(gòu)
網(wǎng)絡(luò)爬蟲(chóng)的基本工作流程如下[7]:
(1)選取合適的起始URL,放入待爬取URL隊(duì)列;
(2)從待爬取URL隊(duì)列中取出URL,由網(wǎng)頁(yè)下載模塊下載URL對(duì)應(yīng)的網(wǎng)頁(yè)HTML,傳遞給數(shù)據(jù)解析模塊,再將下載過(guò)的URL放進(jìn)已爬取URL隊(duì)列;
(3)數(shù)據(jù)解析模塊解析收到的HTML,查找標(biāo)簽,提取出標(biāo)簽內(nèi)所需數(shù)據(jù),傳遞至數(shù)據(jù)清洗模塊,再將提取出的下一層URL傳遞至URL調(diào)度模塊;
(4)URL調(diào)度模塊收到數(shù)據(jù)解析模塊傳遞過(guò)來(lái)的URL后,將其和已抓取的URL隊(duì)列比較,進(jìn)行去重處理,舍棄已爬取過(guò)的URL,將未爬取過(guò)的URL放入待爬取URL隊(duì)列;
(5)網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)在(2)~(4)步循環(huán),直到待爬取隊(duì)列中的URL全部爬取完畢,或者用戶(hù)終止爬蟲(chóng)系統(tǒng);
(6)數(shù)據(jù)清洗模塊發(fā)現(xiàn)并糾正數(shù)據(jù)文件中可識(shí)別的錯(cuò)誤,最終將數(shù)據(jù)存入數(shù)據(jù)庫(kù)。
四川省時(shí)令旅游開(kāi)展歷史悠久,其中桃花賞花旅游具有廣泛的群眾基礎(chǔ)[8]。媒體報(bào)道中對(duì)其有著豐富的歷史信息,從而降低了時(shí)令旅游信息獲取的難度,同時(shí)可將其與往年物候觀測(cè)記錄進(jìn)行比較,即可驗(yàn)證所獲取信息的準(zhǔn)確性。因此,本文以四川省桃花賞花旅游為研究對(duì)象,通過(guò)網(wǎng)絡(luò)爬蟲(chóng)技術(shù)獲取時(shí)令旅游信息。
因?yàn)闀r(shí)令旅游對(duì)數(shù)據(jù)敏感,所以準(zhǔn)確性是時(shí)令旅游信息獲取首要考慮的問(wèn)題。因此,本文選取的時(shí)令旅游數(shù)據(jù)源為四川省當(dāng)?shù)刂堎|(zhì)媒體,如《成都商報(bào)》《華西都市報(bào)》《四川日?qǐng)?bào)》和《天府早報(bào)》等;知名門(mén)戶(hù)網(wǎng)站,如四川新聞、新浪和搜狐等;知名旅游網(wǎng)站,如攜程、去哪兒、螞蜂窩和驢媽媽等。
本文以爬取《天府早報(bào)》正文為案例,詳述通過(guò)網(wǎng)絡(luò)爬蟲(chóng)技術(shù)獲取時(shí)令旅游信息的過(guò)程與方法。
《天府早報(bào)》的首頁(yè)網(wǎng)址為https://e.thecover.cn/shtml/index_tfzb.shtml,該網(wǎng)站不具有特殊性,如果以此為起始URL,需要通過(guò)爬蟲(chóng)確定待爬取URL隊(duì)列,增加了爬蟲(chóng)下載、解析網(wǎng)頁(yè)的操作,既影響效率,又增加了被網(wǎng)站反爬蟲(chóng)機(jī)制檢測(cè)發(fā)現(xiàn)的風(fēng)險(xiǎn)。通過(guò)分析發(fā)現(xiàn),https://e.thecover.cn/shtml/tfzb/yyyymmdd/vB1.shtml為yyyy年mm月dd日《天府早報(bào)》的首頁(yè),修改該網(wǎng)址對(duì)應(yīng)日期,即可直接訪問(wèn)該日《天府早報(bào)》首頁(yè),通過(guò)以下代碼,輸入起始日期start_date與結(jié)束日期end_date,即可生成待爬取URL隊(duì)列。

通過(guò)Requests庫(kù)的r = requests.get(url)方法,可以獲取名為r的Response對(duì)象,Response對(duì)象中包含了該URL的HTML信息。部分網(wǎng)站服務(wù)器對(duì)非瀏覽器的請(qǐng)求不予響應(yīng),因此,爬蟲(chóng)需要在請(qǐng)求頭中加入瀏覽器信息,偽裝成瀏覽器對(duì)網(wǎng)站進(jìn)行訪問(wèn)請(qǐng)求。在瀏覽器地址欄中輸入about:version,可以查詢(xún)到瀏覽器的User-Agent,將其加入requests.get方法中,即可將爬蟲(chóng)程序偽裝成瀏覽器,向目標(biāo)網(wǎng)站服務(wù)器發(fā)起get請(qǐng)求。返回的Response對(duì)象的content屬性即為該URL的二進(jìn)制編碼HTML。
import requests
def get_response(url):
headers = {'
User-Agent': ‘Mozilla/5.0 (Windows NT 10.0 ; WOW64)
AppleWebKit/537.36(KHTML, like Gecko)'
'Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2141.400
QQBrowser/9.5.10219.400'}
r = requests.get(url, headers=headers)
return r
通過(guò)解析報(bào)紙首頁(yè)的HTML,獲取該期報(bào)紙所有新聞的URL,再分別解析新聞網(wǎng)頁(yè)的HTML,即可獲得所需信息。lxml庫(kù)能高效解析HTML,通過(guò)lxml的etree.HTML解析完二進(jìn)制HTML后,選用Xpath選擇器,在XML文檔中對(duì)元素和屬性進(jìn)行遍歷。
from lxml import etree
def get_etree_items(content, xpath):
html = etree.HTML(content)
items = html.xpath(xpath)
return items
打開(kāi)瀏覽器的開(kāi)發(fā)者工具,可以發(fā)現(xiàn)如圖2所示的HTML結(jié)構(gòu),新聞后半段URL存于class屬性為title-list的標(biāo)簽u1下,通過(guò)XPath選擇語(yǔ)句//*[@class="title-list"]/li/a/@href,即可篩選出該期報(bào)紙所有新聞的后半段URL,再與https://e.thecover.cn/拼接即可得到完整的新聞URL。

圖2 《天府早報(bào)》HTML結(jié)構(gòu)
同樣地,分析新聞URL,新聞?wù)拇嬗贖TML的h3標(biāo)簽正文中,通過(guò)XPath選擇語(yǔ)句//h3/text(),即可獲取新聞?wù)摹4a如下:
news_response = get_response(index_url)
for detail in get_etree_items(news_response.content, '//*[@
class="title-list"]/li/a/@href'):
detail_url = index_url[0:20] + detail
detail_response = get_response(detail_url)
get_etree_items(detail_response.content, '//h3/text()')
判斷爬蟲(chóng)獲得的信息是否完整,包括HTML、時(shí)間、URL地址、正文。
def __validate_crawler_data(data):
if not data.get("content"):
raise StorageException
if not data.get("update_datetime"):
raise StorageException
if not data.get("url"):
raise StorageException
if not data.get("text"):
raise StorageException
最后,將獲取的爬蟲(chóng)數(shù)據(jù)存儲(chǔ)于基于分布式存儲(chǔ)的MongDB數(shù)據(jù)庫(kù)中。
本文構(gòu)建了以新聞媒體、門(mén)戶(hù)網(wǎng)站和知名旅游網(wǎng)站為數(shù)據(jù)源,以網(wǎng)絡(luò)爬蟲(chóng)技術(shù)為工具的時(shí)令旅游信息獲取方法,以《天府早報(bào)》新聞?wù)呐廊槔M(jìn)行了實(shí)例研究,最終爬取2013年6月1日至2017年12月31日之間《成都商報(bào)》《華西都市報(bào)》《四川日?qǐng)?bào)》和《天府早報(bào)》新聞300萬(wàn)條,四川新聞、新浪、搜狐、攜程、去哪兒、螞蜂窩和驢媽媽等旅游新聞20萬(wàn)條,所用時(shí)間累積不超過(guò)24小時(shí),表明通過(guò)網(wǎng)絡(luò)爬蟲(chóng)技術(shù)能高效獲取互聯(lián)網(wǎng)中大量的時(shí)令旅游信息,能有效支撐后續(xù)研究。
[1] 劉俊,李云云,劉浩龍,等.氣候變化對(duì)成都桃花觀賞旅游的影響與人類(lèi)適應(yīng)行[J].地理研究,2016,35(3):504-512.
[2] 韓超.中國(guó)近40年物候季節(jié)對(duì)氣候增暖的響應(yīng)研究[D].北京:中國(guó)科學(xué)院地理科學(xué)與資源研究所,2006.
[3] 畢伯鈞.自然物候歷應(yīng)用的研究[J].中國(guó)農(nóng)業(yè)氣象,1999,20(3):9-14.
[4] 馬麗,方修琦.近20年氣候變暖對(duì)北京時(shí)令旅游的影響——以北京市植物園桃花節(jié)為例[J].地球科學(xué)進(jìn)展,2006,21(3):313-319.
[5] 于娟,劉強(qiáng).主題網(wǎng)絡(luò)爬蟲(chóng)研究綜述[J].計(jì)算機(jī)工程與科學(xué),2015,37(2):231-237.
[6] 陳政伊,袁云靜,賀月錦,等.基于Python 的微博爬蟲(chóng)系統(tǒng)研究[J].大眾科技,2017,19(8):8-11.
[7] RICHARD L.用Python寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)[M].李斌,譯.北京:人民郵電出版社,2016.
[8] 董瑾.成都地區(qū)花卉旅游發(fā)展研究——以成都市各類(lèi)花節(jié)為例[D].成都:四川師范大學(xué),2012.