Skip to main content

02 虫师的终极奥义

一个虫师想要成为终极高手需要经历3个阶段

阶段一: 读取阶段

在读取页面时,页面只有2种,静态页面和动态页面。 静态页面直接读取就可以,而动态页面是在浏览器渲染完成的,这时需要使用puppetter工具到获取页面的内容,并 等待它沉浸完成,然后读取就可

阶段二: 安全阶段 - 与站长直接对决

安全阶段之IP限制

站长们为了不被人读取他们的数据,通常会设下障碍,如 ip锁,让高访问的ip直接屏蔽了, 如果遇到这个情况,那么多准备些代理的ip池,多用代码就可以绕过去了。

安全阶段之指纹锁

也有指纹锁,这是由js或计算出设备的数字指纹, 一但被锁定,那么找ip也没用,直接不给访问。 解决的方式还是用puppetter可以控制浏览器,不要让它发现指纹就可以了。如:


const fs = require('fs')
const path = require('path')
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')

const autoScroll = async (page) => {
await page.evaluate(async () => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 100;
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;

if (totalHeight >= scrollHeight - window.innerHeight) {
clearInterval(timer);
resolve(null);
}
}, 1000);
});
});
}

async function main() {
try {
puppeteer.use(StealthPlugin())
const browser = await puppeteer.launch(
{
devtools: true, defaultViewport: null, args: [
'--window-size=1920,1080',
],
headless: false,
executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
}
);

const [page] = await browser.pages();
await page.setRequestInterception(true);
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36');
await page.setExtraHTTPHeaders({
'Accept-Language': 'en'
});

page.on('requestfinished', async (request) => {
if (!request.url().match(/00\d+\.jpg/) ) return;
try {
const b = await request.response().buffer();
b.length
console.log("finished file ", b.length)
console.log(request.url());
const fileName = request.url().split('/').pop();
const filePath = path.resolve(__dirname, '/tmp/' + fileName);
const writeStream = fs.createWriteStream(filePath);
writeStream.write(b);
} catch (e) {
console.log(`-- .mp4: FAIL - ${e.message}`);
}
});
page.on('requestfailed', async (request) => {
console.log('- video loading failed!', request.url());
});

page.on('request', (request) => {
const blockedResources = [
// 'zz.bdstatic.com',
// 'sp0.baidu.com',
];
const url = new URL(request.url())
if (blockedResources.includes(url.hostname)) {
request.abort()
console.log("Block request: ", request.url())
} else {
request.continue();
}
});


await page.goto('https://www.cocomanga.com/10319/1/498.html', {
waitUntil: 'networkidle0'
});
await autoScroll(page);
await page.evaluate(() => document.body.scrollIntoView(false) )
await browser.close();

} catch (err) {
console.error(err);
}
}

main().then(() => {
debugger
}).catch(e => {
debugger

})

安全阶段之特征识别

这玩意目前无法解决,好在往往是登录才用,次数少

阶段三: 终极武器 - 自定义浏览器

数据是要给用户看看的,而用户是通过浏览器看的,那么只要控制浏览器这个中间环节,也就控制了一切,这是高一维的 操作。 对开发者的浏览器开发定制能力要求更高,总结就是: 只要是通过浏览器访问的信息,那么只要完全控制了浏览器,那么 也就间接地控制了浏览器全部,包括浏览的信息。