今天有个小目标:用一个网站实例来做展示,给大家科普下数据爬虫工作的过程。不知道最终效果如何,如果你能看到最后,不妨评论下你的感受。
了解任务
首先,选定的网站是 爱尔眼科官网 https://www.aierchina.com/
通常,医院官网比较有价值的数据是它在全国各城市的医院门店信息,比如我选择主页上的【找医院】-【山东省】-【东营】,便会进入东营市医院信息页面:
选择后省份、城市后,浏览器会跳转到:
https://www.aierchina.com/hospital/shandong/dongying.html
该页面上所有医院的地址、项目、时间等信息数据,便是我们想要获取的有价值信息。
到这里,我们的任务目标就比较明确了:将爱尔眼科官网上所有省份城市的医院数据全部下载下来。
设计方法
如果完全不懂代码编程,那么完成上面的任务,就是手动一个个选择各个城市、进入所有城市医院信息的页面,然后将每家医院的信息复制、粘贴到表格中。
爱尔眼科网站展示的医院数目约 450 多条,顺利的话,手动能几天内搞定。
那么如果想用代码来自动化实现上面的过程,要怎么操作呢?
首先你要知道,网站页面上展示的所有信息,其实是在你输入网址、敲下回车之后,浏览器发出了请求、接收到返回信息、再展示给你的。
那么代码编程,就可以不用再去打开浏览器、输入网址敲回车,而是直接通过代码来直接发送请求。
原本是浏览器接收到返回信息,再展现给我们;代码编程就可以拿到返回的信息,直接对这些信息处理、提取关键数据。
回归到爱尔眼科官网,我们首先需要获取到每个城市页面对应的网址,然后在城市页面上提取展示的医院信息。
城市网址
刚有说代码会直接发送请求来获取网站返回的信息,怎么理解呢?可以在任意网站上【点击鼠标右键】-【查看网页源代码】,这里展示的与网站返回信息比较接近了。
比如,爱尔眼科官网首页-查看网页源代码,向下拉到大概 600 多行:
基本每个城市对应一个网址,看着特别像所有城市的网址。暂且先把它当成我们第一步要用代码提取的信息,OK,我们现在已经拿到了所有城市对应的城市页面网址了。
医院数据
拿到了城市页面的网址,我们也可以通过【网页源代码】查找其中医院信息:
用代码将其中所有医院数据提取出来,我们便完成了对一个城市所有医院信息的抓取数据工作。
既然一个城市的抓数流程走通了,便可以对之前提取到的所有城市网址链接都进行同样的流程,从而获取到所有城市的医院数据了。
代码编程
梳理出上面的思路,最重要的便是写代码来实现整个过程了。这里我不展开具体代码逻辑,之前我自学 Python 时觉得用 Python 写爬虫比较轻松,工作里接触到 NodeJS 爬虫,对比着会觉得其它编程语言来写爬虫也没有那么麻烦。
所以只要合适、自己能上手,选择什么编程语言其实没那么重要,只不过换了种语法来把我们设计的流程实现罢了。
改 Bug
如果身边有程序员朋友,可能会经常听到他们说【改 Bug】,那究竟啥是【改 Bug】呢?
Bug,漏洞,也就是代码中错误的地方。
而我,恰好在爱尔眼科官网首页上,就发现了不少问题,也就是刚提到的不少 Bug。
如果你有在爱尔眼科上班的朋友,可以顺手把这些问题转给他看了。
刚我们在首页的【网页源代码】中找到了各个城市对应的网址链接,其实这里面的上百条链接中,有13条拼写错误:
看代码可能比较头大,可以在手机端访问 https://www.aierchina.com/ 打开爱尔眼科官网,点击右上角的选择定位按钮,选到首字母 B 的蚌埠(或者首字母 C 的池州,总共有 13 个城市会报错)
共有13个城市的链接有问题,原因部分是拼写错误、部分是省份和城市拼接错误,比如原本山东临沂错拼成 shanxi/linyi,再比如陕西西安拼成 shanxixi/xian,还挺潮的,陕西西。
这些由于程序员写代码时造成的错误,就是常说的 Bug 漏洞的一些例子,而改 Bug 就是将这些错误改正,使得用户使用时页面可以正常跳转。
抓数优化
刚我们梳理了整个抓取数据的过程,定位到错误的城市网址并进行改正,理论上应该能拿到所有城市医院数据了。
但是,官网首页代码中的城市链接是不全的,直接体现就是手机端访问爱尔眼科官网,城市列表比电脑端可选的要少。
既然有遗漏,那么我们就没有把城市抓全,自然就要去检查缺了哪些然后去补上。
我第一遍抓取这网站的时候,就是遇到了这个坑。
细心的话,你应该也发现了,电脑端展示省份和城市的方式,和手机端展示城市的列表方式,是有些差别的。
是的,换句话说,刚我们遇到的问题、Bug,来自于移动端所依赖的城市网址们。
想要完全解决这个问题,我们需要从电脑端选择省份、城市的方式上去找思路。
最终,我也是在网站返回的数据中,找到了相关省份城市的数据,它没有直接展现在页面上,而是藏在了 JS 代码中,从而拿到了完整的城市网址数据。
拿到完整的城市网址数据,便解决了遗漏城市的问题,我们的抓取所有城市医院数据的任务才算圆满完成。
最终把得到的数据写到 Excel 表格中,大致样子如下:
总结
看到这,如果对编程不感兴趣,我猜你已经觉得麻烦了吧。
在上面的抓取数据过程中,我们用代码编写的程序,像是一个个蜘蛛(爬虫),在网络上去获取我们想要的数据——也因此,抓取数据又被称为爬虫、爬取数据。
但上面描述的过程,全部都没有提及编写代码来实现这个过程,其实这个才是程序员实际的劳动,其中也会有各种细节要处理,去发现并解决各种 Bug。
看到这,应该能理解为什么高级程序员都是绝顶聪明了吧。
而上面描述的这个抓取数据的任务,只能算初级难度的爬虫任务,因为在整个过程中,网站并没有对我们做限制、我们提取数据的过程也没有太多障碍。
一旦网站对我们访问做些限制,比如验证码;或者将数据进行处理,比如设置编码格式或加密,那么我们就需要将这些困难一个个克服来获取最终的结果。
以上,便是一个完整抓取爱尔眼科网站上医院数据的流程了,感受如何?
如果有朋友还不知道爬虫、程序员每天都在干啥,也可以给他科普科普了~
最后,可能有人疑问:我闲着没事,去下载这些医院数据干嘛?
医院数据的价值可能不好直接体现,不妨把它换成一个个用户数据……