Node爬取网站数据
npm安装cheerio和axios
npm isntall cheerio npm install axios
利用cheerio抓取对应网站中的标签根据链接使用axios获取对应页面数据
const cheerio = require('cheerio');
//获取HTML文档的内容
const request = require('request');
const {writeFile,mkDir} = require('../lcf');
const fs = require('fs');
const url = require('url');
const path = require("path");
const axios = require("axios");
const { title } = require('process');
const httpUrl = "https://www.pkdoutu.com/article/list";
async function wait(millSeconds) {
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve("success");
},millSeconds);
})
}
function req(options) {
return new Promise((resolve,reject) => {
request.get(url,headers,function(err,response,body) {
if(err) {
reject(err);
} else {
resolve({response,body});
}
})
})
}
async function getPageNum() {
const { response,body } = await req(httpUrl);
const $ = cheerio.load(body);
const linkLength = $('.page-link').length;
let num = $('.page-link').eq(linkLength - 2).text();
return num;
}
async function getImgList() {
let allNum = await getPageNum();
for(let i=1;i<=10;i++) {
if(i!=1) {
await wait(3000*i);
}
parsePage(httpUrl+"?page="+i)
}
}
async function parsePage(url) {
let { response,body } = await req(url);
let $ = cheerio.load(body);
let reg = /(.*?)\d/i;
$('#home .col-sm-9>a').each(async (index,ele) => {
let pageUrl = $(ele).attr('href');
let title = $(ele).find('.random_title').text();
title = reg.exec(title)[1];
let reg2 = /[/*?:<>|\"\\\\]+/g;
title = title.replace(reg2,"");
console.log(title)
if(!fs.existsSync("img/"+title)) {
mkDir("img/"+title);
console.log("创建目录成功:",title);
getImg(pageUrl,title);
}
})
}
async function getImg(pageUrl,title) {
let { response,body } = await req(pageUrl);
let $ = cheerio.load(body);
$('.pic-content img').each(async (index,ele) =>{
await wait(50*index);
let imgUrl = $(ele).attr('src');
let extName = path.extname(imgUrl);
//创建文件写入流
let imgPath = `img/${title}/${title}-${index}${extName}`;
let ws = fs.createWriteStream(imgPath);
axios.get(imgUrl,{responseType: 'stream'}).then(res => {
res.data.pipe(ws);
console.log("图片加载完成:" + imgPath)
})
})
};
getImgList();
如果对应网站有SSL证书,可以利用puppeteer模拟浏览器进行操作
npm install puppeteer
let puppeteer = require('puppeteer');
async function test() {
let options = {
defaultViewport: {
width: 1400,
height: 800
},
headless: false
}
let browser = await puppeteer.launch(options);
let page = await browser.newPage();
await page.goto('https://www.taobao.com/');
await page.screenshot({path: "screenshot.png"});
//$eval 返回一个promise对象
//$page 返回一个elementHandle
// let elementArr = await page.$$eval(".service-bd a",(elements)=>{
//$获取一个元素 $$获取多个元
//$waitfor 等待元素完成
let elementArr = await page.$$(".service-bd a",(elementArr) => {
let eles = [];
elements.forEach((item,index) => {
if(item.getAttribute("href")!="#") {
var eleobj = {
href: item.getAttribute("href"),
text: item.innerHTML
}
eles.push(eleobj);
}
})
return eles;
})
let searchInput = await page.$('#q',(ele) => {
return ele;
})
await searchInput.focus();
await page.keyboard.type("台灯");
let searchBtn = await page.$(".btn-search",(ele) => elementArr)
await searchBtn.click();
// let loginId = await page.$("#fm-login-id",(ele) => ele);
// let loginPassword = await page.$("#fm-login-password",(ele) => ele);
// setTimeout(async ()=>{
// await loginId.focus();
// await page.keyboard.type("3161775809@qq.com");
// setTimeout(async ()=>{
// await loginPassword.focus();
// await page.keyboard.type("a13851467182");
// },4000)
// },4000);
page.on('console',function(eventMsg){
console.log(eventMsg.text());
})
}
test();
Node爬取网站数据的更多相关文章
- 利用linux curl爬取网站数据
看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在 ...
- 手把手教你用Node.js爬虫爬取网站数据
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 开始之前请先确保自己安装了Node.js环境,还没有安装的的童鞋请自行百度 ...
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
- 利用phpspider爬取网站数据
本文实例原址:PHPspider爬虫10分钟快速教程 在我们的工作中可能会涉及到要到其它网站去进行数据爬取的情况,我们这里使用phpspider这个插件来进行功能实现. 1.首先,我们需要php环境, ...
- python爬取网站数据保存使用的方法
这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文 编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这 ...
- C# 关于爬取网站数据遇到csrf-token的分析与解决
需求 某航空公司物流单信息查询,是一个post请求.通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使用避免CSRF攻击机制,直接发挥40X错误. 关于CSRF ...
- 3.15学习总结(Python爬取网站数据并存入数据库)
在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...
- 使用node.js如何爬取网站数据
数据库又不会弄,只能扒扒别人的数据了. 搭建环境: (1).创建一个文件夹,进入并初始化一个package.json文件. npm init -y (2).安装相关依赖: npm install ...
- Python 爬取网站数据
一.使用request库实现批量下载HTML 二.使用BeautifulSoup库实现html解析 官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4 ...
随机推荐
- 洛谷P1049 [NOIP2001 普及组] 装箱问题
本题就是一个简单的01背包问题 1.因为每个物品只能选一次,而且要使箱子的剩余空间为最小.所以可以确定属性为 MAX 2.由于是从n个物品里面选i个物品 那么就是选出的i个物品的空间总和要尽可能的 ...
- 摆烂期的Android学习笔记一
Android大致分为四层架构1.Linux内核层:提供各种硬件驱动,如显示驱动,音频驱动,相机驱 动,蓝牙驱动.... 2.系统运行库层:通过C/c++库为android地图提供支持 3.应用框架层 ...
- 关于Gradle 6.x及以上版本发布到仓库有很多CheckSum文件,想去除?
写在前边 今天写的这个博客和平时的博客有点区别,大多数都是告诉你解决问题的,而本文不完全是. 经常使用Gradle的都知道 Gradle有两个发布制品到Maven仓库的插件:maven 与 maven ...
- Schema和数据类型优化?
整数TinyInt,SmallInt,MediumInt,Int,BigInt 使用的存储8,16,24,32,64位存储空间.使用Unsigned表示不允许负数,可以使正数的上线提高一倍.实数 Fl ...
- Collection框架中实现比较要实现什么接口?
Java集合框架中需要比较大小的集合包括TreeMap.TreeSet,其中TreeMap会根据key-value对中key的大小进行排序,而TreeSet则会对集合元素进行排序. 因此TreeMap ...
- ThreadPoolTaskExecutor原理、详解及案例
为什么要用线程池? 服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的. 构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请 ...
- 202A 202B 202C 202D 202E字符的作用及解释
这里你会发现在值的前后有2个\u开头的控制字符:转换网址:http://www.jsons.cn/utf8/ 解释:https://blog.csdn.net/haiyan1111/article/d ...
- 如果leader crash时,ISR为空怎么办?
kafka在Broker端提供了一个配置参数:unclean.leader.election,这个参数有两个值:true(默认):允许不同步副本成为leader,由于不同步副本的消息较为滞后,此时成为 ...
- String s = new String("xyz");创建了几个String Object?二者之间有什么区别?
两个或一个,"xyz"对应一个对象,这个对象放在字符串常量缓冲区,常量"xyz"不管出现多少遍,都是缓冲区中的那一个.New String每写一遍,就创建一个新 ...
- 面试问题之C++语言:如何避免内存泄漏?
转载于:https://www.php.cn/csharp-article-416104.html 1.不要手动管理内存,可以尝试在适用的情况下使用智能指针. 2.使用string而不是char*.s ...