最近在研究前端爬虫,刚好看到Puppeteer,就想着分享给大家,于是有了这篇。
爬虫主要的目标是自动地做些什么事情,包含资料搜集、测试、执行任务…等等,借此提高工作效率。
网路爬虫的主要优势和需求主要体现在以下几个方面:
在使用过程中也需要注意尊重网站拥有者的权益,遵守机器人排除协定(Robots Exclusion Protocol)和各种相关法规,避免对被爬取的网站造成不必要的负担或侵犯。
常见的网页爬虫套件这三个套件(Puppeteer、Cheerio 和Selenium)在前端爬虫中扮演不同的角色,各自有其优缺点和特点。
Puppeteer 是由Google 开发的Node.js 函式库,提供方便的API 来进行网页测试、屏幕截图和网页爬虫等应用,但仅限于使用Chromium 浏览器引擎的浏览器,例如:Google Chrome 或Microsoft Edge。
Puppeteer 预设是以headless(无头)模式运行。headless 模式是指在爬虫过程中不显示浏览器视窗画面,虽然看不到画面但仍然会执行画面的渲染过程,也就是说HTML 的解析、CSS 的套用和JavaScript 都会正常执行,这样才能确保画面内容是正确且完整的。
因为无头模式少了显示结果的处理不会做屏幕绘制,所以相较于有头模式,更能节省资源;但是在开发上有头模式会方便许多,因为浏览器会将渲染好的页面展示出来,包含了:
无论在无头模式或有头模式下,一定要做关闭浏览器的动作,无头模式虽然看不到浏览器画面,实际上背景仍然会有一个浏览器真的在跑。所以如果爬虫完没有确实地关闭浏览器,那么整个程式就仍然还在运行中,需要手动Ctrl + C 停止执行。在写脚本的时候,一定要记得在结束或是发生错误的地方把浏览器关闭,才能好好地释放资源。
如果希望变更为一般模式,可以藉由设定选项变更为有头模式,如下:
// 一般模式(有頭模式)
const browser = await puppeteer.launch({
headless: false,
});
// 無頭模式(Puputeer 預設模式)
const browser = await puppeteer.launch({
headless: 'new',
});
// 關閉瀏覽器
browser.Close()
Puppeteer 会下载最新版本的Chromium(~170MB Mac,~282MB Linux,~280MB Win),以保证可以使用API。
# 使用 npm
npm i puppeteer
# 使用 yarn
yarn add puppeteer
puppeteer-core
# 使用npm
npm i puppeteer-core
# 使用yarn
yarn add puppeteer-core
自1.7.0 版本以来,官方维护团队都会发布一个puppeteer-core 函式库,是一个的轻量级的Puppeteer 版本,用于启动现有浏览器安装或连接到远程安装。
起手式
const puppeteer = require("puppeteer");
(async () => {
// 啟動瀏覽器並開啟一個新的空白頁面
const browser = await puppeteer.launch();
const page = await browser.newPage();
// 將頁面導航至 URL
await page.goto("https://developer.chrome.com/");
// 關閉
await page.close();
await browser.close();
})();
常用语法
const puppeteer = require("puppeteer");
(async () => {
// 啟動瀏覽器並開啟一個新的空白頁面
const browser = await puppeteer.launch({
headless: false,
defaultViewport: { width: 1400, height: 900 },
});
const page = await browser.newPage();
// 前往指定 URL
await page.goto("https://developer.chrome.com/");
// 設定瀏覽器尺寸
await page.setViewport({ width: 1080, height: 1024 });
// 在欄位,輸入文字 "js-text"
await page.type(".devsite-search-field", "js-text");
// 操控鍵盤 "Enter"
await page.keyboard.press("Enter");
// 等待元素,出現在頁面中
const searchResultSelector = "a.gs-title";
await page.waitForSelector(searchResultSelector);
// 點擊元素
await page.click(searchResultSelector);
const textSelector = await page.waitForSelector(".devsite-page-title");
// 在瀏覽器執行 JavaScript,取得元素資訊
const fullTitle = await textSelector?.evaluate((el) => el.textContent);
// 取得頁面尺寸資訊
const dimensions = await page.evaluate(() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
};
});
// 列印結果
console.log('The title of this blog post is "%s".', fullTitle);
console.log("Dimensions:", dimensions);
// 畫面截圖
await page.screenshot({ path: "example.png" });
await page.goBack(); // 回到上一頁
await page.goForward(); // 前往下一頁
await page.reload(); // 重新整理
await page.close();
await browser.close();
})();
从爬虫的攻防角度来讲,最简单的爬虫,是几乎所有服务端、客户端编程语言都支持的http请求,只要向目标页面的url发起一个http get请求,即可获得到浏览器加载这个页面时的完整html文档,这被我们称之为“同步页”。
数据收集的一种是方式是通过上报API进行自身平台用户交互情况的捕获,还有一种手段是通过开发爬虫程序,爬取竞品平台的数据,后面就重点说下爬虫的应用场景和实践中会遇到的问题和反反爬虫的一些套路与技巧。
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。是互联网爬虫,蜘蛛,数据采集器,网页解析器的汇总,下面介绍各语言实现网络爬虫的开源框架
PhantomJS无界面的浏览器:认识PhantomJS、网站模拟登录豆瓣网、动态页面模拟点击(unittest -python测试模块)、执行JavaScript代码、模拟最新无界面浏览器...
网络爬虫在数据采集方面有好的优势,比如采集速度快,比人来操作可能要快一千倍一万倍都不止;方便将获取的数据进行相关的清洗加工以及储存工作;代码可重复使用,或者说是一劳永逸。
每个网站主页是网站资源的入口,当重定向发生在网站主页时,如果不能正确处理就很有可能会错失这整个网站的内容。 笔者编写的爬虫在爬取网页时遇到了三种重定向的情况。
之前由于公司项目需要,采集过google地图数据,还有一些大型网站数据。 有小部分网站的防范措施比较弱,可以伪装下IP,修改X-Forwarded-for(貌似这么拼。。。)即可绕过。ser agent 伪装和轮换 ,使用代理 ip 和轮换
在爬网站时,发现网站做了百度云加速,每次访问首页时要求输入验证码,才能打开网站首页。经过分析网站,发现如果你拿到一个当期可用的Cooikes后,你就可以一直爬数据,且并不会触发百度验证输入
完整的反爬体系有三大部分工作要做:感知识别、策略分析、监控封禁。数据支撑:爬虫指纹、设备指纹、风险UA、IP库等,不同端指纹的mapping等。
node.js是一款基于google的V8引擎开发javascript运行环境。在高性能的V8引擎以及事件驱动的单线程异步非阻塞运行模型的支持下,node.js实现的web服务可以在没有Nginx的http服务器做反向代理的情况下实现很高的业务并发量。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!