爬虫:传统编程与AIGC的碰撞

349 阅读5分钟

爬虫

爬虫,大家一定都不陌生。爬虫,全称为网络爬虫(Web Crawler),也被形象地称为网页蜘蛛(Web Spider)、网络机器人(Web Robot)等,是一种自动化地获取网页内容的程序或脚本。它们遵循预先设定的规则,遍历互联网上的网页,提取有用的信息,并存储在本地数据库或进行进一步处理。爬虫技术是大数据时代信息收集与处理的重要工具,广泛应用于搜索引擎、数据分析、市场研究、竞争对手监控等领域。

爬虫的工作流程大致可以分为以下几个步骤:

  1. 目标定义:确定爬取的目标网站或网页范围,明确需要收集的数据类型和格式。
  2. 请求发送:爬虫程序向服务器发送HTTP/HTTPS请求,就像我们在浏览器中输入网址然后按下回车键一样。
  3. 内容获取:服务器接收到请求后,会返回响应,通常包含HTML、XML、JSON等格式的数据。爬虫程序接收并下载这些内容。
  4. 数据解析:爬虫程序对下载的页面内容进行解析,提取所需的信息。解析方法可以是正则表达式、XPath、BeautifulSoup、Pandas等工具。
  5. 数据存储:提取到的数据被清洗、整理后,存储在数据库(如MySQL、MongoDB)或文件(如CSV、JSON文件)中,以便后续分析或使用。
  6. 循环迭代:爬虫根据预先设定的逻辑(如深度优先、广度优先、特定条件等),自动跳转到下一个链接继续上述过程,直到满足停止条件(如爬取到一定数量的页面、达到预设时间等)。

传统编程思维实现爬虫

1.根据url,发送一个http请求从而拿到html 。

2.根据html进行分析,拿到电影的内容 。

3.返回内容。

因为爬虫被广泛的认为是后端的技术,所以前端工程师需要把后端转化为前端,于是我们选择Node.js解决问题。

Node.js 本身作为基础运行环境,提供 JavaScript 在服务器端运行的能力,实现从前端到后端的无缝衔接。而且Node.js的包管理器可以通过npm i命令下载各种各样的包,帮助我们解决问题。

今天我们以爬取豆瓣电影网页为例

首先我们需要通过命令行输入以下命令下载相应的资源包

npm i cheerio:npm i cheerio 是一个在命令行中使用的命令,用于通过Node.js的包管理器npm安装Cheerio库。Cheerio是一个轻量级的Node.js库,它提供了类似于jQuery的API来处理和解析HTML文档。 在内存中,模拟DOM对象。

npm i request-promise:npm i request-promise 是一个在命令行中执行的npm命令,用于安装“request-promise”这个Node.js库。它为Request库添加了Promise支持,使得发起HTTP请求并在请求完成时处理响应变得更加简洁和易于阅读。发出http请求。

通过require函数调用cheerio库和request-promise库

const request = require('request-promise');
const cheerio = require('cheerio');

用cheerio库加载和解析HTML内容

let $ = cheerio.load(html)
 const movieList = []
     for (let i = 0; i < movieNodes.length;i++) {
         // 封装
         // 将一段电影的html解析 剥离出去
         // 这段功能相对独立 可以复用
         // main比较复杂了,一个函数超过10行代码,里面一定可以再分函数
         movieList.push(getMovieInfo(movieNodes[i]));
     }
     console.log(movieList);
 }

const getMovieInfo = function(node){
    let movieInfo = {}
    // 将tr加载进内存
    let $$ = cheerio.load(node)
    let title = $$('.pl2 a').text()
    let pic = $$('.nbg img').attr('src')
    // console.log(pic);
    // console.log(title);
    let info = $$('p.pl').text()
    let rating_nums = $$('.rating_nums').text()

    movieInfo.title = title
    movieInfo.pic = pic
    movieInfo.info = info
    movieInfo.rating_nums = rating_nums

    return movieInfo
}

完整JS代码如下:

const request = require('request-promise');
const cheerio = require('cheerio');

