前几天,小小逛问答的时候,给自己留了个坑。说要写文介绍一下怎么用Excel/PBI来爬网页数据,前天写了三篇中的第一篇,昨天写了三篇中的第二篇,所以。。。可以推导出来今天大结局么?嘿嘿。
日常数据分析工作中,我们可能常常需要从网上抓一些数据来辅助自己的分析。那么除了简单的复制粘贴之外,我们有没有其他的办法来完成这件事呢?或者说,有没有更灵活,更简单,自动化程度更高的办法呢?有。
我们用工具来抓的数,往往不只简单的一页,而是包含N多页。那么在点击下一页,或者末页的时候。有两种情况。
第一种情况是点击下一页的时候,网址变了(a)。
第二种情况是点击下一页的时候,网址没变。而网址没变的情况,又分为两种,一种是在你点击下一页的时候,实际上一段Java script运行了(b)。另一种情况是,只是你看到的表象发生了变化(c)。
这三种情况的难度由难至易为(b)>(a)>(c),(c)和(b)的解法,请参考下面的链接。然后我们今天再聊聊(a)。本篇较长,没空的小伙伴可以先收藏,慢慢再看。有空的小伙伴,也可以收藏,以备查找时方便。
丁小小Jia:用Excel/Power BI/Power Query能爬取网页数据?1/3zhuanlan.zhihu.com先来看下演示用的数据。
https://www.quanthockey.com/khl/seasons/2017-18-khl-players-stats.html
因为这个系列我们讲的是三种不同的情况。所以用了三个不同的数据源来演示,大家以后也可以先判断遇到的数据是哪种情况,然后选用对应的方法。
示例数据的预览如下。
小小点开的那个下拉菜单,是可以选择的年份。我们选择不同的年份,可以看到,网址是变的。
关于这个问题,昨天的文里,讲过了怎么解。
可是,这个表格其实有很多页,如果我们点击第N页的时候,会发现,网址并没有发生变化。请看。第11页和第15页的网址,是一毛一样的。
造成这个现象的原因是,我们在点击下一页的时候,网站用了JavaScript来刷新我们需要的数。再细我也不说了,因为并不是本文的重点。
现在我们遇到的问题主要是以下两点:一是换页的时候,网址不变。二是不知道多少页。当然我们可以转到最后一页,看看是第几页,可如果这个数据在增加,以后变成N+1页呢?有没有不需要改代码就可以完成的方式呢?
我们一个一个来解决。首先我们需要下载一个工具。后面我再说为什么要下载。这个工具叫作Fiddler。下载地址在这里。https://www.telerik.com/fiddler
安装完成,打开后,应该可以看到下面的界面。
点击Inspector这个页签(上图中高亮的),可以看到下面一行Please select a single web session to inspect。
此时打开浏览器,粘贴网址。本文演示用的是Edge,其他的也可以。
上面那一行蓝色的,是重点。我们按下图把URL复制到Excel中,看一下。(复制到其他能粘贴文本的地方都可以)
得到的结果是这样子的。
好像只是一个网址。跟我们复制的没什么区别。而我们看到的也只是网页默认的第一页数据。我们继续点击该网址上显示的第2页,重复上述操作。再点击第3页,重复上述操作。再点击第4页,重复上述操作。然后得到了这样的结果。
有没有发现,网址变了,而且有规律的变了?哈!是的,我们解决了这个网址不变的问题。那是不是就可以按照上一篇文的办法捞数据了呢?且慢,我们还有一个页数未知的问题没有解决。
懒得看解法的同学,可以直接跳到最后一步找代码。想了解过程的同学,可以跟小小一起做。前面已经详细讲过怎么用参数来拿数据,所以这里只是快速过一遍。想看细节的伙伴们请移步上一篇。https://zhuanlan.zhihu.com/p/144932623
我们打开Power Query Editor,新建一个参数,命名为PageNumber,并将其类型设为小数。Current value设为1。
然后我们依然按照传统的从网页拿数据的套路,但是在粘贴网址的时候,不是一味的粘贴了。请看图。
这里需要注意的一点是我们网址的第二部分。此处需要手动输入这段包含参数的代码。但是如果先用上一篇文章提到的办法把数据先下载进来,再建参数,那么网址的那一段,就可以在下拉列表里面选择。还有一点就是,前面我们把参数的类型设为小数,这里需要再把它变成文本,在网址里面才可以正常起作用。为何要这样操作,后面会提到。
然后我们得到了下图。点击右上角的表格。注意,是点击带下划线的Table,而不是右上有展开表格的那个双箭头。
点Continue,得到下图。请注意,我们只得到了第一页的50条记录。
打开高级编辑器。看到的代码是这样。
改成下图这样。其实只是增加了一行。增加的这一行,将这条查询变成了公式。然后将其改名为Fx。
这之后,再新建一个空白查询。在公式栏输入以下代码。注意在公式栏输入的话,是有"=",打开高级编辑器再输入的话,无需"="。
= List.Generate( () =>
[Result= try Fx(1) otherwise null, Page= 1],
each [Result] <> null,
each [Result= try Fx(Page) otherwise null, Page = [Page] +1],
each [Result]
)
将我们刚刚建好的这个列表,改名为All。得到下图。
然后我们将它转换为一个表。再展开。
然后就可以关闭并上载啦。
写在后面的话。
哇,终于写完啦!希望看到的小伙伴们都能在不久的将来用到这些小技巧,帮助你们更轻松的完成工作。小小在写的过程中,常常在多包括细节和不要太啰嗦之间挣扎。如果哪里写得不够详细,请在评论中指出。小小再来增加。
还有小伙伴们说,这明明就是EXCEL,哪里有PBI?因为这里的操作主要是在PQ里面进行,EXCEL和PBI的PQ百分之九十九相似,所以演示的时候,就选择了一个来操作了。
大家还想看什么,欢迎留言哦,我会尽快在新的更新中,包括留言中的话题。
喜欢小小的请点赞,关注。小小在此谢过啦。