@(爬虫)[puppeteer|]javascript
爬虫又称网络机器人。天天或许你都会使用搜索引擎,爬虫即是搜索引擎重要的组成部分,爬取内容作索引。现现在大数据,数据分析很火,那数据哪里来呢,能够经过网络爬虫爬取啊。那我萌就来探讨一下网络爬虫吧。html
[TOC]java
如图所示,这是爬虫的流程图,能够看到经过一个种子URL开启爬虫的爬取之旅,经过下载网页,解析网页中内容存储,同时解析中网页中的URL 去除重复后加入到等待爬取的队列。而后从队列中取到下一个等待爬取的URL重复以上步骤,是否是很简单呢?git
上面也提到在爬取完一个网页后从等待爬取的队列中选取一个URL去爬去,那如何选择呢?是选择当前爬取网页中的URL 仍是继续选取当前URL中同级URL呢?这里的同级URL是指来自同一个网页的URL,这就是爬取策略之分。github
广度优先策略即是将当前某个网页中URL先爬取彻底,再去爬取从当前网页中的URL爬取的URL,这就是BFS,若是上图的关系图表示网页的关系,那么BFS的爬取策略将会是:(A->(B,D,F,G)->(C,E));web
深度优先策略爬取某个网页,而后继续去爬取从网页中解析出的URL,直到爬取完。 (A->B->C->D->E->F->G)chrome
下载网页看起来很简单,就像在浏览器中输入连接同样,下载完后浏览器便能显示出来。固然结果是并非这样的简单。 ####模拟登陆 对于一些网页来讲须要登陆才能看到网页中内容,那爬虫怎么登陆呢?其实登陆的过程就是获取访问的凭证(cookie,token...)编程
let cookie = '';
let j = request.jar()
async function login() {
if (cookie) {
return await Promise.resolve(cookie);
}
return await new Promise((resolve, reject) => {
request.post({
url: 'url',
form: {
m: 'username',
p: 'password',
},
jar: j
}, function(err, res, body) {
if (err) {
reject(err);
return;
}
cookie = j.getCookieString('url');
resolve(cookie);
})
})
}
复制代码
这里是个简单的栗子,登陆获取cookie, 而后每次请求都带上cookie.json
有的网页内容是服务端渲染的,没有CGI可以得到数据,只能从html中解析内容,可是有的网站的内容并非简单的便能获取内容,像linkedin这样的网站并非简单的可以得到网页内容,网页须要经过浏览器执行后才能得到最终的html结构,那怎么解决呢?前面我萌提到浏览器执行,那么我萌有没有可编程的浏览器呢?puppeteer,谷歌chrome团队开源的无头浏览器项目,利用无头浏览器便能模拟用户访问,便能获取最重网页的内容,抓取内容。 利用puppeteer 模拟登陆浏览器
async function login(username, password) {
const browser = await puppeteer.launch();
page = await browser.newPage();
await page.setViewport({
width: 1400,
height: 1000
})
await page.goto('https://maimai.cn/login');
console.log(page.url())
await page.focus('input[type=text]');
await page.type(username, { delay: 100 });
await page.focus('input[type=password]');
await page.type(password, { delay: 100 });
await page.$eval("input[type=submit]", el => el.click());
await page.waitForNavigation();
return page;
}
复制代码
执行login()
后便能像在浏览器中登陆后,便能像浏览器中登陆后便能获取html中的内容,固然也能够直接请求CGI
async function crawlData(index, data) {
let dataUrl = `https://maimai.cn/company/contacts?count=20&page=${index}&query=&dist=0&cid=${cinfo.cid}&company=${cinfo.encodename}&forcomp=1&searchTokens=&highlight=false&school=&me=&webcname=&webcid=&jsononly=1`;
await page.goto(dataUrl);
let res = await page.evaluate((e) => {
return document.body.querySelector('pre').innerHTML;
});
console.log(res)
res = JSON.parse(res);
if (res && res.result == 'ok' && res.data.contacts && res.data.contacts.length) {
data = data.concat(res.data.contacts.map((item) => {
let contact = item.contact;
console.log(contact.name)
return {
name: contact.name,
occupation: contact.line4.split(',')[0],
company: contact.company,
title: contact.position
}
}));
return await crawlData(++index, data);
}
return data;
}
复制代码
像有的网站,拉钩,每次爬取的cookie都同样,也能利用无头浏览器取爬取,这样每次就不用每次爬取的时候担忧cookie.
固然爬虫不单单这些,更多的是对网站进行分析,找到合适的爬虫策略。对后关于puppeteer
,不单单能够用来作爬虫,由于能够编程,无头浏览器,能够用来自动化测试等等。