设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 473|回复: 0
收起左侧

[公告] 前端开发爬虫首选puppeteer

[复制链接]
发表于 2023-3-13 16:43:33 | 显示全部楼层 |阅读模式
很多前端同学可能对于爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 python 、php 等。当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript 也可以用来写爬虫了。但这是大数据时代,数据的需求是不分前端还是后端的,既然由于 nodejs 强大的异步特性,让我们可以轻松以异步高并发去爬取网站。

QQ图片20230313152401.png
这里会有一个问题吗,那就是前端程序员如果要开发爬虫是使用python还是使用puppeteer呢?如果想快速开发爬虫,还是驱动浏览器的方式比较好,我推荐用puppeteer,纯js环境,上手快,puppeteer直接驱动无头浏览器速度并不算慢。但是现在目标网站爬虫策略多种多样,即使是使用最简单的方式也要学习反爬策略的应对。如果遇到验证码识别等需要深度学习的,可以用python写这部分,然后nodejs和python进程间通信。
这里我们可以使用puppeteer简单的实现下爬虫,就以获取微博热搜为例子进行实践。
  1. // 引入process和puppeteer模块
  2. const process = require("process");
  3. const puppeteer = require("puppeteer");

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

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

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

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

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

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

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

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

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

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

  44. if (url) {
  45.   view(url, PROXY);
  46. } else {
  47.   console.log("请输入一个有效的URL");
  48. }
复制代码
puppeteer相当于python selenium 控制无头Chrome,作为前端程序员,那python虽然语法容易但毕竟学的也比较多,所以建议可以试试puppeteer。



您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-5-4 19:13 , Processed in 0.064762 second(s), 9 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表