puppeteer爬虫的奇妙之旅

@(爬虫)[puppeteer|]javascript

爬虫又称网络机器人。天天或许你都会使用搜索引擎,爬虫即是搜索引擎重要的组成部分,爬取内容作索引。现现在大数据,数据分析很火,那数据哪里来呢,能够经过网络爬虫爬取啊。那我萌就来探讨一下网络爬虫吧。html

优先策略


[TOC]java

爬虫的工做原理

如图所示,这是爬虫的流程图,能够看到经过一个种子URL开启爬虫的爬取之旅,经过下载网页,解析网页中内容存储,同时解析中网页中的URL 去除重复后加入到等待爬取的队列。而后从队列中取到下一个等待爬取的URL重复以上步骤,是否是很简单呢?git

广度(BFS)仍是深度(DFS)优先策略

上面也提到在爬取完一个网页后从等待爬取的队列中选取一个URL去爬去,那如何选择呢?是选择当前爬取网页中的URL 仍是继续选取当前URL中同级URL呢?这里的同级URL是指来自同一个网页的URL,这就是爬取策略之分。github

优先策略

广度优先策略(BFS)

广度优先策略即是将当前某个网页中URL先爬取彻底,再去爬取从当前网页中的URL爬取的URL,这就是BFS,若是上图的关系图表示网页的关系,那么BFS的爬取策略将会是:(A->(B,D,F,G)->(C,E));web

深度优先策略(DFS)

深度优先策略爬取某个网页,而后继续去爬取从网页中解析出的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,不单单能够用来作爬虫,由于能够编程,无头浏览器,能够用来自动化测试等等。

相关文章
相关标签/搜索