小科普:数据爬虫究竟是在干啥

今天有个小目标:用一个网站实例来做展示,给大家科普下数据爬虫工作的过程。不知道最终效果如何,如果你能看到最后,不妨评论下你的感受。

了解任务

首先,选定的网站是 爱尔眼科官网 https://www.aierchina.com/

ae7bee5098b3700790ec8342a00fd72b.png

866665130a1589549316939d38808545.png

1a932456492d8d191dbbed45ad15dc19.png

通常,医院官网比较有价值的数据是它在全国各城市的医院门店信息,比如我选择主页上的【找医院】-【山东省】-【东营】,便会进入东营市医院信息页面:

4f69e7dc79abc64a108bb8d76ea8635d.png

1b4f246f2d942db1ea46e387cf2a8cac.png

66fa43405d6e1927fc158397d6f1ffcf.png

选择后省份、城市后,浏览器会跳转到:

https://www.aierchina.com/hospital/shandong/dongying.html

2f1522d812e1ecb74b188122ddaa3581.png

9d7136f6deb685f9a94b510d63b3c471.png

a6e90cc7d1caeddebcb7beb74e0dba70.png

该页面上所有医院的地址、项目、时间等信息数据,便是我们想要获取的有价值信息。

到这里,我们的任务目标就比较明确了:将爱尔眼科官网上所有省份城市的医院数据全部下载下来。

设计方法

如果完全不懂代码编程,那么完成上面的任务,就是手动一个个选择各个城市、进入所有城市医院信息的页面,然后将每家医院的信息复制、粘贴到表格中。

爱尔眼科网站展示的医院数目约 450 多条,顺利的话,手动能几天内搞定。

那么如果想用代码来自动化实现上面的过程,要怎么操作呢?

首先你要知道,网站页面上展示的所有信息,其实是在你输入网址、敲下回车之后,浏览器发出了请求、接收到返回信息、再展示给你的

那么代码编程,就可以不用再去打开浏览器、输入网址敲回车,而是直接通过代码来直接发送请求。

原本是浏览器接收到返回信息,再展现给我们;代码编程就可以拿到返回的信息,直接对这些信息处理、提取关键数据。

回归到爱尔眼科官网,我们首先需要获取到每个城市页面对应的网址,然后在城市页面上提取展示的医院信息

城市网址

刚有说代码会直接发送请求来获取网站返回的信息,怎么理解呢?可以在任意网站上【点击鼠标右键】-【查看网页源代码】,这里展示的与网站返回信息比较接近了。

比如,爱尔眼科官网首页-查看网页源代码,向下拉到大概 600 多行:

86aafa228706c0635e55959e8f5350a7.png

24f3e710d22305a33bbf08d371fac0d9.png

dba6a2c6c078ca08f74e2d4997fba9ee.png

基本每个城市对应一个网址,看着特别像所有城市的网址。暂且先把它当成我们第一步要用代码提取的信息,OK,我们现在已经拿到了所有城市对应的城市页面网址了。

医院数据

拿到了城市页面的网址,我们也可以通过【网页源代码】查找其中医院信息:

156f39ad4a80ded8a986ae470e79da5d.png

6cb44b81162b1cc62dc8680d251bfaa5.png

d4da86963482a7f7cdcd85f3c0dde2df.png

用代码将其中所有医院数据提取出来,我们便完成了对一个城市所有医院信息的抓取数据工作。

既然一个城市的抓数流程走通了,便可以对之前提取到的所有城市网址链接都进行同样的流程,从而获取到所有城市的医院数据了。

代码编程

梳理出上面的思路,最重要的便是写代码来实现整个过程了。这里我不展开具体代码逻辑,之前我自学 Python 时觉得用 Python 写爬虫比较轻松,工作里接触到 NodeJS 爬虫,对比着会觉得其它编程语言来写爬虫也没有那么麻烦。

所以只要合适、自己能上手,选择什么编程语言其实没那么重要,只不过换了种语法来把我们设计的流程实现罢了。

改 Bug

如果身边有程序员朋友,可能会经常听到他们说【改 Bug】,那究竟啥是【改 Bug】呢?

Bug,漏洞,也就是代码中错误的地方。

