我的编程空间,编程开发者的网络收藏夹
学习永远不晚

数据采集实战(三)-

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

数据采集实战(三)-

数据采集实战(三)-

王者荣耀是一直都挺喜欢的一个手游,玩了好几年,最近一段开始喜欢看比赛,所以想着采集点数据看看各个战队或者选手的情况。
顺便也练习练习 puppeteer 的使用。

数据来源于:尚牛电竞 。

王者荣耀最近正在进行的最大比赛就是 2021世冠杯,所以就选择采集这个赛事的数据。
在 尚牛电竞 网站上,已经按照战队,选手和英雄分好类了,并且网站不需要登录就能看到数据。

image.png

三组数据直接对应不同的URL进行采集即可,没有复杂的流程,唯一需要注意的地方是对Logo头像的小图片的保存。

2.1 各个数据的采集

image.png

积分榜的数据是空的,战队榜选手榜英雄榜的数据可以获取。

3种数据的URL分别为:

const urls = [
  {
    url: "https://www.shangniu.cn/gdall/kog?tab=0&pid=40008&tid=45",
    name: "战队榜",
  },
  {
    url: "https://www.shangniu.cn/gdall/kog?tab=1&pid=40008&tid=45",
    name: "选手榜",
  },
  {
    url: "https://www.shangniu.cn/gdall/kog?tab=2&pid=40008&tid=45",
    name: "英雄榜",
  },
];

2.1.1 战队数据的采集和解析

