本文通过puppeteer实现对百度图片的抓取,这里简单介绍下puppeteer
puppeteer可以使我们编写一套代码控制浏览器动作,“你可以在浏览器中手动执行的绝大多数操作都可以使用 Puppeteer 来完成”
因此Puppeteer常用于测试和爬虫—官方文档

示例–爬取百度图片

本项目源码已上传至GitHub
npm i puppeteer bufferutil utf-8-validate optimist

1.引入相关模块和初始配置

//baidu-img.js
const puppeteer = require('puppeteer')
const imgLoad = require('./imgload')
const httpUrl = 'https://image.baidu.com/'
var argv = require('optimist').argv;let options = {word:argv.word || '图片',num:argv.num || 60,dir:argv.dir || 'images',delay:argv.delay || 600}
...
  1. 我们引入了imgLoad 这个模块主要做图片下载相关逻辑
  2. 引入optimist用于接收控制台参数
  3. 设置默认参数
  4. word:搜索词
  5. num:要下载的图片数量
  6. dir:图片存放目录
  7. delay:图片下载延迟时间(图片较多时这个时间要设置长点,防反爬虫)

2.图片下载逻辑

//imgload.js
const path = require('path')
const fs = require('fs')
const http  = require('http')
const https = require('https')
const {promisify} = require('util')
const writeFile = promisify(fs.writeFile);module.exports = async (src,dir)=>{if(/\.(jpg|png|jpeg|gif)$/.test(src)){await urlToImg(src,dir)} else {await base64ToImg(src,dir)}
}const urlToImg = (url,dir)=>{const mod = /^https:/.test(url)?https:httpconst ext = path.extname(url)fs.mkdir(dir,function(err){if(!err){console.log('成功创建目录')}})const file = path.join(dir, `${Date.now()}${ext}`)//请求图片路径下载图片mod.get(url,res=>{res.pipe(fs.createWriteStream(file)).on('finish',()=>{console.log(file+' download successful');})})}//base64-download
const base64ToImg = async function(base64Str,dir){//data:image/jpg;base64,/fdsgfsdgdfghdfdfhtry{const matches = base64Str.match(/^data:(.+?);base64,(.+)$/)const ext = matches[1].split('/')[1].replace('jpeg','jpg')//获取后缀fs.mkdir(dir,function(err){if(!err){console.log('成功创建'+dir+'目录')}})const file = path.join(dir, `${Date.now()}.${ext}`)const content = matches[2]await writeFile(file,content,'base64')console.log(file+' download successful');}catch(e){console.log(e);}}

百度图片有两种各种一种是url的形式另一种是base64的形式,我们封装了两个函数分别处理url和base64

3.抓取图片逻辑
3.1

...
;( async function(){let config = {headless:true,//无界面操作 ,false表示有界面defaultViewport:{width:1920,height:1000,},}let browser = await puppeteer.launch(config)let page = await browser.newPage()await page.goto(httpUrl)await page.focus('#kw')await page.keyboard.sendCharacter(options.word);//搜索词await page.click('.s_search')
...

我们将所以逻辑封装在自执行的异步函数

  1. 创建浏览器对象
  2. 打开一个新的页面 (browser.newPage())
  3. 跳转到百度图片
  4. 使搜索框获得焦点
  5. 填入搜索词
  6. 使搜索按钮被点击

这里的部分比较简单,我们只需找到对应的元素,赋予相应的操作即可

当搜索按钮被点击的时候我们监听onLoad事件,进行图片的抓取
3.2

    //页面搜索跳转 执行的逻辑page.on('load',async ()=>{console.warn('正在为你检索【'+options.word+'】图片请耐心等待...');await page.evaluate((options)=>{///获取当前窗口高度  处理懒加载let height = document.body.offsetHeightlet timer = setInterval(()=>{//窗口每次滚动当前窗口的2倍height=height*2window.scrollTo(0,height);},2000)window.onscroll=function(){let arrs = document.querySelectorAll('.main_img')//符合指定图片数if(arrs.length>=options.num){clearInterval(timer)console.log(`为你搜索到${arrs.length}张【${options.word}】相关的图片\n准备下载(${options.num})张`);}  }},options)})

由于百度图片使用了懒加载,这里我们通过page.evaluate使浏览器执行我们自定义的js,在 page.evaluate我们优雅的处理了懒加载,并监听页面滚动事件,每次滚动的时候计算页面图片的数量,并展示提示信息(console.log)这个打印并不只是打印,后面我们要监听console事件执行图片下载逻辑

3.3

 await page.on('console',async msg=>{console.log(msg.text());//提取图片的srclet res = await page.$$eval('.main_img',eles=>eles.map((e=>e.getAttribute('src'))))res.length = options.numres.forEach(async (item,i)=>{await page.waitFor(options.delay*i)//延迟执行await imgLoad(item,options.dir)})await browser.close()})

我们监听浏览器的console事件,当触发console时说明需要的图片已经找到,此时可以执行图片url提取,将其下载,至于为什么不在page.evaluate执行图片下载逻辑 是因为page.evaluate只能写“前端”的js图片下载需要用到fs、path等模块,我们在page.evaluate里面是无法使用的

到此一个小爬虫完成
我们来看看效果

Nodejs爬虫自动爬取百度图片相关推荐

  1. 二、入门爬虫,爬取百度图片

    什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

  2. python爬虫爬取百度图片总结_爬虫篇| 爬取百度图片(一)

    什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

  3. python爬去百度图片_爬虫篇| 爬取百度图片(一)

    什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

  4. Python爬虫——关键字爬取百度图片

    在日常生活中,我们经常需要使用百度图片来搜索相关的图片资源.而如果需要大量获取特定关键字的图片资源,手动一个个下载无疑十分繁琐且费时费力.因此,本文将介绍如何通过Python爬虫技术,自动化地获取百度 ...

  5. Python爬虫:爬取百度图片(selenium模拟登录,详细注释)

    1.驱动下载 百度图片这种网站是动态的,即并不是网页中的内容全部存储在源代码中,而是不停地动态刷新,所以需要使用selenium模拟浏览器登录,除了安装selenium库之外,还需要针对不同地浏览器安 ...

  6. python爬虫——批量爬取百度图片

    最近做项目,需要一些数据集,图片一张一张从网上下载太慢了,于是学了爬虫. 参考了大佬的文章:https://blog.csdn.net/qq_40774175/article/details/8127 ...

  7. python爬虫爬取百度图片总结_python爬虫如何批量爬取百度图片

    当我们想要获取百度图片的时候,面对一张张图片,一次次的点击右键下载十分麻烦.python爬虫可以实现批量下载,根据我们下载网站位置.图片位置.图片下载数量.图片下载位置等需求进行批量下载,本文演示py ...

  8. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  9. 【Python】爬虫入门6:爬取百度图片搜索结果(基于关键字爬图)

    源代码 #!/usr/bin/env python # -*- coding: UTF-8 -*-# 需求:爬取百度图片# noinspection PyUnresolvedReferences im ...

  10. 入门级别的Python爬虫代码 爬取百度上的图片

    简单讲解下python爬取百度图片的方法还有一些小坑(ps:我是搞.net的所以python只是新手讲错勿怪,注意:系统是windows下的) 首先讲下对百度图片上请求的分析:这里我引用下别人的博客, ...

最新文章

  1. 实现用户协议显示_HTTP协议工作原理及其特点
  2. 009_Spring Data JPA一对一关系
  3. MyBatis运行原理(一)SqlSessionFactory对象创建过程分析
  4. cookie 和session 的区别
  5. python从入门到大神系列手机_python从入门到大神---2、和Python编程相遇的日子
  6. cordova+vue 项目打包成Android(apk)应用
  7. 网络通信程序写起来很难专业课没问题
  8. java向Oracle数据库中插入blob字段数据
  9. Android Sqlite 数据库版本更新
  10. (转)主成分分析(Principal components analysis)-最大方差解释
  11. 暗黑2服务器映射,d2hackmap对应不同分辨率的存取坐标修改方法
  12. 2018湘潭大学程序设计竞赛【E】
  13. uptime查看服务器负载详解
  14. Win10中Ubuntu优化配置
  15. 机器学习之重温线性代数
  16. C# CAD操作之定位实体位置(视图操作缩放)
  17. 家里Wifi网速突然变慢,一招瞬间提速
  18. 7.查找——数据结构(严蔚敏 C语言版)
  19. [渝粤教育] 西南科技大学 计算机辅助电路设计 在线考试复习资料
  20. 电脑游戏业编年史之一游戏的诞生

热门文章

  1. git教程 git笔记 git常用 git使用 git操作 git简明 git版本控制 git仓库
  2. 如何避免淘宝拼多多比价订单?教你应对
  3. 【CVPR 2022】目标检测SOTA:DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection
  4. matlab corner 舍弃,成长就是不断地丢弃与拾取 — 读The Glass Castle《玻璃城堡》有感...
  5. 形式化方法 Assignment 2: Proof engineering
  6. 老徐WEB:js入门学习 - javascript函数和闭包
  7. Flutter中设ListView的shrinkWrap为ture导致的崩溃
  8. php短视频转码,YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能
  9. 银行叫警察抓人?逾期未还后果严重可能成真!
  10. win7右下角显示此windows副本不是正版