孟亞茹 姚凱學(xué) 安世博
摘要
搜索指數(shù),是以各大搜索網(wǎng)站海量網(wǎng)民行為數(shù)據(jù)作為基礎(chǔ)的數(shù)據(jù)分析統(tǒng)計(jì)結(jié)果,是衡量詞條搜索熱度的重要指標(biāo),對(duì)數(shù)據(jù)分析具有重要的參考價(jià)值。本文詳細(xì)介紹了一個(gè)基于Python的網(wǎng)絡(luò)關(guān)鍵字熱度獲取工具的研究與實(shí)現(xiàn)過程,用以獲取現(xiàn)有指數(shù)平臺(tái)的指數(shù)數(shù)據(jù)。文中以搜狗指數(shù)、微信媒體指數(shù)為例,詳細(xì)敘述了如何尋找URL入口、獲取并解析數(shù)據(jù)、以及如何清洗數(shù)據(jù)的技術(shù)與方法。測(cè)試結(jié)果表明,該爬蟲工具可以準(zhǔn)確地獲取目標(biāo)關(guān)鍵字在自定義時(shí)間段內(nèi)的指數(shù)熱度情況,具有實(shí)用價(jià)值。
【關(guān)鍵詞】Python 爬蟲 指數(shù) 數(shù)據(jù)獲取
搜索指數(shù),是指以網(wǎng)民的搜索行為為基礎(chǔ),對(duì)其搜索內(nèi)容以及搜索次數(shù)進(jìn)行統(tǒng)計(jì)分析,得出的該目標(biāo)關(guān)鍵字被搜索的頻次。搜索指數(shù)不僅可以反映出某關(guān)鍵字在特定網(wǎng)站的搜索規(guī)模,還可以反應(yīng)出該時(shí)間段內(nèi)熱度漲跌態(tài)勢(shì),準(zhǔn)確及時(shí)反映突發(fā)事件網(wǎng)絡(luò)輿情的變化情況。搜索指數(shù)的出現(xiàn),對(duì)市場(chǎng)分析與決策具有重要且深遠(yuǎn)的意義。
網(wǎng)絡(luò)爬蟲(Web Crawler)技術(shù)是一種快速獲取搜索指數(shù)相關(guān)信息的全新手段。本文在概述網(wǎng)絡(luò)爬蟲關(guān)鍵技術(shù)的基礎(chǔ)上,以“搜狗搜索”為研究對(duì)象,詳細(xì)介紹了一款基于網(wǎng)絡(luò)爬蟲技術(shù)的搜索指數(shù)獲取工具的研究與實(shí)現(xiàn)。
1 關(guān)鍵技術(shù)
1.1 Python爬蟲
Python是一款開源的,可以運(yùn)行在任何主流操作系統(tǒng)中的解釋性高級(jí)編程語言。Python簡潔的語法可以高效的節(jié)約開發(fā)者的開發(fā)時(shí)間以及開發(fā)成本。網(wǎng)絡(luò)爬蟲是用來獲取網(wǎng)絡(luò)數(shù)據(jù)的重要工具。關(guān)于網(wǎng)絡(luò)爬蟲技術(shù)的研究不計(jì)其數(shù)。爬蟲程序使用Python的一個(gè)重要因素,就是Python為爬蟲開發(fā)提供了豐富的標(biāo)準(zhǔn)庫以及強(qiáng)大的第三方庫。爬蟲程序完全模擬瀏覽器訪問網(wǎng)站的流程,首先使用requests庫請(qǐng)求網(wǎng)站,得到網(wǎng)站所有的HTML數(shù)據(jù),Requests的Get,Post等四種請(qǐng)求方式,包括了所有的HTTP/HTPPS的請(qǐng)求方式,比其他語言(C、C++、Java)方便快捷。然后辨別返回的結(jié)果,如果返回的是HTML格式的數(shù)據(jù),則可以使用lxml庫去解析網(wǎng)頁,通過節(jié)點(diǎn)提取等一些常規(guī)方法,提取出真正需要的數(shù)據(jù)。如果返回的是json格式的數(shù)據(jù),則可以通過json解析獲取數(shù)據(jù)。這兩步包含了數(shù)據(jù)抓取的核心的部分,基本可以得到想要的數(shù)據(jù)。
1.2 通用爬蟲工作流程
網(wǎng)絡(luò)爬蟲的基本工作流程如下:
(1)選取合適的起始URL,放入U(xiǎn)RL隊(duì)列;
(2)從待爬取URL隊(duì)列中取出URL,由網(wǎng)頁下載模塊下載URL對(duì)應(yīng)的網(wǎng)頁HTML,傳遞給數(shù)據(jù)解析模塊之后將URL放進(jìn)己爬取URL隊(duì)列;
(3)數(shù)據(jù)解析模塊解析收到的HTML,查找標(biāo)簽,提取出標(biāo)簽內(nèi)所需數(shù)據(jù),傳遞至數(shù)據(jù)清洗模塊,經(jīng)提取后將URL傳遞至URL調(diào)度模塊;
(4)調(diào)度模塊收到解析模塊傳遞過來的URL后,將其和己抓取的URL隊(duì)列對(duì)比,進(jìn)行去重處理,篩選出未爬取的URL放入待爬取URL隊(duì)列;
(5)網(wǎng)絡(luò)爬蟲系統(tǒng)在2~4步循環(huán),直到待爬取隊(duì)列中的URL全部爬取完畢,或者用戶終止進(jìn)程;
(6)數(shù)據(jù)清洗模塊發(fā)現(xiàn)并糾正數(shù)據(jù)文件中可識(shí)別的錯(cuò)誤,最終將數(shù)據(jù)存入數(shù)據(jù)庫。
2 研究對(duì)象、數(shù)據(jù)來源及目標(biāo)
2.1 研究對(duì)象
指數(shù)平臺(tái)是新型的平民化的數(shù)據(jù)展示平臺(tái),他旨在普及大數(shù)據(jù)在民眾日常生活中的使用。搜狗指數(shù)是以搜狗搜索平臺(tái)上海量網(wǎng)民行為數(shù)據(jù)為基礎(chǔ)的數(shù)據(jù)分享平臺(tái),為用戶提供數(shù)據(jù)支持。本文以搜狗指數(shù)為研究對(duì)象,詳細(xì)描述網(wǎng)絡(luò)爬蟲技術(shù)的應(yīng)用方法。
數(shù)據(jù)來源:此次研究為搜狗指數(shù),實(shí)現(xiàn)定向爬取,目標(biāo)地址為http://sogou.index.com(搜狗指數(shù)官網(wǎng))。
2.2 爬取目標(biāo)
本文以爬取搜狗指數(shù)網(wǎng)站“我不是藥神”詞條為案例,詳述通過網(wǎng)絡(luò)爬蟲技術(shù)獲取“我不是藥神”的搜狗指數(shù)的過程與方法,以及在爬取數(shù)據(jù)過程中會(huì)出現(xiàn)的問題和解決策略。
3 實(shí)現(xiàn)過程與技術(shù)難點(diǎn)
3.1 數(shù)據(jù)搜索入口URL
目標(biāo)地址為http://index.sogou.com(搜狗指數(shù))與其他網(wǎng)站相比具有特殊性,即數(shù)據(jù)請(qǐng)求接口為獨(dú)立網(wǎng)址,需通過抓包的方式獲取精確的數(shù)據(jù)接口并傳入需求數(shù)據(jù):接口為http://index.sogou.com/getDateData,需傳入的數(shù)據(jù)為:關(guān)鍵字(keyword),起始日期(start_date),結(jié)束日期(end_date),代碼如下:
import datetime
oft=“http://index.sogou.com/getDateData”
#把數(shù)據(jù)的字符串類型的時(shí)間轉(zhuǎn)換成時(shí)間格式
params={
'kwdNamesStr':keyword,
'start])ate':start_date,
'endDate':end_date,
'dataType':'SEARCH_ALL',
'queryType':'INPUT',
}
五個(gè)字段從上到下的含義分別為:
'kwdNamesStr':搜索的關(guān)鍵字,'startDate':請(qǐng)求數(shù)據(jù)的起始日期,'endDate'::請(qǐng)求數(shù)據(jù)的起始日期,'dataType':請(qǐng)求的數(shù)據(jù)類型,'queryType'查詢的方式。
3.2 獲取網(wǎng)頁數(shù)據(jù)
使用requests的get方法。requests的get方法將傳入數(shù)據(jù)寫進(jìn)字典格式的數(shù)據(jù)結(jié)構(gòu)并傳給requests方法的params字段。該網(wǎng)站的請(qǐng)求必須有瀏覽器信息,所以需要給請(qǐng)求添加請(qǐng)求頭,模仿瀏覽器對(duì)網(wǎng)站進(jìn)行訪問。請(qǐng)求成功之后,返回的數(shù)據(jù)為json字符串,目標(biāo)數(shù)據(jù)包含在其中,實(shí)現(xiàn)代碼如下:
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',
}
#防止程序假死,添加請(qǐng)求超時(shí)
web_data=requests.get(URL,headers=HEADERS,params=params,timeout=30)
return web_data
3.3 解析數(shù)據(jù)
通過解析得到的是]son字符串,所以需要把將其轉(zhuǎn)換成lson匹配的數(shù)據(jù)類型,然后使用Python的字典數(shù)據(jù)獲取方法,得到目標(biāo)數(shù)據(jù)。搜狗指數(shù)包含在data字段的pvList中,取兩次key-value值即可獲得目標(biāo)數(shù)據(jù),代碼如下:
import json
detail_data=json.loads(web_data.content)
date_datas=detail data['data']['pvList']
if not data_datas:
return
3.4 數(shù)妮清洗與整理
前幾步工作獲取的數(shù)據(jù)格式不規(guī)范,接下來對(duì)數(shù)據(jù)進(jìn)行重新整理,日期改寫成:‘2018-01-01格式,指數(shù)數(shù)值改寫為int類型。將最終的數(shù)據(jù)保存到一個(gè)列表數(shù)據(jù)結(jié)構(gòu)中返回給用戶,代碼如下:
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
最后,將獲取的數(shù)據(jù)存儲(chǔ)于非關(guān)系型數(shù)據(jù)庫MongoDB中。
3.5 數(shù)據(jù)驗(yàn)證
查詢電影“我不是藥神”上映前后兩天與上映當(dāng)天數(shù)據(jù),日期為2018.7.3-2018.7.7的具體數(shù)據(jù),得到的結(jié)果為:
[('2018-07-03',70808),('2018-07-04',132629),('2018-07-05',283926),('2018-07-06',472971),('2018-07-07',587893),],與網(wǎng)站完全相同,表明程序通過測(cè)試。
3.6 技術(shù)難點(diǎn)
搜狗指數(shù)網(wǎng)站在阻止爬蟲工具爬取數(shù)據(jù)方面十分嚴(yán)格,如何繞過防護(hù)是工具開發(fā)的技術(shù)難點(diǎn)。開發(fā)者需要全面?zhèn)窝b爬蟲程序,將解析格式、主機(jī)地址等詳細(xì)信息寫入請(qǐng)求頭,保證網(wǎng)站獲取的訪問請(qǐng)求是一個(gè)正常的用戶訪問,以保證數(shù)據(jù)的正確性和完整性。
4 結(jié)語
本文構(gòu)建了基于Python的抓取搜狗指數(shù)的爬蟲工具,抓取電影“我不是藥神”上映前后兩天與當(dāng)天網(wǎng)民搜索行為數(shù)據(jù)。爬取數(shù)據(jù)與搜狗指數(shù)網(wǎng)站公布數(shù)據(jù)完全相同,表明通過該爬蟲可以高效快捷的得到所有數(shù)據(jù),高效的為數(shù)據(jù)研究提供真實(shí)數(shù)據(jù)。
參考文獻(xiàn)
[1]陳濤,林杰.基于搜索引擎關(guān)注度的網(wǎng)絡(luò)輿情時(shí)空演化比較分析-以谷歌趨勢(shì)和百度指數(shù)比較為例[J].情報(bào)雜志,2013,32(03):7-10,16.
[2]于娟,劉強(qiáng).主題網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)工程與科學(xué),2015,37(02):231-237.
[3]陳政伊,袁云靜,賀月錦等.基于Python的微博爬蟲系統(tǒng)研究[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]周立柱,林玲.聚焦爬蟲技術(shù)研究綜述[J].計(jì)算機(jī)應(yīng)用,2005,25(09):1965-1969.
[7]李斌譯.RICHARD L.用Python寫網(wǎng)絡(luò)爬蟲[M].北京:人民郵電出版社,2016.