八月已經(jīng)過了一半,答辯完之后膘侮,sci小論文也剛寫完屈糊,今天難得休息。今天就來填上個月的坑琼了,power bi做文獻爬蟲逻锐。這里先解釋一下原理,首先使用學術(shù)搜索引擎搜索關鍵詞雕薪,然后翻頁下載所有的標題昧诱,作者,出版年份所袁,引用次數(shù)盏档,最后將下載完的數(shù)據(jù)用powerquery清洗,powerpivot建模燥爷,powerview可視化蜈亩。詞云的制作使用的是powerbi的可視化插件完成的,非常簡單前翎。另外稚配,為了從詞云中剔除非關鍵詞,我使用了一個stopwordlist港华。大概就是這么多道川。先展示一下我的作品,以CAR T作為關鍵詞檢索bing學術(shù):
值得一提的是powerbi制作的整個模型最后會保存為一個流程立宜,這樣只要換一個關鍵詞再回車一下就可以更新整個流程冒萄。是不是很方便很刺激?唯一的限制就是蝸牛一般的網(wǎng)速赘理。
為了方便理解宦言,我把整個流程分為兩部分:第一部分,講網(wǎng)頁爬取商模,難點是翻頁爬取和二級鏈接爬取奠旺。第二部分蜘澜,講powerquery數(shù)據(jù)清洗和powerpivot數(shù)據(jù)建模。這里要用一點powerquery M語言和powerpivot DAX語言的知識响疚,一點點就行鄙信。
OK廢話不多講,馬上開始干活忿晕!
第一部分power bi爬蟲
理論和軟件安裝的東西自己找資料看装诡,我就直接上操作了。
Step 1 找網(wǎng)頁鏈接規(guī)律
打開百度學術(shù)践盼,搜索關鍵詞:CAR T
我主要想拿的其實是網(wǎng)址:
https://xueshu.baidu.com/s?wd=Car+T&tn=SE_baiduxueshu_c1gjeupa&cl=3&ie=utf-8&bs=CAR+T&f=8&rsv_bp=1&rsv_sug2=0&sc_f_para=sc_tasktype%3D%7BfirstSimpleSearch%7D看到?jīng)]鸦采,這個鏈接就是把檢索的關鍵詞用是s?wd=CAR+T的語法鏈接起來了。但是翻頁的信息沒有找到咕幻,所以要翻個頁看渔伯。點到第二頁,鏈接是這樣的:
這是第二頁肄程,但是pn=10锣吼,這說明啥?每頁有10個文章蓝厌,第二頁就是從11開始了玄叠。知道這個規(guī)律就可以翻頁爬取了。
Step 2 網(wǎng)頁爬取
打開powerbi拓提,選擇獲取數(shù)據(jù)->web->粘貼網(wǎng)址->確定->連接读恃,選擇表1。這張表格包含了標題崎苗、引用次數(shù)狐粱、刊出時間、雜志名稱胆数,還有一些其他我不關心的信息。
選擇轉(zhuǎn)換數(shù)據(jù)互墓,就可以將數(shù)據(jù)導入到powerquery中必尼,修改列名,刪除其他不重要的信息篡撵。
到這里判莉,需要根據(jù)前面的步驟創(chuàng)建一個函數(shù)。首先創(chuàng)建一個頁碼參數(shù)
然后育谬,在“源”這個文件下修改函數(shù)命令
=Web.BrowserContents("https://xueshu.baidu.com/s?wd=Car%20T&pn=" & Text.From(Page) & "&tn=SE_baiduxueshu_c1gjeupa&ie=utf-8&sc_f_para=sc_tasktype%3D%7BfirstSimpleSearch%7D&sc_hit=1")
綠色的文本Page就是剛才的參數(shù)券盅,Text.From(Page) 將Page轉(zhuǎn)換為文本,&是連字符膛檀。這樣整個流程就是一個根據(jù)Page抓取頁面并清理文本的函數(shù)了锰镀。接下來娘侍,將這個流程生成一個以Page為參數(shù)的函數(shù):
創(chuàng)建名為GetHtml的函數(shù)。這個函數(shù)可以這樣表示Result=GetHtml(Page),Result就是我們抓取的數(shù)據(jù)了泳炉。
有了GetHtml函數(shù)憾筏,下一步需要一個頁碼list,來翻頁抓取花鹅。生成頁碼list很簡單氧腰,新建一個空查詢命名為PageList,然后使用M函數(shù)生成List刨肃,就OK啦古拴!
下面就是使用M函數(shù)調(diào)用GetHtml對PageList進行遍歷,然后合并矩陣就OK啦真友!
先創(chuàng)建一個空查詢斤富,命名為result,在使用M語言
=List.Transform ( PageList , each GetHtml (_ ) )
(注釋:List.Transform類似于for循環(huán)锻狗,_ 類似于迭代參數(shù)满力。)
OK,我翻了10頁轻纪,要等下載數(shù)據(jù)油额,等數(shù)據(jù)下載完成就可以得到一個Table的List
下面就是將List合并就可以了,這里使用Table.Combine函數(shù)刻帚。
= Table.Combine(? List.Transform(PageList,each GetHtml(_))? )
合并之后最后的結(jié)果就出來了潦嘶!
坑爹的百度雜志不用全名,解決這個問題可以用二級爬取崇众,這個下次講掂僵。
好了,到了這一步顷歌,就下載好了所有的锰蓬。。眯漩。等等芹扭,我發(fā)現(xiàn)雜志名竟然還有數(shù)字!好了赦抖,我真的生氣了舱卡!那么就不得不祭出二級爬取了~~~~~~~~xxx!6佑B肿丁!
二級爬取是根據(jù)文章的連接找到這個界面:
呵呵~要尔,還有學校的小圖標舍杜,看起來真可愛新娜!從這個頁面提取標題,作者蝴簇,引用量杯活,雜志名。
好了熬词,正式開始干活旁钧!首先,要從一級爬取頁面提取鏈接互拾。只用修改前面的操作步驟就可以啦歪今!
OK,到這里颜矿,我們又要生成一個函數(shù)了寄猩,這個函數(shù)的主要功能就是從web中提取標題、引用次數(shù)骑疆、發(fā)表時間田篇、雜志名。
我們首先新建一個參數(shù)箍铭,二級web地址
然后新建源泊柬,選擇Web,基本诈火,將輸入改為參數(shù)SubWebLink兽赁,確定
提取信息:
然后創(chuàng)建函數(shù),重命名為SubHtmlGet冷守。這個函數(shù)的參數(shù)是SubWebLink, 作用是從二級界面中提取我們想要的信息刀崖。
OK,函數(shù)準備好了拍摇,就可以開始瘋狂爬數(shù)據(jù)了亮钦。
在Result表的link列表加上前綴http:,再使用SubHtmlGet函數(shù)提取信息授翻。公式是:
=Table.TransformColumns( Table.Combine(? List.Transform(PageList,each GetHtml(_))? ),{"Link", eachSubHtmlGet("http:"&_)?? }?? )
使用Table.TransformColumns函數(shù)對Link字段進行轉(zhuǎn)化或悲。然后就是等結(jié)果了,不想用二級爬取就是因為要等太久了~_~! 而且這PowerBI的web引擎不支持多線程和多進程~不過可以用內(nèi)置的Python腳本進行間接爬取~有機會寫個技術(shù)貼堪唐,嘿嘿!
等了1-2分鐘翎蹈,爬了100個網(wǎng)頁淮菠,結(jié)果就出來了!
展開這個Table就是我們想要的數(shù)據(jù)了
嘿嘿荤堪。合陵。就是有些雜志后面跟了年份枢赔,也有空的∮抵空數(shù)據(jù)可以保留踏拜,時間數(shù)據(jù)可以刪除掉,很簡單低剔,有兩種方法速梗,拆分列和直接remove。這里我用split襟齿,這樣制作流程不容易出錯
另外姻锁,還需要在每個list中添加stopwords,這個比較容易猜欺。首先導入數(shù)據(jù)位隶,就是這樣:
然后使用語法:
let
??? 源 =
Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\Administrator\Desktop\PowerBI\文獻挖掘\stopwordslist.txt"),null, null, 1252)}),
??? 刪除的間隔行 =
Text.Combine(Table.ToList(Table.AlternateRows(源,1,1,1)),",")
in
刪除的間隔行
這樣WordList就變成了這樣了:
將這個添加到Result后面:
這樣數(shù)據(jù)就準備好了,上載在POWERBI开皿,接下來就是使用DAX語言進行建模了涧黄。
首先我們要隱藏其中幾張不用的表,我們只用Result表:
感覺寫得有點兒長了赋荆,寫這個竟然用了我3個小時的寶貴時間笋妥,心疼!等我有空再寫DAX建模和可視化部分糠睡!下次更新再見贴浙!