PQ- 综合实战:用Excel批量获取百度搜索结果——这感觉真是“爽”!
小勤:我这里有一堆的地址,能不能知道哪些是医院,哪些不是?
大海:呵呵,你自己看着这些地址能看得出来吗?
小勤:当然不能啊,上面又没写着医院两个字。只能一个个百度……
大海:那我们就让Excel自己去自动百度呗。
小勤:啊!这也行!
大海:Power Query不是可以做爬虫吗?专治这种批量累人活儿。
Step-01:获取地址数据到PQ
Step-02:添加自定义列,用百度搜索引擎对地址进行搜索(返回第一页,一般10-15条),这个函数非常简单,就是用Web.Contents读取网页内容。公式:Web.Contents("http://www.baidu.com.cn/s?wd="&[地址])
Step-03:添加自定义列,将百度搜索返回结果中的内容转为一行行的文本,公式:Lines.FromBinary([百度])
Step-04:展开读取的内容
Step-05:筛选其中的结果文字(通过Web.Contents读取的是整个网页的html源代码,通过观察,发现返回结果的题纲文字部分均包含在<em>标签中——学会找规律很重要。
)
Step-06:判断搜索结果中是否包含有“医院”字样,公式:
if Text.Contains([读取百度结果内容到每一行],"医院")
then "医院"
else "非医院"
Step-07:基于“地址”和“是否医院”列删除重复项
Step-08:结果上载(可按需要删除不必要的列)
小勤:这太牛了!居然可以直接连到百度去批量搜索!
大海:对的。不过即使这样,上面搜索出来的结果也要再人工校对一下,因为这种判断条件比较简单,比如其中的“北京东城区……”那个,有的地方就没有医院2个字。
小勤:啊,不过这已经很好了——咦!我刷新的时候怎么出错了?
大海:你没上网吧!
小勤:晕!刚网断了!对了,或者是不是可以换个思路,接受再宽泛一点儿条件——只要返回第一页数据里有医院2个字的,就都算作医院就是了。
大海:那你可以尝试再改进一下,比如先分组合并一下各个地址的返回结果,然后再判断一下,还记得那个合并同类项的文章吗?
小勤:嗯,记得。先分组,然后修改代码用Text.Combine函数合并内容。
大海:对。另外,如果你确定这种方式得到的结果就已经满足要求的话,你可以将几个步骤用到的函数结合到一起,这样避免中间的数据展开等过程,速度应该会快一些。我在案例数据文件里也写了一个,你先试一下,有需要的话也可以去参考一下。
小勤:好!我试试。