爬虫小项目之三 学术文献爬虫+词云(上)

八月已经过了一半,答辩完之后,sci小论文也刚写完,今天难得休息。今天就来填上个月的坑,power bi做文献爬虫。这里先解释一下原理,首先使用学术搜索引擎搜索关键词,然后翻页下载所有的标题,作者,出版年份,引用次数,最后将下载完的数据用powerquery清洗,powerpivot建模,powerview可视化。词云的制作使用的是powerbi的可视化插件完成的,非常简单。另外,为了从词云中剔除非关键词,我使用了一个stopwordlist。大概就是这么多。先展示一下我的作品,以CAR T作为关键词检索bing学术:

https://app.powerbi.com/view?r=eyJrIjoiOTE4ZWMwNzMtODZhNi00NTBiLWE0NDctNmFiNDUzODk1ZWI5IiwidCI6ImUyZmFkYTNhLWZiNjktNGJkZS1hZmE4LWNlM2M2YWU2YjkyYiIsImMiOjZ9

值得一提的是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的语法链接起来了。但是翻页的信息没有找到,所以要翻个页看。点到第二页,链接是这样的:

https://xueshu.baidu.com/s?wd=Car%20T&pn=10&tn=SE_baiduxueshu_c1gjeupa&ie=utf-8&sc_f_para=sc_tasktype%3D%7BfirstSimpleSearch%7D&sc_hit=1

这是第二页,但是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建模和可视化部分!下次更新再见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342