likes
comments
collection
share

全栈实操第一步:使用爬虫爬取网页信息

作者站长头像
站长
· 阅读数 54

前言

编程是一个复杂的过程,需要扎实的基础知识和良好的实践能力。然而,随着人工智能技术的不断发展,AIGC在编程领域的应用越来越广泛。通过利用LLM等先进技术,我们可以让AI协助完成部分编程任务,提高编程效率和质量。但同时,人类程序员的专业素养和创造力仍然是不可替代的。

今天,我们站在科技与创新的交汇点上,将引入前沿的AIGC(人工智能生成内容)方法,结合我们之前深入学习的全栈知识,共同开发一个强大的爬虫,目标锁定在豆瓣电影页面上的豆瓣电影Top 250榜单上。想象一下,前端、后端以及AIGC技术的融合,将赋予我们前所未有的能力,让我们仿佛拥有了“一个人打三份工”的超能力。这不仅是对我们技能的一次全面展示,更是对AI技术无限潜力的探索与尝试。

让我们all in AI,用智慧和热情冲击大厂,开创属于我们的科技新时代!在这个过程中,我们将不断挑战自我,挖掘潜力,共同书写属于我们的辉煌篇章。

了解爬虫

什么是爬虫呢?爬虫是一种模拟人从客户端向服务器发送请求以抓取数据的脚本,这些数据可以是网页内容、图片、视频等。爬虫通过模拟浏览器的行为(如发送HTTP请求)来获取网页数据。我们首先需要理清他的工作流程。

a. 发送HTTP请求:

爬虫首先会向目标网站发送一个HTTP请求。

b. 接收HTTP响应:

服务器在接收到HTTP请求后,会返回一个HTTP响应。这个响应通常包含一个状态码(如200表示成功)和一个响应体。响应体通常就是网页的HTML内容,也就是一个包含网页结构和数据的HTML字符串。

c. 解析HTML字符串:

爬虫在接收到HTML字符串后,解析这个字符串,提取出需要的数据。最后定位到电影列表的位置,并提取出电影的信息。

d. 提取数据并处理:

在解析HTML的过程中,爬虫会提取出需要的数据,如电影的名字、评分、简介等。这些数据会被存储为一个个电影对象。

e. 存储或返回数据:

提取出的数据可以以各种方式进行处理和存储,最后以JSON数组的方式返回。

启动Node.js项目

当使用Node.js来编写一个爬虫作为后端功能时,我们可以按照以下步骤来组织和初始化项目:

1. 初始化项目

使用npm init -y命令初始化一个新的Node.js项目,并生成一个默认的package.json文件。这个文件用于描述你的项目,包括项目的名称、版本、依赖项等信息。

2. 安装第三方包

对于爬虫项目,需要安装第三方包来帮助我们发送HTTP请求、解析HTML内容等。使用npm install(或简写为npm i)命令可以安装这些包。在这里我们安装request-import模块到项目中。

3. 安装cheerio

通过npm i cheerio安装cheerio模块到项目中。cheerio是一个快速且灵活的库,用于解析和操作HTML

实操

1.引入HTTP请求库

let request = require('request-promise') 
let cheerio = require('cheerio') 
let fs = require('fs')
const util = require('util')

2.定义变量

let movies = []
let basicUrl = 'https://movie.douban.com/top250'

3.手搓“单例执行”模式

let once = function (cb) {
    let active = false;
    return function () {
        if (!active) {
            cb();
            active = true;
        }
    };
};

function log(item) {
    // 我们需要调用 once 函数返回的函数来确保只执行一次  
    const logOnce = once(() => {
        console.log(item);
    });
    // 因为 logOnce 是在这里定义的,我们可以直接调用它  
    logOnce();
}

// 现在,每次调用 log 函数时,都会打印 item
//但只打印一次(因为 logOnce 被调用了一次)  
log('Hello, world!'); 
// 输出 "Hello, world!"  
log('This will not be logged');
// 不会输出任何内容,因为 logOnce 已经执行过了

