上篇文章中我们使用Cursor生成了爬取微博热搜的代码,那么这些代码是如何起作用的呢,本文将深入浅出的给大家讲解该爬虫代码
一、网页源码剖析
首先,我们来看提供的微博热榜网页源码。它是一个 HTML 表格结构,每一行 <tr>
代表一个热门话题,每个话题包含排名、标题、热度和链接等信息。具体如下:
- 排名 :位于每行的第一个
<td>
元素中,文本内容表示该话题在热榜中的排名。 - 标题 :在第二个
<td>
元素内的<a>
标签中,其文本是话题的具体标题,href
属性为该话题的搜索链接。 - 热度 :处于第三个
<td>
元素里,文本代表话题的热度值。 - 链接 :第二个
<td>
元素中<a>
标签的href
属性,可用于跳转到该话题的搜索结果页面。

二、爬虫代码实现思路
基于上述网页结构,我们可以编写爬虫代码来提取所需数据。以下是使用 Node.js 结合 request - promise
和 cheerio
模块实现的代码思路:
- 发送请求 :使用
request - promise
向微博热榜页面发送 HTTP 请求,获取网页的 HTML 内容。 - 解析 HTML :借助
cheerio
模块将 HTML 内容转换为可操作的 DOM 对象,方便我们提取所需数据。 - 提取数据 :通过选择器定位到每个热门话题的
<tr>
元素,然后分别提取排名、标题、热度和链接信息。 - 保存数据:将提取的数据存储到合适的数据结构中,如数组或对象,也可以保存到文件中,如 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);
});
代码详细解释:
-
模块引入:
request - promise
:用于发送 HTTP 请求,获取网页内容。cheerio
:将 HTML 内容转换为可操作的 DOM 对象,方便数据提取。csv - writer
:将提取的数据保存到 CSV 文件中。
-
发送请求:
rp(WEIBO_HOT_URL)
:向微博热榜页面发送 GET 请求,返回一个 Promise 对象。当请求成功时,会执行.then
方法,将 HTML 内容作为参数传递给回调函数。
-
解析 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
数组中。
-
保存数据到 CSV 文件:
const csvWriter = createCsvWriter({...})
:创建一个 CSV 写入器,指定文件路径和表头信息。csvWriter.writeRecords(hotTopics)
:将hotTopics
数组中的数据写入 CSV 文件,返回一个 Promise 对象。当写入成功时,会执行下一个.then
方法,输出成功信息。
-
错误处理:
.catch((error) => { console.error('请求出错:', error); })
:捕获请求过程中可能出现的错误,并输出错误信息。
四、注意事项
-
反爬虫机制:微博网站可能有反爬虫机制,如 IP 封禁、验证码等。在实际使用时,可能需要使用代理 IP、设置请求头、控制请求频率等方法来绕过反爬虫机制。
-
网页结构变化:网页结构可能会随着时间或版本更新而变化,需要定期检查和调整代码中的选择器,以确保能够正确提取数据。
通过以上分析,我们可以看到如何从微博热榜网页源码出发,编写爬虫代码来提取所需数据,并将其保存到文件中。这为我们进一步分析和利用微博热榜数据提供了基础