零基础入门 | 超详细讲解 | 小白也能看懂的爬虫程序——爬取微博热搜榜

上篇文章中我们使用Cursor生成了爬取微博热搜的代码,那么这些代码是如何起作用的呢,本文将深入浅出的给大家讲解该爬虫代码

一、网页源码剖析

首先,我们来看提供的微博热榜网页源码。它是一个 HTML 表格结构,每一行 <tr> 代表一个热门话题,每个话题包含排名、标题、热度和链接等信息。具体如下:

  • 排名 :位于每行的第一个 <td> 元素中,文本内容表示该话题在热榜中的排名。
  • 标题 :在第二个 <td> 元素内的 <a> 标签中,其文本是话题的具体标题,href 属性为该话题的搜索链接。
  • 热度 :处于第三个 <td> 元素里,文本代表话题的热度值。
  • 链接 :第二个 <td> 元素中 <a> 标签的 href 属性,可用于跳转到该话题的搜索结果页面。

二、爬虫代码实现思路

基于上述网页结构,我们可以编写爬虫代码来提取所需数据。以下是使用 Node.js 结合 request - promisecheerio 模块实现的代码思路:

  1. 发送请求 :使用 request - promise 向微博热榜页面发送 HTTP 请求,获取网页的 HTML 内容。
  2. 解析 HTML :借助 cheerio 模块将 HTML 内容转换为可操作的 DOM 对象,方便我们提取所需数据。
  3. 提取数据 :通过选择器定位到每个热门话题的 <tr> 元素,然后分别提取排名、标题、热度和链接信息。
  4. 保存数据:将提取的数据存储到合适的数据结构中,如数组或对象,也可以保存到文件中,如 CSV 文件。

三、代码示例及详细分析

javascript

php 复制代码
const rp = require('request-promise');
const cheerio = require('cheerio');
const createCsvWriter = require('csv-writer').createObjectCsvWriter;

// 微博热榜页面 URL
const WEIBO_HOT_URL = 'https://s.weibo.com/top/summary';

rp(WEIBO_HOT_URL)
  .then((html) => {
    const $ = cheerio.load(html);
    const hotTopics = [];

    // 遍历每个热门话题的 <tr> 元素
    $('table tr').each((index, element) => {
      // 跳过表头行
      if (index === 0) return;

      // 提取排名
      const rank = $(element).find('td:first-child').text().trim();

      // 提取标题
      const titleElement = $(element).find('td:nth-child(2) a');
      const title = titleElement.text().trim();
      const link = titleElement.attr('href');

      // 提取热度
      const heat = $(element).find('td:nth-child(3)').text().trim();

      // 将提取的数据添加到数组中
      hotTopics.push({
        rank,
        title,
        heat,
        link
      });
    });

    // 创建 CSV 写入器
    const csvWriter = createCsvWriter({
      path: 'weibo_hot_topics.csv',
      header: [
        { id: 'rank', title: '排名' },
        { id: 'title', title: '标题' },
        { id: 'heat', title: '热度' },
        { id: 'link', title: '链接' }
      ]
    });

    // 将数据写入 CSV 文件
    return csvWriter.writeRecords(hotTopics);
  })
  .then(() => {
    console.log('微博热榜数据已成功保存到 weibo_hot_topics.csv');
  })
  .catch((error) => {
    console.error('请求出错:', error);
  });

代码详细解释:

  1. 模块引入

    • request - promise:用于发送 HTTP 请求,获取网页内容。
    • cheerio:将 HTML 内容转换为可操作的 DOM 对象,方便数据提取。
    • csv - writer:将提取的数据保存到 CSV 文件中。
  2. 发送请求

    • rp(WEIBO_HOT_URL):向微博热榜页面发送 GET 请求,返回一个 Promise 对象。当请求成功时,会执行 .then 方法,将 HTML 内容作为参数传递给回调函数。
  3. 解析 HTML 并提取数据

    • const $ = cheerio.load(html):将 HTML 内容加载到 cheerio 中,创建一个类似于 jQuery 的选择器 $
    • $('table tr').each((index, element) => {...}):遍历表格中的每一行 <tr> 元素。
    • if (index === 0) return;:跳过表头行。
    • const rank = $(element).find('td:first-child').text().trim();:提取排名信息。
    • const titleElement = $(element).find('td:nth-child(2) a');:找到标题所在的 <a> 元素。
    • const title = titleElement.text().trim();const link = titleElement.attr('href');:分别提取标题文本和链接。
    • const heat = $(element).find('td:nth-child(3)').text().trim();:提取热度信息。
    • hotTopics.push({ rank, title, heat, link });:将提取的数据添加到 hotTopics 数组中。
  4. 保存数据到 CSV 文件

    • const csvWriter = createCsvWriter({...}):创建一个 CSV 写入器,指定文件路径和表头信息。
    • csvWriter.writeRecords(hotTopics):将 hotTopics 数组中的数据写入 CSV 文件,返回一个 Promise 对象。当写入成功时,会执行下一个 .then 方法,输出成功信息。
  5. 错误处理

    • .catch((error) => { console.error('请求出错:', error); }):捕获请求过程中可能出现的错误,并输出错误信息。

四、注意事项

  • 反爬虫机制:微博网站可能有反爬虫机制,如 IP 封禁、验证码等。在实际使用时,可能需要使用代理 IP、设置请求头、控制请求频率等方法来绕过反爬虫机制。

  • 网页结构变化:网页结构可能会随着时间或版本更新而变化,需要定期检查和调整代码中的选择器,以确保能够正确提取数据。

通过以上分析,我们可以看到如何从微博热榜网页源码出发,编写爬虫代码来提取所需数据,并将其保存到文件中。这为我们进一步分析和利用微博热榜数据提供了基础

相关推荐
明似水1 分钟前
用 Melos 解决 Flutter Monorepo 的依赖冲突:一个真实案例
前端·javascript·flutter
独立开阀者_FwtCoder11 分钟前
stagewise:让AI与代码编辑器无缝连接
前端·javascript·github
清沫13 分钟前
Cursor Rules 开发实践指南
前端·ai编程·cursor
江城开朗的豌豆18 分钟前
JavaScript篇:对象派 vs 过程派:编程江湖的两种武功心法
前端·javascript·面试
不吃糖葫芦319 分钟前
App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
前端·webview
江城开朗的豌豆40 分钟前
JavaScript篇:字母侦探:如何快速统计字符串里谁才是'主角'?
前端·javascript·面试
coding随想9 小时前
JavaScript ES6 解构:优雅提取数据的艺术
前端·javascript·es6
小小小小宇9 小时前
一个小小的柯里化函数
前端
灵感__idea9 小时前
JavaScript高级程序设计(第5版):无处不在的集合
前端·javascript·程序员
小小小小宇9 小时前
前端双Token机制无感刷新
前端