如何能正常获取17track物流网站的物流信息?
原本昨天就要发文章的了,由于之前的pdd文章被投诉了,删除了,影响心情的同时也不敢乱发文章了,所以就暂时歇了一天,也改了另外一个网站,就是今天的物流网站。如果大家某天看不到我发文了,估计我也是被举报完了,到时想要看的可以去我的GitHub上看。
献上GitHub:https://github.com/SergioJune/Spider-*****-JS
对你有用的话,希望能点个star,谢谢
今天网站:https://www.17track.net/zh-cn
这是个物流网站,就是查询物流的,今天要做的就是根据单号查询物流,废话不多说,直接肝。
1. 找到所需数据的 URL 请求
这里我们查询一个单号,也可以批量查询,参数都差不多,长度变了而已,所以演示就只查询一个单号。
打开了开发者工具你慢慢找,很容易就找到这个请求。
需要的数据就是这个快递轨迹,看到上面的 formdata 好像没什么问题,挺容易的,这还有什么比这爽的,赶紧使用 python 请求一波。
结果返回了这个,果然没有想象中的那么简单,估计又是在cookie上面做了反爬,那我们就加上cookie试试
果不其然,真的成功了,经过我的测试,发现需要的cookie 键是** Last-Event-ID** ,那接下来就是看怎么生成的了。
2. 寻找生成位置
上面知道了是哪个 cookie 反爬的,最简单的寻找就是全局搜索这个参数来看看有没有线索。
果然有,而且文件名字和请求的路径名有几分相似,按经验来说八九不离十就是这个了,点击进去看看。
格式化就可以看到上图的代码,一眼看去,这代码很像我之前这篇请求网页时,怎么给我返回了一段 JavaScript 代码,都是前面一个大数组,然后在一个地方把这个数组的顺序,然后通过一个函数来将这个数组的元素来解密成正常的函数名。接着就是检测你有没有展开代码之类的,展开了就会内存**,具体的都可以看看我刚说的这篇文章。
有了上次的经验,我就直接在浏览器上格式化直接调试了,不把代码复制到本地运行了。
了解了这么多,就是开始调试了,由于我们需要找的 cookie确定是在这个文件内生成,但是还不知道在哪生成,所以需要调试下。
涉及到 cookie, 需要先把浏览器的cookie清除才行
点击 **clear site data **即可清除,不放心的就点多几次。
接着就是在调试栏的右边的 watch 添加我们监听的变量,我们需要监听 cookie 的变化,所以点击 + 号添加 document.cookie 即可。
接着打断点的位置就在我们搜索到 cookie 值的位置上添加即可
接下来就是刷新网页,等待程序跳到断点的位置
这时看到 cookie 的值是空的,在 application 上看的 cookie 也是空的
接着就是按下断点执行下一行语句,不会的先自行百度,这个调试肯定得学会的,这里就不多说了,或者我过两天有时间写篇 chrome 调试供大家参考下。
现在就是漫长的调试寻找加密的时间了,经过我的查找,很快就可以看到这个了。
下面的那句明显就是设置 cookie 的,可以自己复制语句到 console 上运行一次
这样子就找到生成位置了,现在就是查看右边的调用栈,查看是在哪个地方开始执行的,看看他们之间的调用关系。
3. 把生成的参数代码扣出来
在上面的cookie 生成可以看到是一个数组,然后使用 join() 来连接起来的
我们可以观察这个数组在哪里生成和赋值的,也通过调用栈可以看到参数生成地方是在这里
我们可以先把这个语句所在的函数扣出来
发现里面的函数有些 document 对象,又因为这个是主函数,所以可以修剪下,把那些判断语句和捕捉异常的都给去掉,就是在原文件中看判断语句的真假运行的哪个语句就保留,而正常运行不会产生异常,所以把处理异常的也给去掉,就成了这个样子。
然后直接使用浏览器打开运行查看错误
然后对比原文件中的参数 ,发现这个是我们传的 formdata,所以为了测试先赋值一个即可。
接着是这个错误,这个未定义,也是在原文件中看他的定义处即可。可以这样看
点击上面箭头所指的地方即可到达定义。
直接到达这里,看到了他的定义,所以直接从这里扣出来到最后定义完之处即可,再次刷新,看到变成了另一个错误
也是在原文件中找定义即可
这是个解密函数,就是我上文说的将加密数组元素解密成正常的函数名,直接扣出来即可,同时我们还需要找个数组,就是第一行的。
再次刷新,浏览器卡了起来,甚至出现了崩溃
这就是所谓的内存**,这时因为里面有个函数检测到了你展开了代码,所以就来内存**,这个都是我在请求网页时,怎么给我返回了一段 JavaScript 代码这里得到经验的,如果你需要调试寻找的话,可以先在我们扣出来的代码随便写个错误,在文件代码出现,然后在第一行加上断点进行调试即可,剩下的就是自己一步一步调试找出内存**位置了。
由于说过了,就不多说了,突破了继续刷新也会遇到一些未定义的,也是同样扣代码,就不多说了,这里说另一个。
这里明明已经是定义了,却显示未定义,打了断点一看,原来是函数名字都是乱码的
这是因为我们在第一行定义的数组是乱序的,需要还原下,这个需要自己一步一步调试查看原文的,我这里就直接说了
里面可以打上断点查看即可。
剩下的还是重复原来的步骤,查看错误,扣代码即可,由于篇幅这里就不多说了,有问题可以去公众号「日常学python」菜单栏加我微信拉进交流群交流。
4. 用 Python 运行获取结果
这里还是使用 PyExecjs 库来执行 JS 获取cookie值,如果还原成python 语言成本太大了,不适合。
代码也没有什么的,具体的可以去 github:https://github.com/SergioJune/Spider-*****-JS 上面看
最后
这篇文章昨天就想发了,无耐太累,就一直拖到今天了,有点对不起读者,还有 pdd 的已经被删除了,想看的可以去 github 上看。
最后,原创不易,希望大家多点赞多转发分享给你的好友,点赞转发越多,我就写得越多!!!