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

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

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

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

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

下面开始一步步讲解。

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

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

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

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

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

  所以第一个请求就是我们要找的数据接口。再看header信息  

  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 页面上显示,总共有505页的数据,我们看到的是第一页,上面URL里,我把page=1用红色标出来了,能猜出来什么意思吧。 Request Method表示的是请求方法,在这里是GET方法,这决定了我们在用Python写爬虫时用什么函数获取数据。   第一次尝试获取数据 用requests库里的get函数获取接口的数据  

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

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

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

  Python爬虫程序  

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

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

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

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

先上传好数据。

再创建仪表盘。

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

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

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

BDP帮助中心 https://book.bdp.cn/ 视频教程 https://me.bdp.cn/instructional_vIDeo.HTML

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

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

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

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

总结

以上是内存溢出为你收集整理的爬虫案例|从攻克反爬机制到地理信息可视化!全部内容,希望文章能够帮你解决爬虫案例|从攻克反爬机制到地理信息可视化!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1208443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存