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 ...
随机推荐
- 生产环境频繁内存溢出,原来就是因为这个“String类”
摘要:如果在程序中创建了比较大的对象,并且我们基于这个大对象生成了一些其他的信息,此时,一定要释放和这个大对象的引用关系,否则,就会埋下内存溢出的隐患. 本文分享自华为云社区<[高并发]你敢信? ...
- Mybatis框架基础入门(一)--简介及优势
一.什么是Mybatis 这里借用官网的一句话介绍什么是mybatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC ...
- CyclicBarrier 和 CountDownLatch 的区别 ?
1.CountDownLatch 简单的说就是一个线程等待,直到他所等待的其他线程都执 行完成并且调用 countDown()方法发出通知后,当前线程才可以继续执行. 2.cyclicBarrier ...
- Java中如何强制类型转换
例如,当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.此时就需要通过强制类型转换来 ...
- 四、Springboot+jpa+mycat应用
一.后台配置文件 # 连接地址 url: jdbc:mysql://127.0.0.1:8066/CHUNK?useUnicode=true&characterEncoding=utf-8&a ...
- Javascript Range对象的学习
Range对象有几个特别难理解的属性,这里学习总结下 Range.startOffset:返回一个表示 Range 起点在 startContainer 中的位置的数字.此属性的值与Range.sta ...
- RENIX非对称时延测试——网络测试仪实操
本文主要介绍RENIX软件如何进行非对称时延测试.文章分为四部分,第一部分为非对称时延概述,第二部分为测试说明,第三部分为测试配置,第四部分为测试报告. 第一部分:非对称时延概述 1.RFC2544测 ...
- BMZCTF phar???
pchar??? 补充知识点 开始这题之前我们先补充一个知识点 phar 的文件包含 和上面类似先创建一个phar 标准包,使用 PharData 来创建,然后添加文件进去phar里面. 然后在文件包 ...
- GC和GC Tuning
GC和GC Tuning GC的基础知识 什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上简单 ...
- Altium_Designer PCB文件的绘制(上:PCB基础和布局)
PCB设计基础知识 PCB面板 在PCB设计中,最重要的一个面板就是"PCB面板".该面板的功能主要是对电路板中的各个对象进行精确定位,并以特定的效果显示出来.该面板还可以对各种对 ...