1. //爬取百度高清图片
  2. const phantom = require('phantom')
  3. const express = require('express');
  4. const app = express();
  5. const fs= require('fs');
  6. const cheerio = require('cheerio');
  7. const request = require('request')
  8. let server = app.listen(2000, function () {
  9. let host = server.address().address;
  10. let port = server.address().port;
  11. console.log('Your App is running at http://%s:%s', host, port);
  12. });
  13.  
  14. class stealData {
  15.  
  16. constructor() {
  17. // 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'; //要爬取的网站
  18. // 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'
  19. 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'
  20.  
  21. this.current_page = 1;
  22. this.result_list = [];
  23. this.a=''
  24. }
  25. async init() {
  26. const instance = await phantom.create();//创建一个实例
  27. try {
  28. await this.openNet()//打开网页
  29. await this.getLoadPictures();//获取高清图片地址
  30. await this.imgSave(0);//下载图片
  31. await instance.exit()//图片下完之后退出phantomjs环境
  32. } catch (e) {
  33. console.log(e);
  34. }
  35. }
  36.  
  37. sleep(time) {
  38. return new Promise((resolve) => {
  39. console.log(`自动睡眠中,${time / 1000}秒后重新发送请求......`)
  40. setTimeout(() => {
  41. resolve();
  42. }, time);
  43. });
  44. }//请求延迟时间,防止ip被封
  45. delay(second) {
  46. return new Promise((resolve) => {
  47. setTimeout(resolve, second * 1000);
  48. });
  49. }//延迟时间
  50. async openNet(){
  51. await this.pageScroll(0)
  52. }
  53.  
  54. async pageScroll(i) {
  55. const instance = await phantom.create();//创建一个实例
  56. const page = await instance.createPage();
  57. const that = this
  58. const status = await page.open(this.base_url);//打开网站,返回的是一个状态
  59. //网页加载的初始浏览器窗口大小
  60. const size = await page.property('viewportSize', {
  61. width: 1920,
  62. height: 1080
  63. })
  64. await that.delay(5)
  65. //滚动浏览器
  66. await page.property('scrollPosition', {
  67. left: 0,
  68. top: 1000 * i
  69. })
  70.  
  71. let content = await page.property('content')//获取dom元素
  72. let $ = cheerio.load(content)
  73. console.log($('.imgbox').length)
  74. //如果图片数量少于20个 就一直往下滚
  75. if($('.imgbox').length < 20) {
  76. await this.pageScroll(++i)//回调自己 知道满足条件。也可使用for循环 可能速度有点慢
  77. }
  78. //所有的存储图片的dom元素都放在这里面
  79. this.a = $('.imgitem')
  80. }
  81. //获取到缩略图集合
  82. async getLoadPictures(a) {
  83. const result_list = [];
  84. let instance = await phantom.create();
  85. let page = await instance.createPage();
  86. let content = await page.property('content')
  87. // let status = await page.open(this.base_url)
  88. let $ = cheerio.load(content)
  89. const that = this
  90. //把所有的高清大图链接都统计起来
  91. this.a.each((index, element) => {
  92. result_list.push({
  93. // title: $(element).find('.imgbox a').text(),
  94. down_loda_url: ('https://image.baidu.com'+$(element).find('a').attr('href'))
  95. });
  96. });
  97. that.result_list.push(...result_list);
  98. // console.log('that.result_list',that.result_list[0])
  99. }
  100. //取到高清图链接 下载
  101. async imgSave(i) {
  102. let instance = await phantom.create();
  103. let page = await instance.createPage();
  104. let status = await page.open(this.result_list[i].down_loda_url)//打开高清大图链接
  105. await this.delay(2)
  106. let content = await page.property('content')
  107. let $ = cheerio.load(content)
  108. let src = $('#currentImg').attr('src')//获取高清大图的链接
  109. console.log('statue',status)
  110. console.log('src',src)
  111. this.save(src,i)//保存图片
  112. if(i<this.result_list.length) {
  113. await this.imgSave(++i)//回掉自己 保存下一张图片。也可通过for循环 取到所有大图的链接 再集中下载 可能速度有点慢
  114.  
  115. }
  116. }
  117. //保存图片函数
  118. save(url,i) {
  119. console.log(`开始写入第${i+1}张`)
  120. let ext = url.split('.').pop()
  121. request(url).pipe(fs.createWriteStream(`./image/${new Date().getTime()}.${ext}`));
  122. console.log(`写入成功`)
  123. }
  124.  
  125. }
  126.  
  127. const thief = new stealData('xxx_url');
  128. thief.init();