4.构造一个函数爬取信息

  1. getMovieInfo(node) 函数

    • 这个函数接受一个 HTML 节点 node 作为参数。
    • 使用 cheerio.load(node) 将这个节点加载到 cheerio 对象中,以便使用类似 jQuery 的选择器来查询和操作它。
    • 使用选择器 $('.info .hd span') 查找电影标题,并将它们存储在一个数组中。
    • 使用选择器 $('.info .bd') 查找电影的详细信息区域。
    • 从详细信息区域中提取电影的文本描述和评分。
    • 最后,返回一个对象,其中包含电影的标题数组、详细信息文本和评分。
function getMovieInfo(node) {
    let $ = cheerio.load(node)
    let titles = $('.info .hd span')
    titles = ([]).map.call(titles, t => {
        return $(t).text()
    })
    let bd = $('.info .bd')
    let info = bd.find('p').text()
    let score = bd.find('.star .rating_num').text()
    return { titles, info, score }
}

5.构造一个函数返回数组

  1. getPage(url, num) 函数

    • 这是一个异步函数,它接受一个 URL url 和一个页码 num 作为参数。
    • 使用 request 库发送一个 GET 请求到指定的 URL。
    • 在控制台中打印一条消息,表示已成功连接到服务器并正在爬取指定页码的数据。
    • 使用 cheerio.load(html) 将返回的 HTML 加载到 cheerio 对象中。
    • 使用选择器 $('#content .article .grid_view .item') 查找页面上的所有电影节点。
    • 对于每个电影节点,调用 getMovieInfo(node) 函数来获取电影的详细信息,并将结果存储在一个数组中。
    • 返回包含所有电影信息的数组。
async function getPage(url, num) {
    let html = await request({
        url
    })
    console.log('连接成功!', `正在爬取第${num + 1}页数据`)
    let $ = cheerio.load(html)
    let movieNodes = $('#content .article .grid_view').find('.item')
    let movieList = ([]).map.call(movieNodes, node => {
        return getMovieInfo(node)
    })
    return movieList
}

6.构造函数将数据保存到JSON文件中

异步地从一系列 URL 中抓取数据,并将这些数据组合成一个数组,然后保存这个数组到一个 JSON 文件中

async function main() {
    let count = 25
    let list = []
    for (let i = 0; i < count; i++) {
        let url = basicUrl + `?start=${25 * i}`
        list.push(... await getPage(url, i))
    }
    
    console.log(list.length)
    fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {
        console.log('生成json文件成功!')
    })
}
main()

for 循环 它遍历从 0 到 count - 1 的数字(在这种情况下是 0 到 24)。对于每个数字 i

  • 创建一个 URL,该 URL 基于 basicUrl和一个查询参数 start,其值是基于 i 的计算(25 * i)。
  • 调用 getPage(url, i) 函数
  • 使用 await 等待 getPage 函数返回的 Promise 完成,并将解析得到的数据数组的元素添加到 list 数组中。注意,这里使用了扩展运算符 ... 来将数组的元素“展开”并添加到 list 中,而不是将整个数组作为一个元素添加到 list 中。

输出和保存数据

  • 首先,使用 console.log(list.length) 打印出 list 数组的长度,也就是从所有 URL 抓取的数据的总数。
  • 然后,使用 fs.writeFile 方法(这是 Node.js 的文件系统模块的一个方法)将 list 数组转换为 JSON 字符串,并保存到名为 output.json 的文件中。文件编码设置为 'utf-8'。
  • 当文件写入完成后,fs.writeFile 的回调函数会被调用,打印出 "生成json文件成功!"。

全栈实操第一步:使用爬虫爬取网页信息

利用LLM

对于我们打工人来说,时间是相当宝贵的,即使是要实现以上简单的爬虫功能过程都十分繁琐,但是LLM语言大模型和AIGC的出现让很多代码的实现变得十分轻松。以本期文章内容为例,我们只需要将我们思想思路捋顺,将其丢给ai即可,这里我已经为各位准备好了思路稿,大家可以将他放进语言模型中看看生成的代码是否能够正常运行。

转载自:https://juejin.cn/post/7373136303178907659
评论
请登录