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 ...
随机推荐
- 《前端运维》四、Jenkins--持续构建
首先,我们先来了解下什么叫做持续构建.持续构建简称CI,负责拉取代码库中的代码后,执行用户预定义的脚本,通过一系列编译操作构建出一个制品,并将制品推送到制品库里.常用的持续构建工具有 Gitlab C ...
- overflow原理?
overflow: hidden能清除块内子元素的浮动影响. 因为该属性进行超出隐藏时需要计算盒子内所有元素的高度, 所以会隐式清除浮动 创建BFC条件(满足一个): float的值不为none: o ...
- synchronized底层实现原理及锁优化
一.概述 1.synchronized作用 原子性:synchronized保证语句块内操作是原子的 可见性:synchronized保证可见性(通过"在执行unlock之前,必须先把此变量 ...
- 是否可以继承String类?
String 类是final类,不可以被继承. 补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A) ...
- Redis 最适合的场景?
1.会话缓存(Session Cache) 最常用的一种使用 Redis 的情景是会话缓存(session cache).用 Redis 缓存会 话比其他存储(如 Memcached)的优势在于:Re ...
- 使用 Docker, 7 个命令部署一个 Mesos 集群
这个教程将给你展示怎样使用 Docker 容器提供一个单节点的 Mesos 集群(未来的一篇文章将展示怎样很容易的扩展这个到多个节点或者是见底部更新).这意味着你可以使用 7 个命令启动整个集群!不需 ...
- 网络协议之:socket协议详解之Datagram Socket
目录 简介 什么是Datagram Socket 使用socat来创建UDP服务 使用ss命令来监控Datagram Sockets 使用nc建立和UDP Socket的连接 总结 简介 上一篇文章我 ...
- nodejs和树莓派开发以及点亮RGB的LED灯代码
前段时间集团举行前端IOT比赛,借此机会熟悉了树莓派相关的东西,特此记录一些相关的文档和开发指南. 先介绍一些树莓派的入门教程 阮一峰的树莓派入门 微雪电子-树莓派硬件中文官网 ssh链接树莓派 ss ...
- 彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index
前言 最近,在项目中遇到一个关于CSS中元素z-index属性的问题,具体问题不太好描述,总结起来就是当给元素和父元素色设置position属性和z-index相关属性后,页面上渲染的元素层级结果和我 ...
- 前端面试题整理——VUE双向绑定原理
VUE2.0和3.0数据双向绑定的原理,并说出其区别. 代码: <!DOCTYPE html> <html lang="en"> <head> ...