// 战队数据
const teamData = async (browser, page, url) => {
  await page.goto(url);

  // 解析页面
  

  const data = [];
  const rows = await page.$$("#scroll-table > .tbody > .row");

  for (const row of rows) {
    let line = [];
    const cols = await row.$$(".td");

    line[0] = await cols[1].$eval("a > img", (node) =>
      node.getAttribute("class="lazy" data-src")
    );
    line[1] = await cols[1].$eval(
      ".right-name > .item-name",
      (node) => node.innerText
    );
    line[2] = await page.evaluate((node) => node.innerText, cols[2]);
    line[3] = await page.evaluate((node) => node.innerText, cols[3]);
    line[4] = await page.evaluate((node) => node.innerText, cols[4]);
    line[5] = await page.evaluate((node) => node.innerText, cols[5]);
    line[6] = await page.evaluate((node) => node.innerText, cols[6]);
    line[7] = await page.evaluate((node) => node.innerText, cols[7]);
    line[8] = await cols[8].$eval("div > .kda", (node) => node.innerText);
    line[9] = await page.evaluate((node) => node.innerText, cols[9]);
    line[10] = await page.evaluate((node) => node.innerText, cols[10]);
    line[11] = await page.evaluate((node) => node.innerText, cols[11]);
    line[12] = await page.evaluate((node) => node.innerText, cols[12]);
    line[13] = await page.evaluate((node) => node.innerText, cols[13]);
    line[14] = await page.evaluate((node) => node.innerText, cols[14]);
    line[15] = await page.evaluate((node) => node.innerText, cols[15]);
    line[16] = await page.evaluate((node) => node.innerText, cols[16]);
    line[17] = await page.evaluate((node) => node.innerText, cols[17]);
    line[18] = await page.evaluate((node) => node.innerText, cols[18]);
    line[19] = await page.evaluate((node) => node.innerText, cols[19]);
    line[20] = await page.evaluate((node) => node.innerText, cols[20]);
    line[21] = await page.evaluate((node) => node.innerText, cols[21]);
    line[22] = await page.evaluate((node) => node.innerText, cols[22]);
    data.push(line.join(","));
    await downloadImage(
      browser,
      "./output/wzry/team-logo",
      `${line[1]}.png`,
      line[0]
    );
  }

  await saveContent(
    `./output/wzry`,
    `world_cup_2021_team.csv`,
    data.join("
")
  );
};

2.1.2 选手数据的采集和解析

// 选手数据
const memberData = async (browser, page, url) => {
  await page.goto(url);

  // 解析页面
  

  const data = [];
  const rows = await page.$$("#scroll-table > .tbody > .row");

  for (const row of rows) {
    let line = [];
    const cols = await row.$$(".td");

    line[0] = await cols[1].$eval("a > img", (node) =>
      node.getAttribute("class="lazy" data-src")
    );
    line[1] = await cols[1].$eval(
      ".right-name > .item-name",
      (node) => node.innerText
    );
    line[2] = await page.evaluate((node) => node.innerText, cols[2]);
    line[3] = await page.evaluate((node) => node.innerText, cols[3]);
    line[4] = await page.evaluate((node) => node.innerText, cols[4]);
    line[5] = await cols[5].$eval("div > .kda", (node) => node.innerText);
    line[6] = await page.evaluate((node) => node.innerText, cols[6]);
    line[7] = await page.evaluate((node) => node.innerText, cols[7]);
    line[8] = await page.evaluate((node) => node.innerText, cols[8]);
    line[9] = await page.evaluate((node) => node.innerText, cols[9]);
    line[10] = await page.evaluate((node) => node.innerText, cols[10]);
    line[11] = await page.evaluate((node) => node.innerText, cols[11]);
    line[12] = await page.evaluate((node) => node.innerText, cols[12]);
    line[13] = await page.evaluate((node) => node.innerText, cols[13]);
    line[14] = await page.evaluate((node) => node.innerText, cols[14]);
    line[15] = await page.evaluate((node) => node.innerText, cols[15]);
    data.push(line.join(","));
    await downloadImage(
      browser,
      "./output/wzry/member-logo",
      `${line[1]}.png`,
      line[0]
    );
  }

  await saveContent(
    `./output/wzry`,
    `world_cup_2021_member.csv`,
    data.join("
")
  );
};

2.1.3 英雄数据的采集和解析

// 英雄数据
const heroData = async (browser, page, url) => {
  await page.goto(url);

  // 解析页面
  

  const data = [];
  const rows = await page.$$("#scroll-table > .tbody > .row");

  for (const row of rows) {
    let line = [];
    const cols = await row.$$(".td");

    line[0] = await cols[1].$eval("a > img", (node) =>
      node.getAttribute("class="lazy" data-src")
    );
    line[1] = await cols[1].$eval(
      ".right-name > .item-name",
      (node) => node.innerText
    );
    line[2] = await page.evaluate((node) => node.innerText, cols[2]);
    line[3] = await page.evaluate((node) => node.innerText, cols[3]);
    line[4] = await page.evaluate((node) => node.innerText, cols[4]);
    line[5] = await cols[5].$eval(".winRate > span", (node) => node.innerText);
    line[6] = await page.evaluate((node) => node.innerText, cols[6]);
    line[7] = await page.evaluate((node) => node.innerText, cols[7]);
    line[8] = await page.evaluate((node) => node.innerText, cols[9]);
    data.push(line.join(","));
    await downloadImage(
      browser,
      "./output/wzry/hero-logo",
      `${line[1]}.png`,
      line[0]
    );
  }

  await saveContent(
    `./output/wzry`,
    `world_cup_2021_hero.csv`,
    data.join("
")
  );
};

2.2 logo和头像的保存

在html页面中,logo和头像都是图片的url,为了下载实际的图片,封装了个小函数 downloadImage

// 下载图片
const downloadImage = async (browser, dirname, filename, imgclass="lazy" data-src) => {
  console.log("image class="lazy" data-src: ", imgclass="lazy" data-src);
  const page = await browser.newPage();

  try {
    const imgResp = await page.goto(imgclass="lazy" data-src);
    const buffer = await imgResp.buffer();
    const imgBase64 = buffer.toString("base64");

    if (!mkdirsSync(dirname)) {
      console.error("mkdir save page dir ERROR!");
      return;
    }
    fs.writeFileSync(path.join(dirname, filename), imgBase64, "base64");
  } catch (e) {
    console.error("download image error: ", e);
  } finally {
    await page.close();
  }
};

以上通过 puppeteer 采集2021世冠比赛数据的实战中,技术要点主要有:

  1. 解析页面元素中的值
  2. 循环获取html table 中 tr/td 中的内容
  3. 下载网页中图片

爬取数据只是为了研究学习使用,本文中的代码遵守:

  1. 如果网站有 robots.txt,遵循其中的约定
  2. 爬取速度模拟正常访问的速率,不增加服务器的负担
  3. 只获取完全公开的数据,有可能涉及隐私的数据绝对不碰

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

数据采集实战(三)-

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

数据采集实战(三)-

1. 概述王者荣耀是一直都挺喜欢的一个手游,玩了好几年,最近一段开始喜欢看比赛,所以想着采集点数据看看各个战队或者选手的情况。顺便也练习练习 puppeteer 的使用。数据来源于:尚牛电竞 。2. 采集流程王者荣耀最近正在进行的最大比赛就是 2021世冠杯,
数据采集实战(三)-
2020-07-29

数据采集实战(一)-

概述最近在学习python的各种数据分析库,为了尝试各种库中各种分析算法的效果,陆陆续续爬取了一些真实的数据来。顺便也练习练习爬虫,踩了不少坑,后续将采集的经验逐步分享出来,希望能给后来者一些参考,也希望能够得到先驱者的指点!采集工具其实基本没用过什么现成的采
数据采集实战(一)-
2017-02-11

数据采集实战(五)-

1. 概述现在学校越来越重视孩子课外知识的掌握,给孩子挑选课外书一般都是参考学校或者家长之间的推荐。有时,也会想看看在儿童阶段,目前到底流行的是些什么样的书。​于是,就简单写了这个小爬虫,采集了畅销童书的前20名。要想采集更多的畅销童书,后者采集其他类型的畅销
数据采集实战(五)-
2015-05-29

数据采集实战(二)-

1. 概述京粉(https://union.jd.com/)是京东联盟下的网站,通过分享其中的商品链接可以赚取佣金,类似淘客联盟。采集京粉的商品,既可以练习 puppeteer的使用,平时想在京东购物时,也能用得上(采集看看有类似商品的价格和评价)。2. 主要
数据采集实战(二)-
2015-01-09

数据采集实战(四)-

1. 概述前段时间在看一本很多人推荐的线性代数教材《线性代数应该这样学》第三版,这一版每个章节都有大量的习题。官方网站上虽然按照章节提供了习题的答案,一来因为网站是国外的,访问不流畅,二来答案中还夹杂着广告,影响查看。所以,想试着将答案爬取下来制作成pdf,查
数据采集实战(四)-
2019-04-29

Python采集C站热榜数据实战示例

这篇文章主要为大家介绍了Python采集C站热榜数据实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-19

Python实战使用XPath采集数据示例解析

这篇文章主要为大家介绍了Python实战之使用XPath采集数据实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
2023-05-16

如何在 Java 中实现 Modbus 数据采集?(java怎么实现modbus数据采集)

在Java开发中,实现Modbus数据采集是一个常见的需求。Modbus是一种用于工业自动化领域的通信协议,它允许不同设备之间进行数据交换。以下是实现Java中Modbus数据采集的步骤:一、准备工作
如何在 Java 中实现 Modbus 数据采集?(java怎么实现modbus数据采集)
Java2024-12-18

数据采集 - Marvin

链接:https://bdcc.bigdataedu.org/block/48(需账号登录)
数据采集 - Marvin
2016-08-03

sqlserver实时数据采集怎么实现

在 SQL Server 中实现实时数据采集可以通过以下几种方法来实现:使用 Change Data Capture (CDC):SQL Server 提供了 CDC 功能,可以捕获数据库表中的更改,并将这些更改存储在 CDC 控制表中。通
sqlserver实时数据采集怎么实现
2024-04-09

实战:基于Loki采集K8s日志

Loki是一个水平可扩展、高可用性、轻量易用、多租户的日志聚合系统,它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每一个日志流编制一组标签,项目是受Prometheus启发,专门为Prometheus和k8s用户做了相
K8s日志系统2024-11-30

剖析数据的数据采集

如果大家还想了解更多方面的详细内容的话呢,不妨关注编程学习网教育平台,在这里你肯定会有意想不到的收获的!
剖析数据的数据采集
2024-04-23

Hive实战之Youtube数据集

Hive是一个基于Hadoop的数据仓库基础设施,可以用于处理大规模的结构化数据。在Hive中,使用类似SQL的查询语言来处理数据,使得用户可以方便地进行数据分析和查询。在本实战中,我们将使用Hive来处理Youtube数据集。Youtub
2023-09-15

编程热搜

目录