nodejs抓取动态网页(寻找爬取的目标首先我们需要解决这一问题..)

优采云 发布时间: 2021-12-11 01:20

  nodejs抓取动态网页(寻找爬取的目标首先我们需要解决这一问题..)

  寻找爬取目标

  首先,我们需要一个坚定的目标,所以找一个更好看的网站,统计一些信息,比如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的方法。特别适合前端使用

  图标精简版

  有时得到的数据是一些乱码,尤其是中文。所以需要解决乱码的问题,ic​​onv-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"

);

});

}

  文档

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线