做了一些优化

  1. //爬取百度高清图片
  2. const phantom = require('phantom')
  3. const express = require('express');
  4. const app = express();
  5. const fs= require('fs');
  6. const cheerio = require('cheerio');
  7. const request = require('request')
  8. let server = app.listen(2000, function () {
  9. let host = server.address().address;
  10. let port = server.address().port;
  11. console.log('Your App is running at http://%s:%s', host, port);
  12. });
  13.  
  14. class stealData {
  15.  
  16. constructor() {
  17. 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'
  18. this.current_page = 1;
  19. this.result_list = [];
  20. this.a='';
  21. this.urllist = []
  22. }
  23. async init() {
  24. const instance = await phantom.create();//创建一个实例
  25. try {
  26. await this.openNet()//打开网页
  27. await this.getLoadPictures();//获取缩略图图片地址
  28. await this.getrealPictures();//获取高清图片地址并下载
  29. } catch (e) {
  30. console.log(e);
  31. }
  32. }
  33.  
  34. sleep(time) {
  35. return new Promise((resolve) => {
  36. console.log(`自动睡眠中,${time / 1000}秒后重新发送请求......`)
  37. setTimeout(() => {
  38. resolve();
  39. }, time);
  40. });
  41. }//请求延迟时间,防止ip被封
  42. delay(second) {
  43. return new Promise((resolve) => {
  44. setTimeout(resolve, second * 1000);
  45. });
  46. }//延迟时间
  47. async openNet(){
  48. await this.pageScroll(0)
  49. }
  50.  
  51. async pageScroll(i) {
  52. const instance = await phantom.create();//创建一个实例
  53. const page = await instance.createPage();
  54. const that = this
  55. const status = await page.open(this.base_url);//打开网站,返回的是一个状态
  56. //网页加载的初始浏览器窗口大小
  57. const size = await page.property('viewportSize', {
  58. width: 1920,
  59. height: 1080
  60. })
  61. await that.delay(5)
  62. //滚动浏览器
  63. await page.property('scrollPosition', {
  64. left: 0,
  65. top: 1000 * i
  66. })
  67.  
  68. let content = await page.property('content')//获取dom元素
  69. let $ = cheerio.load(content)
  70. console.log($('.imgbox').length)
  71. //如果图片数量少于20个 就一直往下滚
  72. if($('.imgbox').length < 20) {
  73. await this.pageScroll(++i)//回调自己 知道满足条件。也可使用for循环 可能速度有点慢
  74. }
  75. //所有的存储图片的dom元素都放在这里面
  76. this.a = $('.imgitem')
  77. }
  78. //获取到缩略图集合
  79. async getLoadPictures(a) {
  80. const result_list = [];
  81. let instance = await phantom.create();
  82. let page = await instance.createPage();
  83. let content = await page.property('content')
  84. let $ = cheerio.load(content)
  85. const that = this
  86. //把所有的缩略图链接都统计起来
  87. this.a.each((index, element) => {
  88. result_list.push({
  89. // title: $(element).find('.imgbox a').text(),
  90. down_loda_url: ('https://image.baidu.com'+$(element).find('a').attr('href'))
  91. });
  92. });
  93. that.result_list.push(...result_list);
  94. }
  95. //取到每一个缩略图对应高清图链接并下载
  96. async getrealPictures() {
  97. let instance = await phantom.create();
  98. let page = await instance.createPage();
  99. for(let i=0;i<this.result_list.length;i++){
  100. try {
  101. let content = await page.property('content')
  102. let status = await page.open(this.result_list[i].down_loda_url)
  103. await this.delay(2)
  104. let $ = cheerio.load(content)
  105. let src = $('#currentImg').attr('src')//获取高清大图的链接
  106. let ext = src.split('.').pop()
  107. console.log('src',src)
  108. console.log(`开始写入第${i+1}张`)
  109. await request(src).pipe(fs.createWriteStream(`./Marvel/${new Date().getTime()}.${ext}`));
  110. await this.sleep(3000)//防止被封
  111. console.log(`写入成功`)
  112. if(i==this.result_list.length-1){
  113. console.log('跳出下载')
  114. instance.exit()
  115. }
  116. }catch (e) {
  117. console.log('errorheyu:',e)
  118. }
  119.  
  120. }
  121.  
  122. }
  123.  
  124. }
  125.  
  126. const thief = new stealData('xxx_url');
  127. thief.init();

