python爬取百度学术文献_爬虫小项目之三 学术文献爬虫+词云(上)

八月已经过了一半,答辩完之后,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

我主要想拿的其实是网址:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值