爬虫案例|从攻克反爬机制到地理信息可视化!

爬虫案例|从攻克反爬机制到地理信息可视化!

上图是上海医疗服务信息便民查询系统网站(http://www.soyi.sh.cn/)上公布的医疗机构位置的热力图。

本案例先从该网站抓取全部医疗机构的坐标信息,然后用免费的BDP个人版(http://www.bdp.cn)在线做图。爬取数据时,我找到了数据的API接口,但是获取数据时发现获取失败。排查原因,发现是网站用了一种反爬虫的机制,我用伪造Cookie的方式绕开了反爬机制,顺利获取到数据。

下面开始一步步讲解。

  1. 在Chrome浏览器里输入网址 http://www.soyi.sh.cn/ 看到公告页
  2.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 点击下面的 前往搜医网 链接,然后看到的才是真正的主页
  3.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 寻找数据
  3. 点击上图分类列表里的不限链接,首页就会出现数据库里所有医疗机构的信息列表。
  4.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 信息加载后,网页网址并没有发生变化,所以怀疑网页用了异步加载的技术。接下来用快捷键 Ctrl + Shift + I 打开Chrome的开发者工具,切换到Network标签栏。重现刚才点击页面的操作,也就是再点击不限链接,页面就重新加载了。
  3.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1. 进群:548377875 即可获取数十套PDF哦!
  2. 然后发现,多出了6个请求,第一个是个XHR类型的请求,这就是异步加载的意思,后5个是图片,不是我们关心的。选中第一个请求,看看Preview,发现页面上展示的信息,就在里面,是个JSON格式的数据
  3.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 所以第一个请求就是我们要找的数据接口。再看Header信息
  3.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. Request URL是 http://www.soyi.sh.cn/h/show?page=1&type=2&qx=&traps=&category=&category_s3_ul=&level=&tech=&calve=&quick=&stype=&length=10
  3. 页面上显示,总共有505页的数据,我们看到的是第一页,上面URL里,我把page=1用红色标出来了,能猜出来什么意思吧。
  4. Request Method表示的是请求方法,在这里是GET方法,这决定了我们在用Python写爬虫时用什么函数获取数据。
  5.  
  6. 第一次尝试获取数据
  7. 用requests库里的get函数获取接口的数据
  8.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 发现抓取下来的并不是JSON格式的数据,查看下结果,发现是我们最初访问的公告页的代码
  3.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2.  
  3. 反爬虫机制的分析
  4. 尝试给上面代码里的URL赋予该网站其他页面或链接的网址,结果都出现公告页的HTML代码。
  5. 我猜想该网址是不是用了这样的反爬虫机制:如果用户第一次访问该网站,就会自动跳转到公告页,如果已经访问过该网站,就会获得想查看的资源。而网站判断用户有没有访问过,依据是session和cookie,前者是在服务器端控制,后者在浏览器端留下痕迹。
  6. 怎么验证我的猜想呢,我现在再次访问网址http://www.soyi.sh.cn/ ,发现直接看到了网站主页,而不是公告页。请回过头看看第一步里公告页的网址
  7.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 发现并其网址并不是http://www.soyi.sh.cn/,而是http://www.soyi.sh.cn/op,说明在我第一次访问网站时,发生了页面跳转,而再次访问网站时,不会跳转。
  3. 然后我再换个浏览器,访问http://www.soyi.sh.cn/,发现果然转到公告页了,因为此时是用新的浏览器第一次访问该网站
  4. 以上证明我的猜想是正确的。那要怎么攻克这道防线呢?
  5.  
  6. 伪造Cookie
  7. 为什么这种反爬的手段有用呢?因为人登录网站,只要访问过,就会在浏览器留下Cookie,证明已经访问过了。但是如果用Python代码来获页面,就留不下Cookie。
  8. 我这里用的突破手段就是用Chrome的开发者工具,拿到浏览器里的Cookie,强行加在Python爬虫的代码里,让服务器识别不出这是个爬虫程序。与其说是伪造,不如说是借用Cookie。
  9. 还是回到寻找数据源的那步,查看Header信息里的Request Headers,找到Cookie那段,把Cookie信息复制出来。
  10.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. Python爬虫程序
  3.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 可以看到,跟之前的代码相比,我再调用request.get函数时,增加了headers参数,在headers参数里,把Cookie和浏览器型号等信息加进去了,目标网站的服务器接收到这些信息就会以为我的程序是浏览器,并且已经访问过他们网站,于是给我发送了医疗机构的数据,也就是后面的res变量。利用json模块解析后,得到的res变量是个字典构成的列表,列表里每个元素都是字典,代表一个医疗机构。
  3. 数据整理
  4.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 上面得到的变量res可以直接转化为数据框,代码如上。
  3. 获取全部数据并整理
  4. 上面获取的res变量只是全面医疗机构的一部分,总共505页数据,我们只拿到了第一页,不过这已经跨过了一大步。
  5.  

爬虫案例|从攻克反爬机制到地理信息可视化!

  1.  
  2. 我们第一页的数据会获取了,其他504的数据,只要做个循环就行了。在每一步循环里,都把抓下来的数据写到csv文件里,并且是附加的方式来写文件,而不是清除前一步文件里的内容。
  3.  
  4. 可视化

这步比较简单,在BDP个人版(http://me.bdp.cn)网站上注册个账号。

先上传好数据。

再创建仪表盘。

爬虫案例|从攻克反爬机制到地理信息可视化!

然后添加图表,选经纬度地图,选择之前上传的数据soyi。

爬虫案例|从攻克反爬机制到地理信息可视化!

设置好经纬度对应的变量名称

爬虫案例|从攻克反爬机制到地理信息可视化!

剩下的工作就是托托拽拽了,看看帮助文档的动画就会做了。

  • BDP帮助中心 https://book.bdp.cn/
  • 视频教程 https://me.bdp.cn/instructional_video.html

爬虫案例|从攻克反爬机制到地理信息可视化!

加群:960410445    领取数十套PDF哦!

看完本文是不是觉得爬虫其实很简单呢?

如果你想进一步学习更多案例,或者现在手头有网站数据项爬取,不如来参加我们的网络爬虫和文本分析实战案例研讨会。我们的原则是,能少学代码就少教代码,能不写代码就教你不写代码完成任务。

我们的课程专门为人文财经类专业的学员设计,除了R和Python,还会教knime软件,让你轻松点击几下鼠标就能完成文本分析。

爬虫案例|从攻克反爬机制到地理信息可视化!

猜你喜欢

转载自blog.csdn.net/qq_42156420/article/details/84938980