前端开发爬虫首选puppeteer

news2024/11/26 8:19:16

很多前端同学可能对于爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 python 、php 等。当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript 也可以用来写爬虫了。但这是大数据时代,数据的需求是不分前端还是后端的,既然由于 nodejs 强大的异步特性,让我们可以轻松以异步高并发去爬取网站。

img

这里会有一个问题吗,那就是前端程序员如果要开发爬虫是使用python还是使用puppeteer呢?如果想快速开发爬虫,还是驱动浏览器的方式比较好,我推荐用puppeteer,纯js环境,上手快,puppeteer直接驱动无头浏览器速度并不算慢。但是现在目标网站爬虫策略多种多样,即使是使用最简单的方式也要学习反爬策略的应对。如果遇到验证码识别等需要深度学习的,可以用python写这部分,然后nodejs和python进程间通信。

这里我们可以使用puppeteer简单的实现下爬虫,就以获取微博热搜为例子进行实践。

// 引入process和puppeteer模块
const process = require("process");
const puppeteer = require("puppeteer");

// 定义代理地址、延时时间和延时函数
const PROXY = "http://www.16yun.cn:80"; // 代理服务器(产品 www.16yun.cn)可以修改这个代理地址
const SLEEP = 5000; // 你可以修改这个延时时间(毫秒)
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

// 定义一个异步函数view,接受一个URL和一个代理地址作为参数
async function view(url, proxy) {
  // 在view函数中,使用puppeteer.launch方法启动一个浏览器实例,并设置一些参数,如headless、ignoreHTTPSErrors、defaultViewport和args
  const browser = await puppeteer.launch({
    headless: true, // 设置为无头模式(不显示浏览器窗口)
    ignoreHTTPSErrors: true, // 忽略HTTPS错误
    defaultViewport: { width: 1280, height: 800 }, // 设置默认视口大小
    args: [`--proxy-server=${proxy}`], // 设置代理服务器地址
  });

  // 使用browser.newPage方法创建一个新的页面实例,并设置视口大小
  const page = await browser.newPage();
  await page.setViewport({ width: 1280, height: 800 });

  // 使用page.on方法监听request事件,如果请求的资源类型是media,并且请求的URL以https://video.twimg.com/开头,则打印出请求的URL
  page.on("request", (request) => {
    if (
      request.resourceType() === "media" &&
      request.url().startsWith("https://weibo.com//")
    ) {
      console.log(request.url());
    }
  });

  // 使用page.goto方法访问传入的URL
  await page.goto(url);

  // 使用page.click方法点击页面上选择器为.r-1ndi9ce > div:nth-child(1) > div:nth-child(1) > span:nth-child(1) > span:nth-child(1) 的元素
  await page.click(
    ".r-1ndi9ce > div:nth-child(1) > div:nth-child(1) > span:nth-child(1) > span:nth-child(1)"
  );

  // 使用sleep函数等待一段时间(SLEEP)
  await sleep(SLEEP);

  // 使用page.screenshot方法截取页面图片并保存为debug.png文件
  await page.screenshot({ path: "debug.png" });

  // 使用browser.close方法关闭浏览器实例
  await browser.close();
}

// 最后,在主程序中,获取命令行参数中的第一个参数作为URL,并调用view函数。
const url = process.argv[2]; // 获取命令行参数中的第一个参数作为URL

if (url) {
  view(url, PROXY); 
} else {
  console.log("请输入一个有效的URL"); 
}

puppeteer相当于python selenium 控制无头Chrome,作为前端程序员,那python虽然语法容易但毕竟学的也比较多,所以建议可以试试puppeteer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java会议管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

DSP f32 q15 q31 数据格式

+ V hezkz17进数字音频系统研究开发交流答疑 f32 q15 q31 分别代表什么数据格式? 2023/6/29 17:38:47 "f32"、"q15"和"q31"是不同的数据格式表示法: f32:它代表32位浮点数。在这种表示法中,32位被用来表示带有小数点的实数。其中,1位用于…

MySQL阿里巴巴规约

MySQL阿里巴巴规约 1.MySQL阿里巴巴规约【转载】 1.MySQL阿里巴巴规约【转载】

一步一步学OAK之十一:实现在RGB相机上进行对象跟踪

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4:定义和加载模型相关的路径和标签Setup 5: 创建pipelineSetup 6: 创建节点Setup 7: 设置属性设置相机属性设置神经网络节点属性设置物体跟踪对象属性 Setup 8: 建立链接Setup 9: 连接设备并启动管道Setup …

剑指 Offer 33: 二叉搜索树的后序遍历序列

