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

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

通過Requests庫的r = requests.get(url)方法,可以獲取名為r的Response對象,Response對象中包含了該URL的HTML信息。部分網站服務器對非瀏覽器的請求不予響應,因此,爬蟲需要在請求頭中加入瀏覽器信息,偽裝成瀏覽器對網站進行訪問請求。在瀏覽器地址欄中輸入about:version,可以查詢到瀏覽器的User-Agent,將其加入requests.get方法中,即可將爬蟲程序偽裝成瀏覽器,向目標網站服務器發起get請求。返回的Response對象的content屬性即為該URL的二進制編碼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
通過解析報紙首頁的HTML,獲取該期報紙所有新聞的URL,再分別解析新聞網頁的HTML,即可獲得所需信息。lxml庫能高效解析HTML,通過lxml的etree.HTML解析完二進制HTML后,選用Xpath選擇器,在XML文檔中對元素和屬性進行遍歷。
from lxml import etree
def get_etree_items(content, xpath):
html = etree.HTML(content)
items = html.xpath(xpath)
return items
打開瀏覽器的開發者工具,可以發現如圖2所示的HTML結構,新聞后半段URL存于class屬性為title-list的標簽u1下,通過XPath選擇語句//*[@class="title-list"]/li/a/@href,即可篩選出該期報紙所有新聞的后半段URL,再與https://e.thecover.cn/拼接即可得到完整的新聞URL。

圖2 《天府早報》HTML結構
同樣地,分析新聞URL,新聞正文存于HTML的h3標簽正文中,通過XPath選擇語句//h3/text(),即可獲取新聞正文。代碼如下:
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()')
判斷爬蟲獲得的信息是否完整,包括HTML、時間、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
最后,將獲取的爬蟲數據存儲于基于分布式存儲的MongDB數據庫中。
本文構建了以新聞媒體、門戶網站和知名旅游網站為數據源,以網絡爬蟲技術為工具的時令旅游信息獲取方法,以《天府早報》新聞正文爬取為例,進行了實例研究,最終爬取2013年6月1日至2017年12月31日之間《成都商報》《華西都市報》《四川日報》和《天府早報》新聞300萬條,四川新聞、新浪、搜狐、攜程、去哪兒、螞蜂窩和驢媽媽等旅游新聞20萬條,所用時間累積不超過24小時,表明通過網絡爬蟲技術能高效獲取互聯網中大量的時令旅游信息,能有效支撐后續研究。
[1] 劉俊,李云云,劉浩龍,等.氣候變化對成都桃花觀賞旅游的影響與人類適應行[J].地理研究,2016,35(3):504-512.
[2] 韓超.中國近40年物候季節對氣候增暖的響應研究[D].北京:中國科學院地理科學與資源研究所,2006.
[3] 畢伯鈞.自然物候歷應用的研究[J].中國農業氣象,1999,20(3):9-14.
[4] 馬麗,方修琦.近20年氣候變暖對北京時令旅游的影響——以北京市植物園桃花節為例[J].地球科學進展,2006,21(3):313-319.
[5] 于娟,劉強.主題網絡爬蟲研究綜述[J].計算機工程與科學,2015,37(2):231-237.
[6] 陳政伊,袁云靜,賀月錦,等.基于Python 的微博爬蟲系統研究[J].大眾科技,2017,19(8):8-11.
[7] RICHARD L.用Python寫網絡爬蟲[M].李斌,譯.北京:人民郵電出版社,2016.
[8] 董瑾.成都地區花卉旅游發展研究——以成都市各類花節為例[D].成都:四川師范大學,2012.