这次给大家带来复杂点的ajax请求该如何破?

公众号由于私人原因差不多一个月没有更新了,首先还是得感谢没有你们,没有取关我,很开心。其次我会在以下的两个月时间为大家输出高质量的文章,让你们能学到东西的同时,也可以让我自己得到提升。好了,闲话不多说,开始正文!

本次文章是写如何应对复杂点的ajax请求,上篇文章简单写了下简单点的ajax请求,也就10行代码就可以把数据都抓下来了,可以说非常强大。有兴趣的可以看看

谈谈如何抓取ajax动态网站

本次需要用到的工具是charles工具进行抓包。这个工具大家自行百度下载,不会用的话也可以百度下,本篇文章就不对这个工具多说了。用这个工具是它有强大的搜索功能,可以一键搜索出我想要的网络请求。

需求是获取所有药品的详细信息,第一眼看上去是觉得不难的,点了进去你才知道是有坑的。

比如上面这个,需要获取详细信息就需要模拟点击那个三角形按钮,就需要通过发送ajax请求来进行获取了。

而且在你点开的时候还需要进行登陆才可以获取全部信息,所以这就多了一步,我们需要先模拟登陆成功后才可以进行aax请求来获取信息,要不然没用。

1.模拟登陆

登陆是在这个网址上进行登陆https://auth.dxy.cn/accounts/login?service=http%3A%2F%2Fdrugs.dxy.cn%2Flogin.do%3Fdone%3Dhttp%253A%252F%252Fdrugs.dxy.cn%252Fdrug%252F54565%252Fdetail.htm

可以看到需要验证码,不过问题不大,可以解决。这个时候我们需要打开开发者工具,按下f12即可,然后点击持续日志,进行登陆,可以看到下面的图

拉下到fromdata可以看到下面数据

经过多次测试,username和password是登陆账号和密码,validatecode是验证码,nlt是一个加密参数,由js加载而来的,其他的都是不变的。由于nlt参数是由js加载的,这就需要用到charles工具了。

登陆成功之后很容易就可以在charles找到这个请求,让我们先看看nlt参数是怎样来的。

我们可以先复制这个nlt参数,然后在charles工具内按下ctrl+f就会出现这个页面

把那两个勾选上,然后把nlt参数内容填上,点击find就会看到下面的内容,下面就是产生nlt参数的地方,点击进去,可以看到下面内容。

nlt参数是在html里面就提供的了,这就不需要去解析js了,这就相对容易点,再看看请求网址

请求网址可以看到是和登陆网址一样的,说明nlt参数直接提供的了,我们只需要使用正则来将nlt参数提取出来即可,现在看看验证码是在哪个请求产生的就可以了。

看到上面这些就知道验证码怎样来了,直接使用get请求对那个网址即可。

分析完了,接下来就是代码部分。

2.使用python来模拟登陆

这是部分重要代码,里面都有注释,就不多说了,进入重要部分吧。

3.分析ajax请求

登陆成功之后。随便点进一个页面都可以然后点击三角形按钮都可以看到详细内容

我们继续使用charles工具来进行抓包,先对charles刚才抓的 包进行清理,然后点击页面三角形按钮来进学校获取信息

可以看到上面的这个请求 ,数据都是Unicode编码的,我们需要转,其实可以直接复制然后到命令行窗口进行打印即可,就可以看到这个就是我们想要的详细数据

接着看下请求方式和其他需要的东西

可以看到,是个post请求,成功状态码是200,有很多参数,经过多次测试后,发现下面箭头所指的五个参数都是会变化的,第一个为药品id,第二个可以通过抓包发现(和上面获取nlt参数都是一样的方法)是经过js来加载的,注意,要想在charles里面加载js要先把浏览器的缓存先清除掉才行,要不然不会加载出来,抓包是抓不到的哈。第三个变的也是药品的id,第四个就是通过药品页面加载出来的,而最后的batchId的起始id是2,之后每获取一个详细的内容该参数就加1。

好了,需要的内容都分析出来了,最后就是剩下实现部分了。

4.用代码来进行ajax请求

这个是获取药品的页面内容的

这个是获取页面中需要进行ajax的请求的方法

好了,就是这么多了!上面重要的不是代码,而是思想,只要你的思路跟上了,别的什么ajax请求都是这样子的,所以爬虫没什么难的,分析这些ajax请求主要还是怕遇到加密参数,需要解析那些混淆js,这些自然而然就是爬虫的主要部分了,做爬虫的主要还是想办法避开这些东西。

最后

看到这里的一般都是真爱粉了,首先还是得感谢你们得支持哈!!!如果觉得文章对你有用,不妨点个赞,留个言,转个发哈。这就是对我最大的鼓励。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180711A09FSM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券