运用抓包爬取动态加载网站--案例二

网站分析

目标网站:http://www.metagene.de/

这是一个描述疾病、症状与基因的知识库。
疾病详情
要收集的数据是左边的每一个疾病条目对应的diseases(疾病详情),symptoms(症状),lab(实验数据),normal(正常样本数据),literature(相关文献)的全部信息。
点击右边第二栏的”symptoms”,url 没有变化,且网页加载了一会后才显示信息。如下图:
symptoms
为啥会这样?
再点几个试试…
lab
normal
url 都没有变化,后来我发现更神奇的是,点击页面上方导航栏的其他位置,url也是没有变化的:
symptom-nav
lab-nav
可以断言,该网站是动态加载数据的。
想通过传统的方式(Selenium,Beautiful Soup)来定位和提取数据也是比较困难的,我当时爬的时候也是踩了一路坑,比如每次刷新页面,元素的id是会改变的,而且需要通过下拉刷新来获取新增的元素节点,等等。

换一种思路,尝试用抓包,就柳暗花明了。
打开 Chrome 控制台,切换到 Network 选项,刷新页面,点击上方导航栏的 diseases,就可以定位到动态加载的数据块来源:
api-diseases
找到该HTTP请求的资源位置,只复制红色部分,后面是一串随机生成的id,加不加是一样的。将该 url 粘贴到 Chrome 地址栏,回车,即可得到:
diseases-api-内容
密密麻麻的 json 数据,简直有点密集恐惧症。不过总算获得我们想要的数据了。

接下来分别点击每个疾病条目的相应信息,观察控制台的网络变化,就可以找到每一部分(diseases, symptoms, lab, normal, literature)的 api 接口了。

是不是超级方便?

下一步

api 有了,剩下的就是对 json 数据进行结构化整理,变成我们想要的样子了。因为处理起来有不少细节问题,整个项目代码也比较多,就不展开了~

需要注意的是,有的 json 数据格式不规范,需要使用正则表达式进行修正。偶尔接口返回的数据有问题,这时候重发几次请求,或者延长连接的超时时间就可以解决了。

抓包讲了两个案例,也差不多啦。(其实是因为我就做过这两个哈哈)
这两个网站虽然都属于医疗方面,但是跟其他网站的分析思路是一致的,相信各位可以举一反三。