八月已经过了一半,答辩完之后,sci小论文也刚写完,今天难得休息。今天就来填上个月的坑,power bi做文献爬虫。这里先解释一下原理,首先使用学术搜索引擎搜索关键词,然后翻页下载所有的标题,作者,出版年份,引用次数,最后将下载完的数据用powerquery清洗,powerpivot建模,powerview可视化。词云的制作使用的是powerbi的可视化插件完成的,非常简单。另外,为了从词云中剔除非关键词,我使用了一个stopwordlist。大概就是这么多。先展示一下我的作品,以CAR T作为关键词检索bing学术:
值得一提的是powerbi制作的整个模型最后会保存为一个流程,这样只要换一个关键词再回车一下就可以更新整个流程。是不是很方便很刺激?唯一的限制就是蜗牛一般的网速。
为了方便理解,我把整个流程分为两部分:第一部分,讲网页爬取,难点是翻页爬取和二级链接爬取。第二部分,讲powerquery数据清洗和powerpivot数据建模。这里要用一点powerquery M语言和powerpivot DAX语言的知识,一点点就行。
OK废话不多讲,马上开始干活!
第一部分power bi爬虫
理论和软件安装的东西自己找资料看,我就直接上操作了。
Step 1 找网页链接规律
打开百度学术,搜索关键词:CAR T
我主要想拿的其实是网址:
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看到没,这个链接就是把检索的关键词用是s?wd=CAR+T的语法链接起来了。但是翻页的信息没有找到,所以要翻个页看。点到第二页,链接是这样的:
这是第二页,但是pn=10,这说明啥?每页有10个文章,第二页就是从11开始了。知道这个规律就可以翻页爬取了。
Step 2 网页爬取
打开powerbi,选择获取数据->web->粘贴网址->确定->连接,选择表1。这张表格包含了标题、引用次数、刊出时间、杂志名称,还有一些其他我不关心的信息。
选择转换数据,就可以将数据导入到powerquery中,修改列名,删除其他不重要的信息。
到这里,需要根据前面的步骤创建一个函数。首先创建一个页码参数
然后,在“源”这个文件下修改函数命令
=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就是刚才的参数,Text.From(Page) 将Page转换为文本,&是连字符。这样整个流程就是一个根据Page抓取页面并清理文本的函数了。接下来,将这个流程生成一个以Page为参数的函数:
创建名为GetHtml的函数。这个函数可以这样表示Result=GetHtml(Page),Result就是我们抓取的数据了。
有了GetHtml函数,下一步需要一个页码list,来翻页抓取。生成页码list很简单,新建一个空查询命名为PageList,然后使用M函数生成List,就OK啦!
下面就是使用M函数调用GetHtml对PageList进行遍历,然后合并矩阵就OK啦!
先创建一个空查询,命名为result,在使用M语言
=List.Transform ( PageList , each GetHtml (_ ) )
(注释:List.Transform类似于for循环,_ 类似于迭代参数。)
OK,我翻了10页,要等下载数据,等数据下载完成就可以得到一个Table的List
下面就是将List合并就可以了,这里使用Table.Combine函数。
= Table.Combine( List.Transform(PageList,each GetHtml(_)) )
合并之后最后的结果就出来了!
坑爹的百度杂志不用全名,解决这个问题可以用二级爬取,这个下次讲。
好了,到了这一步,就下载好了所有的。。。等等,我发现杂志名竟然还有数字!好了,我真的生气了!那么就不得不祭出二级爬取了~~~~~~~~xxx!!!!
二级爬取是根据文章的连接找到这个界面:
呵呵~,还有学校的小图标,看起来真可爱!从这个页面提取标题,作者,引用量,杂志名。
好了,正式开始干活!首先,要从一级爬取页面提取链接。只用修改前面的操作步骤就可以啦!
OK,到这里,我们又要生成一个函数了,这个函数的主要功能就是从web中提取标题、引用次数、发表时间、杂志名。
我们首先新建一个参数,二级web地址
然后新建源,选择Web,基本,将输入改为参数SubWebLink,确定
提取信息:
然后创建函数,重命名为SubHtmlGet。这个函数的参数是SubWebLink, 作用是从二级界面中提取我们想要的信息。
OK,函数准备好了,就可以开始疯狂爬数据了。
在Result表的link列表加上前缀http:,再使用SubHtmlGet函数提取信息。公式是:
=Table.TransformColumns( Table.Combine( List.Transform(PageList,each GetHtml(_)) ),{"Link", eachSubHtmlGet("http:"&_) } )
使用Table.TransformColumns函数对Link字段进行转化。然后就是等结果了,不想用二级爬取就是因为要等太久了~_~! 而且这PowerBI的web引擎不支持多线程和多进程~不过可以用内置的Python脚本进行间接爬取~有机会写个技术贴,嘿嘿!
等了1-2分钟,爬了100个网页,结果就出来了!
展开这个Table就是我们想要的数据了
嘿嘿。。就是有些杂志后面跟了年份,也有空的。空数据可以保留,时间数据可以删除掉,很简单,有两种方法,拆分列和直接remove。这里我用split,这样制作流程不容易出错
另外,还需要在每个list中添加stopwords,这个比较容易。首先导入数据,就是这样:
然后使用语法:
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后面:
这样数据就准备好了,上载在POWERBI,接下来就是使用DAX语言进行建模了。
首先我们要隐藏其中几张不用的表,我们只用Result表:
感觉写得有点儿长了,写这个竟然用了我3个小时的宝贵时间,心疼!等我有空再写DAX建模和可视化部分!下次更新再见!