nodejs 爬虫实现

小卒子 1年前 ⋅ 4042 阅读

一、什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

  • 搜索引擎

今日头条/网易新闻

  • 抢票软件

最终都指向的是 12306

  • 比价网

淘宝 京东 拼多多

在生活中网络爬虫经常出现,搜索引擎就离不开网络爬虫。例如,百度搜索引擎的爬虫名字叫作百度蜘蛛(Baiduspider)。百度蜘蛛,是百度搜索引擎的一个自动程序。它每天都会在海量的互联网信息中进行爬取,收集并整理互联网上的网页、图片视频等信息。当用户在百度搜索引擎中输入对应的关键词时,百度将从收集的网络信息中找出相关的内容,按照一定的顺序将信息展现给用户。

二、网页抓取

直接从渲染后的页面中获取数据,实现代码如下


const puppeteer = require('puppeteer');
async function getContent(urls) {
    const browser = await puppeteer.launch({
        args: ['--no-sandbox'],
        dumpio: true,
        executablePath: "/usr/bin/google-chrome" // 浏览器路径
    });
    const page = await browser.newPage();
    await page.setViewport({width: 1920, height: 1080});
    await page.emulateMediaType('screen');
    for (let url of urls) {
        if (url) {
            await page.goto(url, { waitUntil: 'networkidle0', timeout: 0 });
        }
        try {
            const dimensions = await page.evaluate(() => {
                return {
                    width: document.body.scrollWidth,
                    height: document.body.scrollHeight,
                    deviceScaleFactor: window.devicePixelRatio,
                };
            });
        } catch (e) {
            console.log(e);
        }
    }
    let content = await page.content();
    await page.close();
    await browser.close();
    return content;
}

module.exports = {
	spiderOne: async (url) => {
        let urls = [url];
        let content = await getContent(urls);
        return content;
    },
    spiderMuti: async (urls) => {
        let content = await getContent(urls);
        return content;
    }
}

三、网页解析

// content就是网页内容
async function parseTeamDetail(content) {
        const $ = cheerio.load(content);
        let teamName = $("div.intro div.head").text().trim().split("\n")[0];
        teamName = teamName.replace(/[队]+$/, "");
        let teanEngName = $("div.intro div.row").first().find("div.value").text().trim();
        let retired_short = $($("div.intro div.row")[1]).find("div.value").text().trim().replace(/[\r\n\t]+/g, ",");

        let members = [];
        let length = $($("table.stat_box")[0]).find("tbody tr").length;
        $($("table.stat_box")[0]).find("tbody tr").each((index, ele) => {
            if (index > (length - 4)) {
                return ;
            }
            let lineData = [];
            $(ele).find("td").each((subInx, subEle) => {
                if (subInx == 0) {
                    return
                }
                if (subInx == 1) {
                    lineData.push({
                        name: $(subEle).find("a").text().trim(),
                        href: "http://stat-nba.com" + $(subEle).find("a").attr("href")
                    });
                } else {
                    lineData.push($(subEle).text().trim());
                }
            });
            members.push(lineData)
        });
        return members;
    }

仅供参考


全部评论: 0

    我有话说: