网页抓取解密(用Python编写解析脚本的时候,你就知道进行调试有多烦)
优采云 发布时间: 2021-10-16 02:30网页抓取解密(用Python编写解析脚本的时候,你就知道进行调试有多烦)
总结:工作快一年了,工作需要爬各种航空公司网站,从B2B平台到*敏*感*词*某航空公司官网。从最初使用webdriver+selenium爬虫到现在使用http请求解析html,遇到了各种各样的问题。虽然webdriver+selenium的方法是万能的,可以用JS编写方便调试,但是找了半天发现这个东西效率和稳定性都很差。, 放到服务器上动不动就挂了,两三天就需要重启一次。后来,让我们切换到http请求(第一次接触项目的时候,我在想为什么不直接用http请求这种方式,估计他也是第一次接触爬虫技术领域,没有经验。本来是一家招JAVA的公司,后来写JAVA,JS,Python,emmm……还行吧,反正我没有太多功力^_^),这个方法稳定快,但是我用Python写分析 写脚本的时候就知道调试有多烦人了。虽然可以使用PyQuery或BeautifulSoup等解析库,但不如编写JS脚本和在浏览器中调试方便。
输入爬虫主题
待爬取的官网:
接口地址:
目标:根据参数爬取对应的航班信息
索取资料:
响应结果:
接口测试
从上图第一张图可以看出有一个类似的加密参数:HashCode,其他的直接根据需要填写
{
"DepartureIataCode":"TPE",
"ArrivalIataCode":"PNH",
"FlightDate":"2018-08-24",
"RouteIndex":"0",
"TravelType":"OW",
"HashCode":"8b112088f6966ea42507d0daff86a1d1"
}
现在把这个请求的完整信息放入Postman,运行看看结果:
可以看到没有问题,就可以得到结果了。接下来,我们将删除 HashCode 并再次请求它。
emmm...直接没反应!!!那么,要解决这个问题,就需要破解加密参数。它是怎么来的?官方破解
【逆向思维】这个一定是在ajax请求之前生成的,然后用关键字找到这个ajax请求,在Chrome的开发者模式下,找到这个网站的所有Sources
【关键词】“QuerySeat”一一找到很多js文件,运气不错,第一个就是你能清楚的看到“POST”这个词,那么这肯定是一个ajax请求,这里有一个技巧,正常情况下情况下,服务器会压缩静态资源,因此需要格式化以获取概览
这样就可以读取代码,然后轻松找到设置HashCode的地方,然后打断点随机查看一条路由的数据,如下图。
踏到这一步,有点让人眼前一亮。执行到达encode指向的匿名函数。里面的代码好像是各种加密函数。你不需要阅读它,因为目标是执行它并得到相应的结果。
继续单步:
继续...
上图中重要的源码:
return e = OOO0.excess.indexOf("Chrome") >= 0 ? "cv3sdf@#$f3" : OOO0.excess.indexOf("Firefox") >= 0 ? "df23Sc@sS" : "vdf@s4df9sd@s2"
回到上层,是的,和我想的一样,当前浏览器是Chrome,返回的是cv3sdf@#$f3
继续...
继续...
继续...
终于找到了这个匿名函数,复制encode指向的函数,然后取个名字方便调用。另外,在另一个窗口打开Console,粘贴代码,如下图:
调用...(错误报告)
替换为相应的字符串以继续...
调用注入到Console中的encode函数,调用,得到结果!!!
将原创请求与 Postman 进行比较,结果是一样的!!!
还没结束。我这里刚拿到js脚本,所以需要把它嵌入到Python代码中。常规方式有两种:使用Python第三方库js2py和PyV8,都是可以执行js的Python库。但是我还是推荐使用js2py,因为PyV8的安装非常麻烦,所以我就不详细介绍如何使用了。网上有很多教程和案例。
最后,我需要解释一下:“sfei#@%%”从何而来?没有根搜索。我会直接告诉答案。事实上,这个值在当前网页中。它是一个js变量和一个固定值。,这也是我不想找根的原因,意义不大。另外,在使用http爬虫时,headers中的内容也必须匹配HashCode。这是什么意思?用于通过浏览器类型生成不同字符串的代码。也就是说,具体的HashCode与浏览器有关,所以在构造headers的时候需要填写对应的User-Agent,否则服务器验证时不会响应。可以猜测,服务器中也有同样功能的代码。它根据请求参数和头部中的 User-Agent 进行加密计算。HashCode 用于验证请求的 HashCode 是否合法。
总结:前端加密还是可以破解的。关键是锁定JS加密源代码的位置,提取出有用的加密代码。只要有用过js的同学,问题不大。还有很多小细节需要注意。服务器需要进一步验证请求。方法其实和前端判断请求是否合法的方法是一样的。至少 网站 是这种情况。