孟亞茹 姚凱學 安世博
摘要
搜索指數,是以各大搜索網站海量網民行為數據作為基礎的數據分析統計結果,是衡量詞條搜索熱度的重要指標,對數據分析具有重要的參考價值。本文詳細介紹了一個基于Python的網絡關鍵字熱度獲取工具的研究與實現過程,用以獲取現有指數平臺的指數數據。文中以搜狗指數、微信媒體指數為例,詳細敘述了如何尋找URL入口、獲取并解析數據、以及如何清洗數據的技術與方法。測試結果表明,該爬蟲工具可以準確地獲取目標關鍵字在自定義時間段內的指數熱度情況,具有實用價值。
【關鍵詞】Python 爬蟲 指數 數據獲取
搜索指數,是指以網民的搜索行為為基礎,對其搜索內容以及搜索次數進行統計分析,得出的該目標關鍵字被搜索的頻次。搜索指數不僅可以反映出某關鍵字在特定網站的搜索規模,還可以反應出該時間段內熱度漲跌態勢,準確及時反映突發事件網絡輿情的變化情況。搜索指數的出現,對市場分析與決策具有重要且深遠的意義。
網絡爬蟲(Web Crawler)技術是一種快速獲取搜索指數相關信息的全新手段。本文在概述網絡爬蟲關鍵技術的基礎上,以“搜狗搜索”為研究對象,詳細介紹了一款基于網絡爬蟲技術的搜索指數獲取工具的研究與實現。
1 關鍵技術
1.1 Python爬蟲
Python是一款開源的,可以運行在任何主流操作系統中的解釋性高級編程語言。Python簡潔的語法可以高效的節約開發者的開發時間以及開發成本。網絡爬蟲是用來獲取網絡數據的重要工具。關于網絡爬蟲技術的研究不計其數。爬蟲程序使用Python的一個重要因素,就是Python為爬蟲開發提供了豐富的標準庫以及強大的第三方庫。爬蟲程序完全模擬瀏覽器訪問網站的流程,首先使用requests庫請求網站,得到網站所有的HTML數據,Requests的Get,Post等四種請求方式,包括了所有的HTTP/HTPPS的請求方式,比其他語言(C、C++、Java)方便快捷。然后辨別返回的結果,如果返回的是HTML格式的數據,則可以使用lxml庫去解析網頁,通過節點提取等一些常規方法,提取出真正需要的數據。如果返回的是json格式的數據,則可以通過json解析獲取數據。這兩步包含了數據抓取的核心的部分,基本可以得到想要的數據。
1.2 通用爬蟲工作流程
網絡爬蟲的基本工作流程如下:
(1)選取合適的起始URL,放入URL隊列;
(2)從待爬取URL隊列中取出URL,由網頁下載模塊下載URL對應的網頁HTML,傳遞給數據解析模塊之后將URL放進己爬取URL隊列;
(3)數據解析模塊解析收到的HTML,查找標簽,提取出標簽內所需數據,傳遞至數據清洗模塊,經提取后將URL傳遞至URL調度模塊;
(4)調度模塊收到解析模塊傳遞過來的URL后,將其和己抓取的URL隊列對比,進行去重處理,篩選出未爬取的URL放入待爬取URL隊列;
(5)網絡爬蟲系統在2~4步循環,直到待爬取隊列中的URL全部爬取完畢,或者用戶終止進程;
(6)數據清洗模塊發現并糾正數據文件中可識別的錯誤,最終將數據存入數據庫。
2 研究對象、數據來源及目標
2.1 研究對象
指數平臺是新型的平民化的數據展示平臺,他旨在普及大數據在民眾日常生活中的使用。搜狗指數是以搜狗搜索平臺上海量網民行為數據為基礎的數據分享平臺,為用戶提供數據支持。本文以搜狗指數為研究對象,詳細描述網絡爬蟲技術的應用方法。
數據來源:此次研究為搜狗指數,實現定向爬取,目標地址為http://sogou.index.com(搜狗指數官網)。
2.2 爬取目標
本文以爬取搜狗指數網站“我不是藥神”詞條為案例,詳述通過網絡爬蟲技術獲取“我不是藥神”的搜狗指數的過程與方法,以及在爬取數據過程中會出現的問題和解決策略。
3 實現過程與技術難點
3.1 數據搜索入口URL
目標地址為http://index.sogou.com(搜狗指數)與其他網站相比具有特殊性,即數據請求接口為獨立網址,需通過抓包的方式獲取精確的數據接口并傳入需求數據:接口為http://index.sogou.com/getDateData,需傳入的數據為:關鍵字(keyword),起始日期(start_date),結束日期(end_date),代碼如下:
import datetime
oft=“http://index.sogou.com/getDateData”
#把數據的字符串類型的時間轉換成時間格式
params={
'kwdNamesStr':keyword,
'start])ate':start_date,
'endDate':end_date,
'dataType':'SEARCH_ALL',
'queryType':'INPUT',
}
五個字段從上到下的含義分別為:
'kwdNamesStr':搜索的關鍵字,'startDate':請求數據的起始日期,'endDate'::請求數據的起始日期,'dataType':請求的數據類型,'queryType'查詢的方式。
3.2 獲取網頁數據
使用requests的get方法。requests的get方法將傳入數據寫進字典格式的數據結構并傳給requests方法的params字段。該網站的請求必須有瀏覽器信息,所以需要給請求添加請求頭,模仿瀏覽器對網站進行訪問。請求成功之后,返回的數據為json字符串,目標數據包含在其中,實現代碼如下:
import requests
HEADERS={
'Accept':'*/*',
'Accept-Encoding':'gzip,deflate',
'Accept-Language':'zh-CN,zh;q-0.9',
'Connection':'keep-alive',
'Host':'index.sogou.com',
'User-Agent':'Mozilla/5.0(Windows NT6.1;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/62.0.3202.75 Safari/537.36',
}
#防止程序假死,添加請求超時
web_data=requests.get(URL,headers=HEADERS,params=params,timeout=30)
return web_data
3.3 解析數據
通過解析得到的是]son字符串,所以需要把將其轉換成lson匹配的數據類型,然后使用Python的字典數據獲取方法,得到目標數據。搜狗指數包含在data字段的pvList中,取兩次key-value值即可獲得目標數據,代碼如下:
import json
detail_data=json.loads(web_data.content)
date_datas=detail data['data']['pvList']
if not data_datas:
return
3.4 數妮清洗與整理
前幾步工作獲取的數據格式不規范,接下來對數據進行重新整理,日期改寫成:‘2018-01-01格式,指數數值改寫為int類型。將最終的數據保存到一個列表數據結構中返回給用戶,代碼如下:
result=[]
for date_data in date_datas:
for each_data in date_data:
year=str(each_data['date'])[0:4]
month=str(each_data['date'])[4:6]
day=str(each_data['date'])[6:8]
dates=year+'-'+month+'-'+day
result_each_data=dates,int(each_data['pv'])
result.append(result_each_data)
return result
最后,將獲取的數據存儲于非關系型數據庫MongoDB中。
3.5 數據驗證
查詢電影“我不是藥神”上映前后兩天與上映當天數據,日期為2018.7.3-2018.7.7的具體數據,得到的結果為:
[('2018-07-03',70808),('2018-07-04',132629),('2018-07-05',283926),('2018-07-06',472971),('2018-07-07',587893),],與網站完全相同,表明程序通過測試。
3.6 技術難點
搜狗指數網站在阻止爬蟲工具爬取數據方面十分嚴格,如何繞過防護是工具開發的技術難點。開發者需要全面偽裝爬蟲程序,將解析格式、主機地址等詳細信息寫入請求頭,保證網站獲取的訪問請求是一個正常的用戶訪問,以保證數據的正確性和完整性。
4 結語
本文構建了基于Python的抓取搜狗指數的爬蟲工具,抓取電影“我不是藥神”上映前后兩天與當天網民搜索行為數據。爬取數據與搜狗指數網站公布數據完全相同,表明通過該爬蟲可以高效快捷的得到所有數據,高效的為數據研究提供真實數據。
參考文獻
[1]陳濤,林杰.基于搜索引擎關注度的網絡輿情時空演化比較分析-以谷歌趨勢和百度指數比較為例[J].情報雜志,2013,32(03):7-10,16.
[2]于娟,劉強.主題網絡爬蟲研究綜述[J].計算機工程與科學,2015,37(02):231-237.
[3]陳政伊,袁云靜,賀月錦等.基于Python的微博爬蟲系統研究[J].大眾科技,2017,19(08):8-11.
[4]PINKERTON B.Finding what people want:experiences with the WebCrawler[EB/OL].[2010-10-10].http://www.webir.org/resoruces/phd/pinkerton_2000.pdf.
[5]AHMADI-ABKENARI F,SELAMAT A.An architecture for a focusedtrend parallel Web crawler withthe application of clickstreamanalysis[J].Information Sciences,2012,184(01):266-281.
[6]周立柱,林玲.聚焦爬蟲技術研究綜述[J].計算機應用,2005,25(09):1965-1969.
[7]李斌譯.RICHARD L.用Python寫網絡爬蟲[M].北京:人民郵電出版社,2016.