热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

玩玩puppeteer,完成一个小‘爬虫’

Puppeteerpuppeteer官网一、puppeteer是干什么的?援用puppeteer官网诠释:Mostthingsthatyoucandomanuallyinthebr
Puppeteer

《玩玩puppeteer,完成一个小‘爬虫’》

puppeteer官网

一、puppeteer是干什么的?

援用puppeteer官网诠释: Most things that you can do manually in the browser can be done using Puppeteer!

  • 天生页面的屏幕截图和PDF。
  • 抓取SPA并天生预衬着内容(即“SSR”)。
  • 自动表单提交,UI测试,键盘输入等。
  • 建立最新的自动化测试环境。 运用最新的Javascript和浏览器功用直接在最新版本的Chrome中运转测试。
  • 捕捉您网站的[时候线跟踪]

二、经常使用API

  • page.setViewport() 设置猎取屏幕大小,默许猎取屏幕大小为800px * 600px
  • page.pdf(途径,大小) 保存为pdf花样图片

    • 举例:page.pdf({path: 'hn.pdf', format: 'A4'});
  • page.evaluate(fn) 实行chrome的api

    • 举例:

      await page.evaluate(() => {
      return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.deivcePixelRatio
      };
      })

  • puppeteer.launch({headless: false}); 翻开浏览器,默许值是true

更多API

三、举个栗子:截取屏幕

3.1 代码

const puppeteer = require('puppeteer');
// 援用default.js的sceenshot途径,将截取的屏幕pdf保存到该途径下。
const { screenshot } = require('./config/default.js');
(async () => {
// 猎取browser实例
const browser = await puppeteer.launch();
// 猎取浏览器tab页面实例
const page = await browser.newPage();
// 链接到百度首页
await page.goto('https://www.baidu.com');
// 截屏
await page.screenshot({
// 将截屏按时候戳保存到指定途径下。
path: `${screenshot}/${Date.now()}.png`
});
// 封闭
await browser.close();
})();

3.2 然后实行命令

node src/screenshot.js

3.3 末了在screenshot文件指定途径下天生百度首页的截屏。

四、爬取百度图片列表

4.1 完成思绪

  1. 模仿用户翻开浏览器
  2. 模仿翻开tab页
  3. 模仿前去百度图片页面
  4. 模仿focus到输入框,输入查询值, 点击查询按钮
  5. 抓取图片
  6. 经由过程writeFile,将图片下载到指定途径下。

4.2 目次构造

.
|-mn
|-src
| |-config
| | |-default.js
| |-helper
| | |-srcToImg.js
| |-mn.js
|-package.json

4.3 mn.js 主文件

const puppeteer = require('puppeteer');
const { mn } = require('./config/default');
const srcToImg = require('./helper/srcToImg');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://image.baidu.com');
console.log('go to https://image.baidu.com');
await page.setViewport({
width: 1920,
height: 1080
});
console.log('reset viewport');
await page.focus('#kw');
await page.keyboard.sendCharacter('狗');
await page.click('.s_search');
console.log('go to search list');
page.on('load', async () => {
console.log('page loading done, start fetch ...');
const srcs = await page.evaluate(() => {
const images = document.querySelectorAll('img.main_img');
return Array.prototype.map.call(images, img => img.src);
});
console.log(`get ${srcs.length} image, start download`); srcs.forEach(async (src) => {
await srcToImg(src, mn);
});
await browser.close();
})
})();

4.4 default.js 途径

const path = require('path');
module.exports = {
screenshot: path.resolve(__dirname, '../../screenshot'),
mn: path.resolve(__dirname, '../../mn')
}

4.5 srcToImg.js 剖析图片地点

const http = require('http');
const https = require('https');
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const writeFile = promisify(fs.writeFile);
module.exports = async(src, dir) => {
if(/\.(jpg|png|gif)$/.test(src)) {
await urlToImg(src, dir);
}else {
await base64ToImg(src, dir); 
}
}
// 辨认src为http或许https的图片
const urlToImg = promisify((url, dir, callback) => {
const mod = /^https:/.test(url) ? https : http;
const ext = path.extname(url);
const file = path.join(dir, `${Date.now()}${ext}`);
mod.get(url, res => {
res.pipe(fs.createWriteStream(file))
.on('finish', () => {
callback();
console.log(file);
})
})
})
// 辨认src为base64地点的图片
const base64ToImg = async (base64Str, dir) => {
// data: image/jpeg;base64,/raegreagearg
const matchs = base64Str.match(/^data:(.+?);base64,(.+)$/);
try {
const ext = matches[1].split('/')[1]
.replace('jpeg', 'jpg');
const file = path.join(dir, `${Date.now()}.${ext}`);
await writeFile(file, match[2], 'base64');
console.log(file);
} catch (ex) {
console.log('不法 base64 字符串');
}
}

4.6 终究在mn文件夹中存入爬取到的图片。

go to https://image.baidu.com
reset viewport
go to search list
page loading done, start fetch ...
get 46 image, start download
不法 base64 字符串
不法 base64 字符串
不法 base64 字符串
不法 base64 字符串
不法 base64 字符串
不法 base64 字符串
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351397.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351396.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351398.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351400.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351405.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351386.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351399.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351405.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351405.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351402.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351412.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351413.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351403.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351398.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351399.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351403.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351406.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351401.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351408.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351404.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351414.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351400.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351402.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351413.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351408.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351414.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351413.jpg
......

4.7 mn文件夹下

《玩玩puppeteer,完成一个小‘爬虫’》


推荐阅读
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 探索Web 2.0新概念:Widget
    尽管你可能尚未注意到Widget,但正如几年前对RSS的陌生一样,这一概念正逐渐走入大众视野。据美国某权威杂志预测,2007年将是Widget年。本文将详细介绍Widget的定义、功能及其未来发展趋势。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java swing 连连看小游戏  开发小系统 项目源代码 实训实验毕设
    Javaswing连连看小游戏开发小系统项目源代码实训实验能满足学习和二次开发可以作为初学者熟悉Java的学习,作为老师阶段性学习的一个成功检验不再是单调的理解老师空泛的知识,导入 ... [详细]
  • 在需要将网页内容保存为图片时,通常可以使用系统自带的截图工具。然而,对于较长的页面,尤其是带有滚动条的情况,操作起来较为不便。为此,推荐一款功能强大的Chrome浏览器插件——FireShot。该插件不仅支持区域截图,还能实现整页长截图和视频录制,极大地提升了网页内容的捕捉效率和质量。此外,FireShot还提供了丰富的编辑和分享选项,方便用户进行后续处理和分发。 ... [详细]
author-avatar
由来只有新人笑_谁能记得旧人哭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有