//将豆瓣网页的电影列表html爬取
//返回JSON数组,每一电影项包含name,desc,score...
//单点入口
async function main(){
    // 代码 分步细化,程序员思维
    // 伪代码
    // 根据url 发送一个http请求 拿到html
    // 根据html 分析,拿到电影内容
    // 返回内容
    // await    LLM
    // 良好的编程规范
    const URL = "https://movie.douban.com/chart"
    // http 请求 html   408 基于请求
    const html = await request({
        url:URL
    })
    //console.log(html);

     //html分析   document + 选择器 cheerio满足
     //将html字符串加载到内存中(用命令行运行),$ = Document
     let $ = cheerio.load(html)
     const movieList = []
     for (let i = 0; i < movieNodes.length;i++) {
         // 封装
         // 将一段电影的html解析 剥离出去
         // 这段功能相对独立 可以复用
         // main比较复杂了,一个函数超过10行代码,里面一定可以再分函数
         movieList.push(getMovieInfo(movieNodes[i]));
     }
     console.log(movieList);
 }

const getMovieInfo = function(node){
    let movieInfo = {}
    // 将tr加载进内存
    let $$ = cheerio.load(node)
    let title = $$('.pl2 a').text()
    let pic = $$('.nbg img').attr('src')
    // console.log(pic);
    // console.log(title);
    let info = $$('p.pl').text()
    let rating_nums = $$('.rating_nums').text()

    movieInfo.title = title
    movieInfo.pic = pic
    movieInfo.info = info
    movieInfo.rating_nums = rating_nums

    return movieInfo
}
main()

实现效果如下:

image.png

如何将AIGC与传统编程结合?

使用prompt关键词对AI进行提问。使用AIGC编程可以省略大概1/3的流程性代码(html parse),使得工作效率大大提高。

首先在命令行输入 npm i openai下载openai的资源包

通过require函数调用openai库

const OpenAI = require('openai')
const client = new OpenAI({
    // 凭证 密钥  算力收费  token
    apiKey: '******',
    baseURL: 'https://api.chatanywhere.tech/v1'
})

然后根据自身的需求向AI输入prompt进行提问

 let prompt = `
    ${movie_html}
    这是一段电影列表html,请获取电影名(name),封面链接(picture),简介(info),评分(score),评论人数(commentsNumber),
    请使用括号内的单词作为属性名,以JSON的格式返回。`

完整JS代码如下:

// AIGC LLM 生成式内容
// tr 字符串要生成movie json对象
// input prompt 
const OpenAI = require('openai')
const client = new OpenAI({
    // 凭证 密钥  算力收费  token
    apiKey: '*****',
    baseURL: 'https://api.chatanywhere.tech/v1'
})

async function main(){
    // 代码 分步细化,程序员思维
    // 伪代码
    // 根据url 发送一个http请求 拿到html
    // 根据html 分析,拿到电影内容
    // 返回内容
    // await    LLM
    // 良好的编程规范
    const URL = "https://movie.douban.com/chart"
    // http 请求 html   408 基于请求
    const html = await request({
        url:URL
    })
    //console.log(html);
    
     let $ = cheerio.load(html)
     
     const movieNodes = $('#content .article .item')
     let movie_html = ''
     for(let i = 0; i < 2;i++) {
        movie_html += cheerio.load(movieNodes[i]).html()
    }
     console.log(movie_html);
     let prompt = `
     ${movie_html}
    这是一段电影列表html,请获取电影名(name),封面链接(picture),简介(info),评分(score),评论人数(commentsNumber),
    请使用括号内的单词作为属性名,以JSON的格式返回。`

    const chatCompletion = await client.chat.completions.create({
        model:'gpt-3.5-turbo',//适合聊天的模型 很多种
        messages:[{
            role:'user',
            content:prompt
        }]
    })
    console.log(chatCompletion.choices);
    
    main()

实现效果如下:

image.png

由此可见,利用AIGC实现prompt关键词工程可以省略许多代码的输入,大大提升了效率。

结合传统编程方法与AI生成内容的创新实践,不仅重塑了编程工作的流程,显著增强了开发速度,还为技术领域的边界拓宽探索了崭新方向。特别是在爬虫程序开发这一经典领域,AI技术的融入生动展现了其在任务自动化与智慧处理上的广阔前景。技术迭代的浪潮之下,开发者角色正逐步从单纯的代码编写者转变为高阶的“设计思考者”,更多聚焦于创意构思与策略规划,而AI则化身为实现编程高效性的强有力伙伴。这一融合趋势,必将引领编程世界步入一个前所未有的高效智能新时代。