Node.js爬取百度图片瀑布流,使用class类封装。
//爬取百度高清图片
const phantom = require('phantom')
const express = require('express');
const app = express();
const fs= require('fs');
const cheerio = require('cheerio');
const request = require('request')
let server = app.listen(2000, function () {
let host = server.address().address;
let port = server.address().port;
console.log('Your App is running at http://%s:%s', host, port);
}); class stealData { constructor() {
// this.base_url = 'https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%B6%AF%C2%FE%B1%DA%D6%BD&fr=ala&ala=1&pos=0&alatpl=wallpaper&oriquery=%E5%8A%A8%E6%BC%AB%E5%A3%81%E7%BA%B8'; //要爬取的网站
// this.base_url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&oq=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&rsp=-1'
this.base_url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&oq=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&rsp=-1' this.current_page = 1;
this.result_list = [];
this.a=''
}
async init() {
const instance = await phantom.create();//创建一个实例
try {
await this.openNet()//打开网页
await this.getLoadPictures();//获取高清图片地址
await this.imgSave(0);//下载图片
await instance.exit()//图片下完之后退出phantomjs环境
} catch (e) {
console.log(e);
}
} sleep(time) {
return new Promise((resolve) => {
console.log(`自动睡眠中,${time / 1000}秒后重新发送请求......`)
setTimeout(() => {
resolve();
}, time);
});
}//请求延迟时间,防止ip被封
delay(second) {
return new Promise((resolve) => {
setTimeout(resolve, second * 1000);
});
}//延迟时间
async openNet(){
await this.pageScroll(0)
} async pageScroll(i) {
const instance = await phantom.create();//创建一个实例
const page = await instance.createPage();
const that = this
const status = await page.open(this.base_url);//打开网站,返回的是一个状态
//网页加载的初始浏览器窗口大小
const size = await page.property('viewportSize', {
width: 1920,
height: 1080
})
await that.delay(5)
//滚动浏览器
await page.property('scrollPosition', {
left: 0,
top: 1000 * i
}) let content = await page.property('content')//获取dom元素
let $ = cheerio.load(content)
console.log($('.imgbox').length)
//如果图片数量少于20个 就一直往下滚
if($('.imgbox').length < 20) {
await this.pageScroll(++i)//回调自己 知道满足条件。也可使用for循环 可能速度有点慢
}
//所有的存储图片的dom元素都放在这里面
this.a = $('.imgitem')
}
//获取到缩略图集合
async getLoadPictures(a) {
const result_list = [];
let instance = await phantom.create();
let page = await instance.createPage();
let content = await page.property('content')
// let status = await page.open(this.base_url)
let $ = cheerio.load(content)
const that = this
//把所有的高清大图链接都统计起来
this.a.each((index, element) => {
result_list.push({
// title: $(element).find('.imgbox a').text(),
down_loda_url: ('https://image.baidu.com'+$(element).find('a').attr('href'))
});
});
that.result_list.push(...result_list);
// console.log('that.result_list',that.result_list[0])
}
//取到高清图链接 下载
async imgSave(i) {
let instance = await phantom.create();
let page = await instance.createPage();
let status = await page.open(this.result_list[i].down_loda_url)//打开高清大图链接
await this.delay(2)
let content = await page.property('content')
let $ = cheerio.load(content)
let src = $('#currentImg').attr('src')//获取高清大图的链接
console.log('statue',status)
console.log('src',src)
this.save(src,i)//保存图片
if(i<this.result_list.length) {
await this.imgSave(++i)//回掉自己 保存下一张图片。也可通过for循环 取到所有大图的链接 再集中下载 可能速度有点慢 }
}
//保存图片函数
save(url,i) {
console.log(`开始写入第${i+1}张`)
let ext = url.split('.').pop()
request(url).pipe(fs.createWriteStream(`./image/${new Date().getTime()}.${ext}`));
console.log(`写入成功`)
} } const thief = new stealData('xxx_url');
thief.init();
做了一些优化
//爬取百度高清图片
const phantom = require('phantom')
const express = require('express');
const app = express();
const fs= require('fs');
const cheerio = require('cheerio');
const request = require('request')
let server = app.listen(2000, function () {
let host = server.address().address;
let port = server.address().port;
console.log('Your App is running at http://%s:%s', host, port);
}); class stealData { constructor() {
this.base_url = 'https://image.baidu.com/search/index?ct=201326592&z=&tn=baiduimage&word=%E6%BC%AB%E5%A8%81%E5%9B%BE%E7%89%87&pn=0&ie=utf-8&oe=utf-8&cl=2&lm=-1&fr=ala&se=&sme=&width=1920&height=1080'
this.current_page = 1;
this.result_list = [];
this.a='';
this.urllist = []
}
async init() {
const instance = await phantom.create();//创建一个实例
try {
await this.openNet()//打开网页
await this.getLoadPictures();//获取缩略图图片地址
await this.getrealPictures();//获取高清图片地址并下载
} catch (e) {
console.log(e);
}
} sleep(time) {
return new Promise((resolve) => {
console.log(`自动睡眠中,${time / 1000}秒后重新发送请求......`)
setTimeout(() => {
resolve();
}, time);
});
}//请求延迟时间,防止ip被封
delay(second) {
return new Promise((resolve) => {
setTimeout(resolve, second * 1000);
});
}//延迟时间
async openNet(){
await this.pageScroll(0)
} async pageScroll(i) {
const instance = await phantom.create();//创建一个实例
const page = await instance.createPage();
const that = this
const status = await page.open(this.base_url);//打开网站,返回的是一个状态
//网页加载的初始浏览器窗口大小
const size = await page.property('viewportSize', {
width: 1920,
height: 1080
})
await that.delay(5)
//滚动浏览器
await page.property('scrollPosition', {
left: 0,
top: 1000 * i
}) let content = await page.property('content')//获取dom元素
let $ = cheerio.load(content)
console.log($('.imgbox').length)
//如果图片数量少于20个 就一直往下滚
if($('.imgbox').length < 20) {
await this.pageScroll(++i)//回调自己 知道满足条件。也可使用for循环 可能速度有点慢
}
//所有的存储图片的dom元素都放在这里面
this.a = $('.imgitem')
}
//获取到缩略图集合
async getLoadPictures(a) {
const result_list = [];
let instance = await phantom.create();
let page = await instance.createPage();
let content = await page.property('content')
let $ = cheerio.load(content)
const that = this
//把所有的缩略图链接都统计起来
this.a.each((index, element) => {
result_list.push({
// title: $(element).find('.imgbox a').text(),
down_loda_url: ('https://image.baidu.com'+$(element).find('a').attr('href'))
});
});
that.result_list.push(...result_list);
}
//取到每一个缩略图对应高清图链接并下载
async getrealPictures() {
let instance = await phantom.create();
let page = await instance.createPage();
for(let i=0;i<this.result_list.length;i++){
try {
let content = await page.property('content')
let status = await page.open(this.result_list[i].down_loda_url)
await this.delay(2)
let $ = cheerio.load(content)
let src = $('#currentImg').attr('src')//获取高清大图的链接
let ext = src.split('.').pop()
console.log('src',src)
console.log(`开始写入第${i+1}张`)
await request(src).pipe(fs.createWriteStream(`./Marvel/${new Date().getTime()}.${ext}`));
await this.sleep(3000)//防止被封
console.log(`写入成功`)
if(i==this.result_list.length-1){
console.log('跳出下载')
instance.exit()
}
}catch (e) {
console.log('errorheyu:',e)
} } } } const thief = new stealData('xxx_url');
thief.init();
参考:1、分分钟教你用node写个爬虫
Node.js爬取百度图片瀑布流,使用class类封装。的更多相关文章
- node.js爬取数据并定时发送HTML邮件
node.js是前端程序员不可不学的一个框架,我们可以通过它来爬取数据.发送邮件.存取数据等等.下面我们通过koa2框架简单的只有一个小爬虫并使用定时任务来发送小邮件! 首先我们先来看一下效果图 差不 ...
- selenium+chrome浏览器驱动-爬取百度图片
百度图片网页中中,当页面滚动到底部,页面会加载新的内容. 我们通过selenium和谷歌浏览器驱动,执行js,是浏览器不断加载页面,通过抓取页面的图片路径来下载图片. from selenium im ...
- 百度图片爬虫-python版-如何爬取百度图片?
上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://www.cnblogs.com/huangxie/p/5473273.html 这一篇我想写写如何爬取百度图片的爬虫 ...
- python 3 爬取百度图片
python 3 爬取百度图片 学习了:https://blog.csdn.net/X_JS612/article/details/78149627
- Python 爬虫实例(1)—— 爬取百度图片
爬取百度图片 在Python 2.7上运行 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: loveNight import jso ...
- python爬虫-爬取百度图片
python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...
- Python爬虫:通过关键字爬取百度图片
使用工具:Python2.7 点我下载 scrapy框架 sublime text3 一.搭建python(Windows版本) 1.安装python2.7 ---然后在cmd当中输入python,界 ...
- python爬虫之爬取百度图片
##author:wuhao##爬取指定页码的图片,如果需要爬取某一类的所有图片,整体框架不变,但需要另作分析#import urllib.requestimport urllib.parseimpo ...
- Node.js爬取豆瓣数据
一直自以为自己vue还可以,一直自以为webpack还可以,今天在慕课逛node的时候,才发现,自己还差的很远.众所周知,vue-cli基于webpack,而webpack基于node,对node不了 ...
- Java爬取 百度图片Google图片Bing图片
先看看抓取的结果. 8个Java类: Startup.java - main函数 ImageCrawler.java - Crawler基类 BaiduImageCrawler.java - 百度图片 ...
随机推荐
- 「AutoCAD2022」
「AutoCAD2022」https://www.aliyundrive.com/s/rxktpNqtHC5点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速 ...
- pycharm导入第三方包
- layui 点击显示与点击隐藏
主要有lay-filter属性,靠这个属性监听 <div class="layui-col-xs12 layui-col-sm4 layui-col-md4"> < ...
- Spring系列之基于 Java 的容器配置-9
目录 组合基于 Java 的配置 使用`@Import`注解 有条件地包含`@Configuration`类或`@Bean`方法 结合 Java 和 XML 配置 组合基于 Java 的配置 Spri ...
- Vue+SSM+Element-Ui实现前后端分离(2)
前言:后台使用ssm搭建,对以前学习知识的一个回顾,与此同时来发现自己不足.这里主要采用配置文件方式进行,有部分注解. 目标:搭建ssm框架,并测试成功:(其中也有aop切面的编写) 一.开发工具 I ...
- Python笔记(2)——列表一:列表简介(Python编程:从入门到实践)
一.列表是什么 列表:由一系列按特定顺序排列的元素组成(列表是有序集合). 表示:用方括号[]来表示,并用逗号来分隔其中的元素. 访问:访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括 ...
- 批量cp时中断,原来是被cp的alias干扰了
背景 批量复制一批数据的质控结果的时候,由于表格中出现一个重复项,导致卡在是否覆盖的提示这里 结果该重复项之后的样本都没有复制成功,差点就漏掉一部分样本啊-- cat ../sampleList|wh ...
- 图模配置文件之 flow.json
flow.json文件是用来配置图模导入时,各种不同的图模导入时,分别应该使用哪个映射文件对模型进行处理.在不同地区使用不同的格式的图模文件时,需要修改flow.json中相关的配置,来适应相应的图模 ...
- turtle绘制风轮
题目要求: 使用turtle库,绘制一个风轮效果,其中,每个风轮内角为45度,风轮边长150像素. 我的代码: import turtle turtle.setup(500,500,100,200) ...
- SQL Server 启用“锁定内存页”
这次在虚拟机中做了一个模拟器做压力测试,简单模拟了一条20个工位的生产线上生产1000个工件,并向 MES 服务端发起功能请求,保存质量数据和扫码数据到数据库.在测试时发现服务端进程的 CPU 占用有 ...