这道题运用的后序遍历一个很重要的性质:最后一个值是根节点,并且二叉搜索树的性质使得右子树的数全都大于左子树。 这里有三个重要的地方, 第一个是当Start值大于等于End(即为只有一个节点时,此时已经满足条件&#xf…

Revit中用自适应创建简单的瓦片族和切换构件的材质?

一、Revit中使用自适应创建瓦片族 在我们的日常生活中,屋顶的瓦片是我们经常都能够见到的,瓦片能够挡风遮雨也能够使建筑物带来古香古色的气息,那我们今天来学习如何使用自适应创建简单的瓦片族。 1.首先:我们打开自适应公制常规模…

usb转rs232全隔离设计参考

参考 CN-0373 特此记录 anlog 2023年6月29日

css基础(四)

目录 一、CSS 定位 1.1 为什么需要定位 1.2 定位组成 1.3 静态定位static(了解) 1.4 相对定位relative(重要) 1.5 绝对定位absolute(重要) 1.6 子绝父相的由来 1.7 固定定位fixed(重要&#xff…

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 异常解决

目录 问题 原因 解决 今天在开发一个DB同步工具的时候,因为采用的是原生的jdbcDriver链接数据库的,代码如下“ Class.forName(this.jdbcDriver); ”,我这边的配置是“ "jdbcDriver":"com.mysql.cj.jdbc.Driver" ”&am…

红帽限制 RHEL 代码访问,瞄准 Rocky Linux 和 AlmaLinux

CentOS Stream 是由 Red Hat 公司推出的一个开源操作系统,它与 Red Hat Enterprise Linux(RHEL)密切相关。事实上,CentOS Stream 是 RHEL 开发过程中的一个中间流程(在发布新的 RHEL 版本之前,Red Hat 会在…

基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升

查看原文>>>基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升 根据生态环评内容庞杂、综合性强的特点,依据生态环评最新导则,将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环…

【TOOL】 提升ROS配置主从机效率的小工具

一、简介 因经常需要对不同机器配置主从机(不同机器的主机名一致,IP地址为 “192.168.101.*** ”格式),故整理此脚本来提高自己频繁切换机器和主从机/单机模式的切换效率,进行一个命令行配置/取消主从机模式。 二、配置步骤 1.编辑脚本文件…

QTableWidget篇章学习

QTableWidget篇章学习 【1】UI设计【2】效果演示【3】QTableWidget简介【4】QTableWidget常用方法【5】QTableWidget设置样式表【6】源码头文件源文件 【1】UI设计 【2】效果演示 【3】QTableWidget简介 QTableWidget是Qt框架中提供的用于显示表格内容的小部件之一。它是基于Q…

大佬总结入职阿里,软件测试常见基础题绝不能忘

什么是软件测试? 正向思维:验证程序是否正常运行,以及是否达到了用户预期的需求。 逆向思维:通过执行测试用例发现程序的错误和缺陷。 关键字:正常运行、用户需求、发现错误。 软件测试的目的是什么? 找出软…

Vue数据代理

数据代理: 1.Vue中的数据代理: 通过vm对象来代理data对象中属性的操作(读/写) 2.Vue中数据代理的好处: 更加方便的操作data中的数据 3.基本原理: 通过Object.defineProperty()把data对象中所有属性添加到vm…

MySQL数据库总结 之 函数命令总结

MySQL命令语句中的函数包含四种: 字符串函数数值函数日期函数流程函数 前两篇关于MySQL的博客,地址如下: MySQL数据库 && SQL语言命令总结 && 数据类型、运算符和聚合函数汇总_Flying Bulldog的博客-CSDN博客https://blog.…

Flink 源算子之 DataGeneratorSource DataGenerator

目录 1、功能说明 2、API使用说明 3、代码示例 1、功能说明 从Flink1.1开始提供了DataGen连接器,它提供了Source类的实现(可并行的源算子),用来生成测试数据,在本地开发或者无法访问外部系统(如kafka)时&#xff0c…

java连接数据库的5种方式

方式一直接导入第三方库驱动类 这种加载方式在jdbc入门时已经用过,这个driver属于第三方库,。为静态加载,灵活性差,依赖性抢 方式二使用反射机制获取 方式一和方式二代码 package com.hsp.edu;import com.mysql.cj.jdbc.Driver;i…

【FFmpeg实战】音频重采样

转载自原文地址: https://www.cnblogs.com/zjacky/p/16529648.html 重采样: 将音频进行SDL播放的时候,因为当前的SDL2.0不支持plannar格式,也不支持浮点型的,而最新的FFpemg会将音频解码为AV_SAMPLE_FMT_FLTP&#xf…

LORA模型原理详解+分层控制使用

一、前言 LoRA模型全称是:Low-Rank Adaptation of Large Language Models,可以理解为Stable-Diffusion中的一个插件,仅需要少量的数据就可以进行训练的一种模型。在生成图片时,LoRA模型会与大模型结合使用,从而实现对…