For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
以往爬取网页内容复杂点的,一般就是处理下页面内容动态载入,动态载入的内容可能会要求复杂奇怪的参数,或者找到这个动态载入的HTTP接口在哪里麻烦点。但是这个网页不同。类似:
1专实新用用新型专利第9年年费
最终希望得到的内容其实是实用新型专利第9年年费,但是得到的网页确实乱序后的字符串,并且每次刷新得到的乱序还不一样,试过几次也看不出规律。
按照以往的思路,猜测肯定是某个js文件中包含了还原算法,我的目的,就是找出这个算法,在爬虫程序中实现这个算法,以还原出可读的字符串。
js中要完成这样的事,首先得找到网页元素,包括:根据外层spanname=record_yijiaof:feiyongzldm;根据再外层的table;根据内层spanclass='nlkfqirnlfjerldfgzxcyiuro'。以前我一直想要个工具,可以在某网页载入的所有js文件中搜索特定字符串,从而帮助逆向,但是一直没有这个工具。所以这次也只有人肉看每个js。根据js的名字猜测这个逻辑会放在哪里。
看了几个可能的js文件,在文件中都没有搜索出我认为可能的字符串。于是我又人肉搜索其他不太可能的js文件,均未果。此时陷入死胡同。
网页文件末尾会有个超长id的span元素,类似:
1if (b0 && b0[b0.length - 1]) {
var b5 = b0[b0.length - 1].getAttribute("i" + "d");
if (!b5) {
return
}
var b2 = "";
var b4 = 0;
for (var b3 = 0; b3 < b5.length; b3 += 2) {
if (b4 > 255) {
b4 = 0
}
var b1 = parseInt(parseInt(b5.substring(b3, b3 + 2), 16) ^ b4++);
b2 += String.fromCharCode(b1)
}
if (b2) {
// ... 省略
首先看到的是"s" + "p" + "a" + "n",这不就是span!看前面几行代码很快就明白这是在取网页的最后一个span元素,也就是那个包含超长id属性的span元素。此时需要提下,之前也是对这个页尾span元素做过实验,发现必须是span元素且为最后一个元素才能正确还原网页内容,可以推断这个span是多么关键的一个线索。感兴趣的可以把这个网页的jQuery-1.7.2.min.js还原后查看mix函数实现。
翻译过来还原函数非常简单,写一个java版本:
public static String parseSipoIds(String enStr) {
int b4 = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < enStr.length(); i += 2) {
if (b4 > 255) b4 = 0;
int c = Integer.parseInt(enStr.substring(i, i + 2), 16) ^ b4++;
sb.append((char)c);
}
return sb.toString();
}
即这个span元素就是需要显示出来的span元素id集合,以逗号分隔。
以前还爬过一个日本政府网站,防爬也是做得很过分,不过主要是配合服务器,每一个网页的url是动态变化的,且需要从最原始的网页经过一定的操作才能获得。流程复杂让人痛苦不堪,最后还是一路携带cookie,真的模拟人的操作流程走下来。具体也记不清了。