趙子欽
(太原理工大學(xué)大數(shù)據(jù)學(xué)院,山西 太原030000)
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,QQ 空間作為虛擬信息交流場(chǎng)所,愈來愈成為人們自我視界里廣泛使用的一種社交工具。人們青睞于QQ 空間說說以文字語言形式記錄生活點(diǎn)滴,抒發(fā)個(gè)人情懷,自我心跡表露,與朋友互動(dòng)寫留言,進(jìn)行自我彰顯,社會(huì)輿情傳遞等等,從而成為QQ 說說用戶鮮活明亮的歲月留痕和見證成長(zhǎng)的精神空間。隨著時(shí)間的推移,用戶說說條目不斷增多,說說所涉及的范圍也更加廣袤,層級(jí)紛繁多樣,內(nèi)容也包羅萬象。當(dāng)人們想要在眾多說說條目下找到某一條或某一類說說內(nèi)容時(shí),可能會(huì)比較困難。
大數(shù)據(jù)時(shí)代的到來和網(wǎng)絡(luò)爬蟲技術(shù)的應(yīng)用,為采集和挖掘目標(biāo)數(shù)據(jù)提供了可能并轉(zhuǎn)化為現(xiàn)實(shí)。通過web 爬蟲網(wǎng)絡(luò)技術(shù),把網(wǎng)頁上的數(shù)據(jù)下載到本地?cái)?shù)據(jù)庫,從而方便對(duì)目標(biāo)信息的查找和有效提取利用。結(jié)合Python 技術(shù),可以實(shí)現(xiàn)對(duì)QQ 空間說說的爬取。
論文使用的平臺(tái)是Anaconda3,瀏覽器為火狐瀏覽器:Mozilla Firefox-70 版本,瀏覽器驅(qū)動(dòng)為:geckodriver-0.24.0 版本。通過selenium 庫中的webdriver 實(shí)現(xiàn)從瀏覽器完全模擬人直接登錄訪問QQ 空間。針對(duì)登錄產(chǎn)生的權(quán)限問題,使用webdriver中g(shù)et_cookies()函數(shù),將登錄cookie 獲取保存。然后通過cookie來構(gòu)造一個(gè)session, 結(jié)合查看網(wǎng)頁請(qǐng)求網(wǎng)址獲取含有空間說說的網(wǎng)頁。為了便于查看,可以通過json.loads()函數(shù)把內(nèi)容轉(zhuǎn)化為JS 格式。將抓取的網(wǎng)絡(luò)頁面形成隊(duì)列,并通過對(duì)比發(fā)現(xiàn)每個(gè)網(wǎng)頁地址特定參數(shù)的區(qū)別,確定循環(huán)對(duì)象,最后使用for 循環(huán)和while 循環(huán)把空間說說的內(nèi)容爬取至本地。
Python 是一種面向?qū)ο蟮挠?jì)算機(jī)程序設(shè)計(jì)語言,內(nèi)置有豐富的數(shù)據(jù)類型來表示函數(shù)、模塊、對(duì)象、運(yùn)行時(shí)的信息等,有著簡(jiǎn)單的說明文檔,運(yùn)行速度快,可用作圖形、數(shù)字、文本處理,因此用Python 寫簡(jiǎn)單爬蟲獲取數(shù)據(jù)庫的信息,為人們?cè)诤A啃畔⒅蝎@取目標(biāo)內(nèi)容提供更加方便快捷的功能。
網(wǎng)絡(luò)爬蟲屬于一種自動(dòng)檢索工具,就是通過網(wǎng)絡(luò)搜索主題,遍歷網(wǎng)頁內(nèi)容,根據(jù)某個(gè)網(wǎng)站的分析算法和既定的抓取目標(biāo),過濾掉無關(guān)鏈接和大量用戶不關(guān)心的網(wǎng)頁,有選擇的訪問相關(guān)網(wǎng)頁和相關(guān)鏈接,將其放置在一個(gè)隊(duì)列被爬取,從而用戶能夠很方便的獲取所需要的信息內(nèi)容。
1.2.1 處理登錄表單
處理登錄表單可以分為兩步:第一步是分析網(wǎng)站的登錄表單,構(gòu)造具有POST 請(qǐng)求的參數(shù)字典。第二步是提交POST 請(qǐng)求。
1.2.2 處理cookies
爬取說說,首先要登錄QQ 空間,為了避免每次爬取說說時(shí)需要登錄這樣的麻煩,可以利用seesion 保存的cookies 信息。
真實(shí)地址爬?。罕M管數(shù)據(jù)沒有出現(xiàn)在網(wǎng)頁源代碼中,但可以找到數(shù)據(jù)的真實(shí)地址,請(qǐng)求得到真實(shí)地址可以獲得想要的數(shù)據(jù)。這里用到瀏覽器“查看元素”的功能。
步驟:(1)將QQ 空間登陸頁面網(wǎng)址在Firefox 瀏覽器打開,右擊頁面,點(diǎn)擊“查看元素”,打開開發(fā)者工具。(2)找到真實(shí)的數(shù)據(jù)地址。點(diǎn)擊開發(fā)者工具頁面窗口,選擇“網(wǎng)絡(luò)”選項(xiàng),刷新頁面。這時(shí),“網(wǎng)絡(luò)”會(huì)顯示瀏覽器從Web 服務(wù)器獲取的所有文件,目標(biāo)數(shù)據(jù)就在其中。(3)爬取真實(shí)說說數(shù)據(jù)地址。獲取了地址,繼而使用requests 請(qǐng)求網(wǎng)頁,獲取網(wǎng)頁地址中的數(shù)據(jù)。(4)一般獲得的結(jié)果較為復(fù)雜,這些是JS 數(shù)據(jù),我們可以使用json 庫解析數(shù)據(jù),從中提取想要的數(shù)據(jù)。
這里最重要的一個(gè)變量是requests 庫的Session 函數(shù),可以幫助我們維持一個(gè)會(huì)話,還可以自動(dòng)處理Cookies,令我們不再擔(dān)心cookies 問題。
2.1.1 導(dǎo)入模型所需庫:json、requests、selenium 中的webdriver。導(dǎo)入程序如圖1 所示:
圖1 導(dǎo)入庫
2.1.2 先將qq 賬號(hào)和密碼分別賦予變量user、pw。程序如圖2 所示:
圖2 變量賦值
2.2.1 為了實(shí)現(xiàn)瀏覽器模擬登錄,先轉(zhuǎn)到QQ 空間登錄頁面,driver = webdriver.Firefox(),driver.get(“http://i.qq.com”),右擊,選擇登錄框,driver.switch_to.frame(“l(fā)ogin_frame”)。選擇登錄框、獲取登錄框位置如圖3 所示:
圖3 尋找登錄框
2.2.2 模擬瀏覽器點(diǎn)擊選擇到“賬號(hào)密碼登錄”,driver.find_element_by_id(“switcher_plogin”).click()。選擇賬號(hào)密碼登錄如圖4 所示:
圖4 選擇賬號(hào)密碼登錄框
2.2.3 選擇點(diǎn)擊填寫賬號(hào)(密碼)框,并將qq 賬號(hào)(user)、密碼(pw)填寫進(jìn)去,driver.find_element_by_id(“u”).send_keys(user)driver.find_element_by_id(“p”).send_keys(pw)。填寫結(jié)果如圖5、圖6 所示:
圖5 選擇輸入賬號(hào)框
圖6 輸入密碼框
2.2.4 點(diǎn)擊登錄按鈕進(jìn)行登錄(手動(dòng)驗(yàn)證)driver.find_element_by_id(“l(fā)ogin_button”).click()。選擇點(diǎn)擊登錄按鈕框如圖7 所示:
圖7 登錄框
2.3.1 登錄成功之后,使用selenium 得到cookies,并將其保存至“cookies.txt”文件。函數(shù)代碼如圖8 所示:
2.3.2 登錄到主頁后,為了獲取到說說頁面的真實(shí)地址,查看頁面“查看元素”,觀察網(wǎng)絡(luò)欄,由于第一頁內(nèi)容含有其他元素,不易查找,所以,下拉動(dòng)態(tài)加載完畢后,將網(wǎng)絡(luò)中請(qǐng)求網(wǎng)址全部清空。之后再點(diǎn)擊說說的“第二頁”,“網(wǎng)絡(luò)”中出現(xiàn)的第一個(gè)請(qǐng)求網(wǎng)址即為說說的真實(shí)網(wǎng)址。獲取到真實(shí)地址如圖9 所示:
圖9 獲取到真實(shí)地址
2.4.1 將真實(shí)網(wǎng)址在瀏覽器中打開,分析后可知所需數(shù)據(jù)的范圍為[10:-2]。如圖10 所示:
圖10 黑框部分不做選取
2.4.2 為了實(shí)現(xiàn)說說的真實(shí)網(wǎng)址的免密登錄,定義此函數(shù),利用保存的cookies 使其返回一個(gè)賦予cookies 的JS 對(duì)象的網(wǎng)頁。函數(shù)代碼如圖11 所示:
圖11 免密登錄函數(shù)
2.4.3 利用獲取真實(shí)地址的方法,得到第三頁的網(wǎng)址。比較兩個(gè)真實(shí)網(wǎng)址,發(fā)現(xiàn)“pos”的值不同,第二頁中的pos 值為20,第三頁為40......由此可知,第一頁pos 值為0,每翻一頁,pos 值自增20。所以可以將得到的真實(shí)網(wǎng)址url 分解為2 部分:
url_1 = 'https://user.qzone.qq.com......&pos='
url_2 = '&num=20&c......282c2d39d'
通過循環(huán)可以循環(huán)遍歷到每一頁。
使用json.loads()函數(shù),進(jìn)行查看,可以得知,每條說說的的信息都在'msglist'中,其中,說說內(nèi)容為“content”,發(fā)表時(shí)間為“creatTime”。內(nèi)容的信息如圖12 所示:
圖12 JS 信息
現(xiàn)在需要討論何時(shí)終止循環(huán),不難發(fā)現(xiàn),當(dāng)pos 的值超出可讀取的網(wǎng)頁時(shí),'msglist'=None。
由此,'msglist' = none 作為停止循環(huán)的條件是可行的。如圖13 所示:
圖13 停止循環(huán)條件
定義函數(shù),遍歷輸出每一頁說說的內(nèi)容,當(dāng)‘msglist’為空時(shí),返回‘1’,不為空時(shí),將其中的內(nèi)容“content”,發(fā)表時(shí)間“creatTime”打印輸出到文件,并返回‘0’。函數(shù)代碼如圖14 所示:
圖14 定義獲取說說函數(shù)
調(diào)用上述函數(shù),函數(shù)返回“1”時(shí),停止循環(huán),返回'0'時(shí),進(jìn)行“翻頁”操作。當(dāng)所有操作完成后,打印出“Down”,表明程序運(yùn)行結(jié)束。如圖15 所示:
圖15 程序代碼
依次運(yùn)行程序后,見到打印出的“Down”。如圖16 所示:
圖16 運(yùn)行完畢
最后,打開在python 工作目錄中生成的“qqss.txt”文件,可以看到爬取的說說內(nèi)容及發(fā)表時(shí)間。如圖17 所示:
圖17 爬取結(jié)果
利用Python 語言進(jìn)行爬蟲程序設(shè)計(jì)是大數(shù)據(jù)時(shí)代下實(shí)現(xiàn)數(shù)據(jù)采集的重要渠道。本文以爬取QQ 空間說說為例,介紹了一種爬取說說數(shù)據(jù)的爬蟲程序設(shè)計(jì),為用戶對(duì)說說條目進(jìn)行聚類、篩選或獲得目標(biāo)數(shù)據(jù)提供便利。設(shè)計(jì)過程中對(duì)于滿足用戶,快速訪問的QQ 空間問題仍有進(jìn)一步改進(jìn)空間。例如:在實(shí)現(xiàn)模擬登錄時(shí),需要人工手動(dòng)拖拽拼圖驗(yàn)證,這樣無法徹底實(shí)現(xiàn)自動(dòng)化驗(yàn)證碼識(shí)別,速度較慢??梢圆捎迷O(shè)置被拖拽拼圖的CSS 屬性或模擬拖動(dòng)的方法,全程自動(dòng)化無需人工參與進(jìn)而提升爬取速度。同樣,還可以利用此技術(shù)在互聯(lián)網(wǎng)絡(luò)爬取其他目標(biāo)數(shù)據(jù),縮短查詢信息的時(shí)間,獲取相關(guān)有價(jià)值數(shù)據(jù),提高工作效率。