参考:1、分分钟教你用node写个爬虫

   2、Node.js爬虫实战,爬去图片到本地

   3、爬取瀑布流网页高清图

   4、PhantomJs的用法

   5、NodeJs优秀工具之——nightmare

   6、腾讯云上Phantom用例

Node.js爬取百度图片瀑布流,使用class类封装。的更多相关文章

  1. node.js爬取数据并定时发送HTML邮件

    node.js是前端程序员不可不学的一个框架,我们可以通过它来爬取数据.发送邮件.存取数据等等.下面我们通过koa2框架简单的只有一个小爬虫并使用定时任务来发送小邮件! 首先我们先来看一下效果图 差不 ...

  2. selenium+chrome浏览器驱动-爬取百度图片

    百度图片网页中中,当页面滚动到底部,页面会加载新的内容. 我们通过selenium和谷歌浏览器驱动,执行js,是浏览器不断加载页面,通过抓取页面的图片路径来下载图片. from selenium im ...

  3. 百度图片爬虫-python版-如何爬取百度图片?

    上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://www.cnblogs.com/huangxie/p/5473273.html 这一篇我想写写如何爬取百度图片的爬虫 ...

  4. python 3 爬取百度图片

    python 3 爬取百度图片 学习了:https://blog.csdn.net/X_JS612/article/details/78149627

  5. Python 爬虫实例(1)—— 爬取百度图片

    爬取百度图片  在Python 2.7上运行 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: loveNight import jso ...

  6. python爬虫-爬取百度图片

    python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...

  7. Python爬虫:通过关键字爬取百度图片

    使用工具:Python2.7 点我下载 scrapy框架 sublime text3 一.搭建python(Windows版本) 1.安装python2.7 ---然后在cmd当中输入python,界 ...

  8. python爬虫之爬取百度图片

    ##author:wuhao##爬取指定页码的图片,如果需要爬取某一类的所有图片,整体框架不变,但需要另作分析#import urllib.requestimport urllib.parseimpo ...

  9. Node.js爬取豆瓣数据

    一直自以为自己vue还可以,一直自以为webpack还可以,今天在慕课逛node的时候,才发现,自己还差的很远.众所周知,vue-cli基于webpack,而webpack基于node,对node不了 ...

  10. Java爬取 百度图片Google图片Bing图片

    先看看抓取的结果. 8个Java类: Startup.java - main函数 ImageCrawler.java - Crawler基类 BaiduImageCrawler.java - 百度图片 ...

随机推荐

  1. mysql之字段约束-第五篇

    数据库的完整性约束是为了在数据库应用中保证数据的一致性和正确性.所以在创建数据表时定义其字段的约束是非常有必要的. 主键约束 主键(primary key)是一个列或者列的组合,其值能唯一地标识表中的 ...

  2. 独显坏掉,openSUSE启动黑屏卡死

    我的Dell Vostro 1440配置双显卡,独显是 AMD 的.可能是因为散热的问题,独显烧坏了.原先每次启动都有 openSUSE 的圆形启动动画,显卡烧坏后,启动动画变成三个点. 装 Debi ...

  3. Vue+Element UI一个下拉框传字典值和对应字典Label

    <el-select @change="getDeptName" v-model="form.deptCode"> <el-option v- ...

  4. Python3网络爬虫--爬取有声小说(附源码)

    目录 一.目标 1.首页 2.网页源代码 二.爬取详情页 1.查看详情页 2.小说详情 3.小说简介 4.播放列表 三.爬取小说音频 1.确定数据加载方式 2.寻找真实音频播放地址 3.URL解码 4 ...

  5. Navicat连接Mysql报错:Client does not support authentication protocol requested by server(转载)

    Navicat连接MySQL Server8.0版本时出现Client does not support authentication protocol requested  by server:解决 ...

  6. tf.keras.layers.MaxPool2D 简介

    tf.keras.layers.Max2D( pool_size=(2, 2), strides=None, padding='valid', data_format=None ) pool_size ...

  7. 解决git仓库项目 添加到github非空仓库冲突问题 error: failed to push some refs to 'https://github.com/Qtoken/......'

    error: failed to push some refs to 'https://github.com/Qtoken/......' 1. 问题描述:执行命令:git push origin m ...

  8. little bug

    1 python script can be run in shell console while not in calling shell scripts wfile = codecs.open(n ...

  9. 语法分析~LL1的实现

    语法分析之 LL1分析法实现 一.设计目的 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对预测分析LL(1)分析法的理解. 二.设计要求 程序输入/ ...

  10. idea安装阿里规范审查插件

    Install from repositories Settings >> Plugins >> Browse repositories... Search plugin by ...