爬虫
爬虫,大家一定都不陌生。爬虫,全称为网络爬虫(Web Crawler),也被形象地称为网页蜘蛛(Web Spider)、网络机器人(Web Robot)等,是一种自动化地获取网页内容的程序或脚本。它们遵循预先设定的规则,遍历互联网上的网页,提取有用的信息,并存储在本地数据库或进行进一步处理。爬虫技术是大数据时代信息收集与处理的重要工具,广泛应用于搜索引擎、数据分析、市场研究、竞争对手监控等领域。
爬虫的工作流程大致可以分为以下几个步骤:
- 目标定义:确定爬取的目标网站或网页范围,明确需要收集的数据类型和格式。
- 请求发送:爬虫程序向服务器发送HTTP/HTTPS请求,就像我们在浏览器中输入网址然后按下回车键一样。
- 内容获取:服务器接收到请求后,会返回响应,通常包含HTML、XML、JSON等格式的数据。爬虫程序接收并下载这些内容。
- 数据解析:爬虫程序对下载的页面内容进行解析,提取所需的信息。解析方法可以是正则表达式、XPath、BeautifulSoup、Pandas等工具。
- 数据存储:提取到的数据被清洗、整理后,存储在数据库(如MySQL、MongoDB)或文件(如CSV、JSON文件)中,以便后续分析或使用。
- 循环迭代:爬虫根据预先设定的逻辑(如深度优先、广度优先、特定条件等),自动跳转到下一个链接继续上述过程,直到满足停止条件(如爬取到一定数量的页面、达到预设时间等)。
传统编程思维实现爬虫
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()
实现效果如下:
如何将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()
实现效果如下:
由此可见,利用AIGC实现prompt关键词工程可以省略许多代码的输入,大大提升了效率。
结合传统编程方法与AI生成内容的创新实践,不仅重塑了编程工作的流程,显著增强了开发速度,还为技术领域的边界拓宽探索了崭新方向。特别是在爬虫程序开发这一经典领域,AI技术的融入生动展现了其在任务自动化与智慧处理上的广阔前景。技术迭代的浪潮之下,开发者角色正逐步从单纯的代码编写者转变为高阶的“设计思考者”,更多聚焦于创意构思与策略规划,而AI则化身为实现编程高效性的强有力伙伴。这一融合趋势,必将引领编程世界步入一个前所未有的高效智能新时代。