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

上篇文章中我们使用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、设置请求头、控制请求频率等方法来绕过反爬虫机制。

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

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

相关推荐
田本初11 分钟前
使用vite重构vue-cli的vue3项目
前端·vue.js·重构
ai产品老杨18 分钟前
AI赋能安全生产,推进数智化转型的智慧油站开源了。
前端·javascript·vue.js·人工智能·ecmascript
帮帮志24 分钟前
vue实现与后台springboot传递数据【传值/取值 Axios 】
前端·vue.js·spring boot
xixingzhe238 分钟前
Nginx 配置多个监听端口
服务器·前端·nginx
火龙谷1 小时前
【爬虫】12306查票
爬虫
清风细雨_林木木2 小时前
Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践
前端·css·vue.js
逊嘘2 小时前
【Web前端开发】CSS基础
前端·css
小宁爱Python2 小时前
深入掌握CSS Flex布局:从原理到实战
前端·javascript·css
Attacking-Coder2 小时前
前端面试宝典---webpack面试题
前端·面试·webpack
极小狐2 小时前
极狐GitLab 容器镜像仓库功能介绍
java·前端·数据库·npm·gitlab