需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
http://scxk.nmpa.gov.cn:81/xk/
但是我们要爬取详情数据,不是首页中直接显示的东西;
思考,直接对当前的url发起请求,会不会得到包含企业名称,发证机关等数据,最麻烦的办法是,对这个url发起请求,然后看相应数据中是不是包含这些信息。
为什么想要在首页中获取这些数据?因为点击企业的时候发现,每一个企业的名称对应一个超链接,最终想获得详情页所对应的页面,详情页对应的页面,应该由首页中每家企业所对应的超链接A标签的href属性值所提供的,这意味着,如果对首页的这个URL发起请求,可以拿到当前页面的这些信息,
就相当于是拿到了每家企业所对应的A标签都可以拿到,即可以获取其中的href值。
所以,现在先验证猜想,对当前url发起请求,能否拿到当前看到的完整的页面。
验证猜想方法:
-
可以直接爬取这个网页的数据以验证猜想:
发现并不是这样,通过requests模块发起请求,并没有得到想要的数据,说明当前页面的相关详情数据一定不是由当前地址栏中的url请求得到,说明这里面可能含有AJAX请求。
-
通过抓包工具验证猜想:
打开抓包工具,点击network,并再次对这个url发起请求,并在all这个选项卡中找这个url对应的数据包,
这个数据包的响应数据在response选项卡中存放,这里面对应的源码数据就是通过requests.get请求到的数据。
然鹅requests这种并没有相关企业信息。
所以得出结论,想要的企业数据是通过动态加载得到的,可能是由AJAX请求得到的。
打开抓包工具,并选择XHR选项卡,看Headers,发现是POST请求,携带参数,返回json。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
打开Response选项卡,能看出来,这个json文件中的确包含了我们需要的数据,说明首页中对应的企业信息数据是通过ajax动态请求到的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
我们希望找到详情页所对应的url,通过对得到的json数据进行观察,发现并没有详情页的url,
但是有每个企业的id值,多打开几个页面找规律能发现,只有这个id不一样,这样我们通过这个id值可以拼接出每家企业的url
验证一下,这个拼接而成的url会不会还是动态加载数据。
能看出来,企业的详情信息依然是动态加载出来的。同理,验证这个数据是不是通过AJAX方法得到(验证方法同上)
是post请求,携带的参数是id,id可以从首页所对应的AJAX数据包所响应回来的json串中进行获取。
返回的数据类型还是json。
总结
-
动态加载数据
-
首页中对应的企业信息数据是通过ajax动态请求到的。
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=e6c1aa332b274282b04659a6ea30430a
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=f63f61fe04684c46a016a45eac8754fe- 通过对详情页url的观察发现:
- url的域名都是一样的,只有携带的参数(id)不一样
- id值可以从首页对应的ajax请求到的json串中获取
- 域名和id值拼接处一个完整的企业对应的详情页的url
- 详情页的企业详情数据也是动态加载出来的
- http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
- http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
- 观察后发现:
- 所有的post请求的url都是一样的,只有参数id值是不同。
- 如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url
- 通过对详情页url的观察发现:
以及,这里有更加完整的笔记和文件,欢迎访问,仅供学习交流
https://github.com/jiayoudangdang/python_note_chapter_two_requests_module