而我,恰好在爱尔眼科官网首页上,就发现了不少问题,也就是刚提到的不少 Bug

如果你有在爱尔眼科上班的朋友,可以顺手把这些问题转给他看了。

刚我们在首页的【网页源代码】中找到了各个城市对应的网址链接,其实这里面的上百条链接中,有13条拼写错误:

4a9dc7e9740187ef108b5e79fca45bd7.png

6617d1470317e7ce21c206869059313c.png

3c07082e94119b97d67446f519651f89.png

看代码可能比较头大,可以在手机端访问  https://www.aierchina.com/ 打开爱尔眼科官网,点击右上角的选择定位按钮,选到首字母 B 的蚌埠(或者首字母 C 的池州,总共有 13 个城市会报错)

23109be8f3bb8d892a8831864e294e3a.png

350374101dd688fe416f9b3e172a8245.jpeg

8f9f6d13c25cc03d71c0708e0f2a41f0.png

共有13个城市的链接有问题,原因部分是拼写错误、部分是省份和城市拼接错误,比如原本山东临沂错拼成 shanxi/linyi,再比如陕西西安拼成 shanxixi/xian,还挺潮的,陕西西。

这些由于程序员写代码时造成的错误,就是常说的 Bug 漏洞的一些例子,而改 Bug 就是将这些错误改正,使得用户使用时页面可以正常跳转。

抓数优化

刚我们梳理了整个抓取数据的过程,定位到错误的城市网址并进行改正,理论上应该能拿到所有城市医院数据了。

但是,官网首页代码中的城市链接是不全的,直接体现就是手机端访问爱尔眼科官网,城市列表比电脑端可选的要少。

既然有遗漏,那么我们就没有把城市抓全,自然就要去检查缺了哪些然后去补上。

我第一遍抓取这网站的时候,就是遇到了这个坑。

细心的话,你应该也发现了,电脑端展示省份和城市的方式,和手机端展示城市的列表方式,是有些差别的

是的,换句话说,刚我们遇到的问题、Bug,来自于移动端所依赖的城市网址们。

想要完全解决这个问题,我们需要从电脑端选择省份、城市的方式上去找思路。

最终,我也是在网站返回的数据中,找到了相关省份城市的数据,它没有直接展现在页面上,而是藏在了 JS 代码中,从而拿到了完整的城市网址数据。

9ef5a690deb1a7d9202183040d9ac507.png

f63ca46824ff05e4724008033da5fda7.png

0f16cbd6ff4a0c13eaa1946611b6cbae.png

拿到完整的城市网址数据,便解决了遗漏城市的问题,我们的抓取所有城市医院数据的任务才算圆满完成。

最终把得到的数据写到 Excel 表格中,大致样子如下:

149b6cfe67a330f9d9321881c07d30b1.png

196ae9150a842692f92efb6839fc97f7.png

5248e7a1a037a77baa6c23c27bac9ce4.png

总结

看到这,如果对编程不感兴趣,我猜你已经觉得麻烦了吧。

在上面的抓取数据过程中,我们用代码编写的程序,像是一个个蜘蛛(爬虫),在网络上去获取我们想要的数据——也因此,抓取数据又被称为爬虫、爬取数据

但上面描述的过程,全部都没有提及编写代码来实现这个过程,其实这个才是程序员实际的劳动,其中也会有各种细节要处理,去发现并解决各种 Bug。

看到这,应该能理解为什么高级程序员都是绝顶聪明了吧。

而上面描述的这个抓取数据的任务,只能算初级难度的爬虫任务,因为在整个过程中,网站并没有对我们做限制、我们提取数据的过程也没有太多障碍。

一旦网站对我们访问做些限制,比如验证码;或者将数据进行处理,比如设置编码格式或加密,那么我们就需要将这些困难一个个克服来获取最终的结果。

以上,便是一个完整抓取爱尔眼科网站上医院数据的流程了,感受如何?

如果有朋友还不知道爬虫、程序员每天都在干啥,也可以给他科普科普了~

最后,可能有人疑问:我闲着没事,去下载这些医院数据干嘛?

医院数据的价值可能不好直接体现,不妨把它换成一个个用户数据……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值