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

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

作者: Charles_ye | 来源:发表于2020-08-18 21:34 被阅读0次

    八月已经过了一半,答辩完之后,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建模和可视化部分!下次更新再见!

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/kckzdktx.html