鱼C论坛

 找回密码
 立即注册
查看: 1884|回复: 0

[技术交流] 煎蛋网妹子图网站解密

[复制链接]
发表于 2018-7-10 00:37:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 零度非安全 于 2018-7-10 00:39 编辑

前述
对于很多新手爬虫师们来说,在网上批量爬取图片也许是他们第一个算得上的真正爬虫项目,用的方法也是比较传统的抓取方法,图片的链接就存在于该网页的 HTML 源代码中,只需要根据正则表达式(你也可以通过 lxml、XPath、BeautifulSoup 来提取)提取图片链接就可以完成目标了,但是现在有所不同,网页都是向着轻量的方向发展,传统的 HTML 无法满足要求,也许在未来某个时间,网页的 HTML 代码少得“可怜”,也许会有人问,没有那些,那该怎样呈现网页呢?其实现在越来越多的网页都是动态加载的,当然呢这也是反爬机制的一种,既然这样,那么传统的抓取方法会失效,我们就要新的策略来应对。本次讨论的目标为煎蛋网。
抓取目标
批量抓取煎蛋网妹子图(传统方法已失效),这里博主带大家用新方法来批量抓取。
初步分析
打开煎蛋网妹子图首页(http://jandan.net/ooxx),这个链接看起来怎么那么邪恶呢?咳咳~~,废话不多说,直接进入正题(是时候表演真正技术了)。按 F12 调出控制台,选择 Network 选项卡,再按 F5 刷新,这时控制台会显示很多信息,我们点击第一个,再切换到 Response 选项卡,没错,这就是煎蛋网服务器对我们发出的请求所返回的响应信息,大概浏览下,会发现有很多 id 属性值为 comment-xxxxxxx 的 li 标签块,这里的 xxxxxxx 为随机数字,博主猜测每一个这样的标签区块就是网页上相对应的图片信息,既然我们是要找图片,那么 img 标签肯定不放过,然后在其中一个 li 标签中去寻找 img 标签,但是遗憾的是,img 标签中的 src 属性并没有直接给出图片的链接,而且不难发现所有这些 li 标签中的 img 标签中的 src 属性都是相同的,而后面有一个 onload 属性,属性值为一个 JS 函数,当网站加载时,会立马执行这个 JS 函数,函数名为 jandan_img_load,接下来按 Ctrl + Shift + F 调出全局搜索,输入 jandan_img_load 回车,这样做目的在于找出这个 JS 函数代码,通过简单的分析可以看出,这个函数位于一个单独的 JS 文件中,而且文件名为一串英文加数字混合,博主猜测这个 JS 文件名可能会在网站每次加载时发生变化,当然这只是一种猜测(如果你想保证不出差错,可以获取该 JS 文件的地址,再请求它从而获取到 JS 文件中的内容),单击进去,显示为一行 JS 代码,一看已经进行过压缩,所以把这段代码复制粘贴到 JS 代码还原工具上,这里推荐一个在线工具(https://tool.lu/js/),然后复制粘贴到文本,按 Ctrl + F 搜索函数名称,代码如下:
  1. function jandan_load_img(b) {
  2.         var d = $(b);
  3.         var f = d.next("span.img-hash");
  4.         var e = f.text();
  5.         f.remove();
  6.         var c = jdUqUpj6kfN609VWCtfhlWlppoc4g9TthN(e, "5HTs9vFpTZjaGnG2M473PomLAGtI37M8");
  7.         var a = $('<a href="' + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/, "$1large$3") + '" target="_blank" class="view_img_link">[查看原图]</a>');
  8.         d.before(a);
  9.         d.before("<br>");
  10.         d.removeAttr("onload");
  11.         d.attr("src", location.protocol + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/, "$1thumb180$3"));
  12.         if (/\.gif$/.test(c)) {
  13.                 d.attr("org_src", location.protocol + c);
  14.                 b.onload = function() {
  15.                         add_img_loading_mask(this, load_sina_gif)
  16.                 }
  17.         }
  18. }
复制代码

我们再来看下原始的关键 HTML 代码部分,如下:
  1. <img src="//img.jandan.net/img/blank.gif" onload="jandan_load_img(this)" /><span class="img-hash">Ly93eDIuc2luYWltZy5jbi9tdzYwMC8wMDc2QlNTNWx5MWZzbTU1aDNxNDJqMzBxbzB4Yzc4eS5qcGc=</span>  
复制代码

对比上面两者,不难发现在 JS 代码中,变量 e 是获取该图片的 hash 值,然后调用一个函数来处理,但这个函数名看起来很乱,这个函数估计返回的就是图片的真实地址,后面的操作则是将该图片地址去替换原始的 HTML 代码关键部分,这个大概过程相信大家都看得懂。
进一步分析
想看更多分析,请前往我的博客吧,点击我的签名即刻前往。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表