使用puppeteer 抓取网页中的数据,并导入mysql 数据库

530 阅读1分钟

数据库的准备

  1. 使用mysql关系型数据库
  2. 安装依赖包
  "dependencies": {
  "@types/sequelize": "^4.28.9",
  "jquery": "^3.6.0",  // 分析dom 结构
  "mysql2": "^2.2.5",
  "puppeteer": "^9.1.1",
  "sequelize": "6.5.0",
  "tedious": "^11.0.8"
}

数据库的连接

  1. 使用sequelize(ORM框架)进行连接
   const { Sequelize } = require('sequelize')
   const sequelize = new Sequelize('database''root', 'root', { // 换成自己的数据库名字和密码
    host: 'localhost',
    dialect: 'mysql'
   })

module.exports = sequelize
  1. 定义模型
const sequelize = require('./db')
const { DataTypes } = require('sequelize')

module.exports = sequelize.define("Profile", {
url: {
  type: DataTypes.STRING,
  allowNull: false
}
})

puppeteer简介

使用puppeteer抓取网页内容

const puppeteer = require('puppeteer')
const $ = require('jquery')
function sleep(delay) {
  return new Promise(resolve => setTimeout(resolve, delay));
}
// 抓取的网页路径
const url = `https://www.woyaogexing.com/touxiang/katong/index.html`;
module.exports = async () => {
  try {
    console.log('start visit the target page');
    const browser = await puppeteer.launch({
      args: ['--no-sandbox'], //不是沙箱模式
      dumpio: false,
      headless: false //是否运行在浏览器headless模式,true为不打开浏览器执行,默认为true
    });
    //args :传递给 chrome 实例的其他参数,比如你可以使用”–ash-host-window-bounds=1024x768” 来设置浏览器窗口大小。更多参数参数列表可以参考这里
    //dumpio 是否将浏览器进程stdout和stderr导入到process.stdout和process.stderr中。默认为false。
    const page = await browser.newPage();
    await page.goto(url, {
      waitUntil: 'networkidle2' //等待页面不动了,说明加载完毕了
    });
    let arr = [] //保存抓取的内容
    await sleep(3000);
    await page.waitForSelector('.page a:nth-last-of-type(1)'); //异步的,等待元素加载之后,否则获取不到异步加载的元素
    for (let i = 0; i < 1; i++) {
      //  设置等待时间
      await sleep(5000);
      let a1 = await pageSpider()
      a1.forEach(item => arr.push(item))
      await page.click('.page a:nth-last-of-type(1)'); //点击按钮一次
    }
    async function pageSpider() {
      const result = await page.evaluate(() => {
        var items = $('.pMain .txList a.img ');
        var links = [];
        //判断这里是否列表有数值
        if (items.length >= 1) {
          console.log(items, 'items')
          items.each((index, item) => {
            let it = $(item);
            let url = 'https:' + it.find('img').attr('src')
            links.push({
              url
            });
          });
        }
        return links.filter(item => Object.keys(item).length > 0);
      });
      return result
    }
    browser.close();
    return arr
  } catch (err) {
    console.log(err);
  }
};


    

注: 不同的网页的dom结构时不一样的,需要单独分析

把数据导入数据库

// 加载爬虫文件
const Profile = require('./models/profile')
const result = require('./spider')
result().then(r => Profile.bulkCreate(r)

倒入的数据结构

WechatIMG366.png

项目地址 github.com/ch1ies/Spid…