nodejs抓取动态网页(寻找爬取的目标首先我们需要解决这一问题..)
优采云 发布时间: 2021-12-11 01:20nodejs抓取动态网页(寻找爬取的目标首先我们需要解决这一问题..)
寻找爬取目标
首先,我们需要一个坚定的目标,所以找一个更好看的网站,统计一些信息,比如url/tag/title/number...等信息
init(1, 2); //设置页数,现在是1-2页
async function init(startPage, endPage) {
for (let i = startPage; i {
if (err) reject(err);
if (response && response.statusCode === 200) {
resolve(body);
} else {
reject(`请求✿✿✿${url}✿✿✿失败`);
}
});
});
return promise;
}
加油
官网
爬虫需要抓取页面上的特定信息。它需要根据一些标识符来获取想要的信息,不如id。比如class.cheerio就是这样一个工具,它把网站的信息直接转化为一个用于提取jquery的dom的模块。 Cheerio的出现用于服务器需要操作dom的地方。
基本使用
let cheerio = require('cheerio');
let $ = cheerio.load("hello world", {ignoreWhitespace: true...})
选项用于一些特殊的定制等
选择器
和jquery基本一样
$(".helloworld").text();
属性操作遍历操作DOM其他
在项目中使用
let homeBody = await handleRequestByPromise({ url: pageImgSetUrl });
let $ = cheerio.load(homeBody);
let lis = $(".hezi li");
以上是通过cheerio转换得到的html数据,可以直接用$符号使用类似dom的方法。特别适合前端使用
图标精简版
有时得到的数据是一些乱码,尤其是中文。所以需要解决乱码的问题,iconv-lite模块可以解决这个问题。
homeBody = iconv.decode(homeBody,"GBK"); //进行gbk解码
如果乱码在cheerio.load()之前解码。 (这次用的是网站,没有乱码)。原因是
//这里是utf-8
如果是gbk或者gbk2312需要解码
爬取过程寻找目标控制台查看dom的信息存储或标识符(id、class、element),爬取title、url、tag、num等信息进行存储下载(如果只需要链接,其实可以不下载。不过很多网站对图片的外部导入有限制)存储在(mysql)中,导出一个html供图片查看(简单相册网站)初始化
还是创建本地服务器,asynchronous没有使用async模块,而是直接使用es6的async/await语法。
let http = require("http");
let url = require("url");
let Extend = require("./Extend");
let xz = new Extend(1, 2);
http
.createServer((request, response) => {
let pathname = url.parse(request.url).pathname;
if (pathname !== "/favicon.ico") {
router(pathname)(request, response);
}
})
.listen(9527);
console.log("server running at http://127.0.0.1:9527/");
function router(p) {
let router = {
"/": (request, response) => {
response.writeHead(200, { "Content-type": "text/html;charset=utf-8" });
response.end();
},
"/xz": async (request, response) => {
response.writeHead(200, { "Content-type": "text/html;charset=utf-8" });
await xz.init(response);
response.end();
},
"/404": (request, response) => {
response.writeHead(404, { "Content-Type": "text/plain;charset=utf-8" });
response.end("404找不到相关文件");
}
};
!Object.keys(router).includes(p) && (p = "/404");
return router[p];
}
分析页面
只需右键单击并在控制台中查看即可。看班级和id。 Cheerio实现的jquery的dom相关api很强大,直接$("")即可。
分析和爬取网站
开始对网站数据进行分析和爬取。如果在cheerio操作之前对乱码进行解码,那么所有爬取到的数据都会通过一个变量进行保存。也可以创建相应的文件夹和txt文件进行保存(writeFile),也可以在这里直接将数据保存到数据库中。 (看心情)
下载图片
开始下载图片并创建对应的文件夹保存
async downloadAllImg() {
let length = this.all.length;
for (let index = 0; index < length; index++) {
let childs = this.all[index].childs;
let title = this.all[index].title;
if (childs) {
let c_length = childs.length;
for (let c = 0; c < c_length; c++) {
if (!fs.existsSync(`mrw`)) {
fs.mkdirSync(`mrw`);
}
if (!fs.existsSync(`mrw/${title}`)) {
fs.mkdirSync(`mrw/${title}`);
}
await super.downloadImg(
childs[c],
`mrw/${title}/${title}_image${c}.jpg`
);
console.log(
"DownloadThumbsImg:",
title,
"SavePath:",
`mrw/${title}/${title} image${c}.jpg`
);
}
}
}
}
下载后保存到数据库
下载mysql模块用于mysql数据库操作
const fs = require("fs");
const mysql = require("mysql");
const path_dir = "D:\\data\\wwwroot\\xiezhenji.web\\static\\mrw\\";
const connection = mysql.createConnection({
host: "xxxx",
port: "xxxx",
user: "xiezhenji",
password: "iJAuzTbdrDJDswjPN6!*M*6%Ne",
database: "xiezhenji"
});
module.exports = {
insertImg
};
function insertImg() {
connection.connect();
let files = fs.readdirSync(path_dir, {
encoding: "utf-8"
});
files.forEach((file, index) => {
let cover_img_path = `/mrw/mrw_${index + 1}/image_1`;
insert([
"美女",
file,
Number(files.length),
file,
cover_img_path,
`mrw/mrw_${index + 1}`,
`mrw_${index + 1}`
]);
});
}
function insert(arr) {
let sql = `INSERT INTO photo_album_collect(tags,name,num,intro,cover_img,dir,new_name) VALUES(?,?,?,?,?,?,?)`;
let sql_params = arr;
connection.query(sql, sql_params, function(err, result) {
if (err) {
console.log("[SELECT ERROR] - ", err.message);
return;
}
console.log("--------------------------SELECT----------------------------");
console.log(result);
console.log(
"------------------------------------------------------------\n\n"
);
});
}
文档