puppeteersharp爬取网页数据

news2024/11/15 17:57:36

官网

https://github.com/hardkoded/puppeteer-sharp

在这里插入图片描述

安装

创建控制台项目,安装PuppeteerSharp 18.1.0

编写代码

安装chrome

async static Task Main(string[] args)
{
   //如果Chromium不存在则先下载
   var browserFetcher = new BrowserFetcher();
   //获取安装的浏览器版本
   //var browsers = browserFetcher.GetInstalledBrowsers();
   //下载指定版本的浏览器或者浏览器标签BrowserTag.Dev
   await browserFetcher.DownloadAsync("127.0.6533.99");
   Console.WriteLine("安装完毕");
}

执行完成之后会多个文件
在这里插入图片描述

浏览器设置

var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
    ExecutablePath =
        @"./Chrome/Win64-127.0.6533.99/chrome-win64/chrome.exe",
    Headless = false,
    IgnoreHTTPSErrors = true,
    UserDataDir = "./chromeData",
    Args = new string[]
    {
        //开启无痕模式
        "--incognito",
        //启动的时候最大化
        "--start-maximized",
        //不启用沙盒环境
        //"--no-sandbox",
        //"--disable-setuid-sandbox",
        //https://blog.csdn.net/charon_0928/article/details/134051787
        //不开启浏览器自动化标识
        /*
        
        if (window.navigator.webdriver) {
            // 浏览器由 WebDriver 驱动打开
        } else {
            // 浏览器是正常手动打开的
        }
        
        var userAgent = window.navigator.userAgent;
        if (userAgent.includes("webdriver") || userAgent.includes("selenium")) {
            // 浏览器由 WebDriver 驱动打开
        } else {
            // 浏览器是正常手动打开的
        }
        //这个需要手动设置USER_AGENT参数, Selenium会用到
         */
        "--disable-blink-features=AutomationControlled",
    }
});

打开新的选项卡


var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.baidu.com/");

在这里插入图片描述
在这里插入图片描述
会开两个选项卡,想在原来的基础上使用

IPage currentPage = null;
var pages = await browser.PagesAsync();
if (pages?.Length > 0)
{
    currentPage = pages[0];
}
else
{
    currentPage = await browser.NewPageAsync();
}
await currentPage.GoToAsync("https://www.baidu.com/");

在这里插入图片描述
设置窗口的显示大小

currentPage.SetViewportAsync(new ViewPortOptions()
{
    Width = 1920,
    Height = 1080
});
await currentPage.GoToAsync("https://www.baidu.com/");   

等待网页加载完毕

/*
'load':等待 load 事件触发。这意呀着页面上的所有资源(如样式表、图片和字体)都已完成加载。
'domcontentloaded':等待 DOMContentLoaded 事件触发。这通常意味着 HTML 文档已被完全加载和解析,但不一定意味着所有依赖的资源(如图片)都已完成加载。
'networkidle0':等待网络空闲,即没有网络连接超过 500ms。这通常意味着页面已经加载完成,并且没有更多的网络请求正在进行。
'networkidle2':与 'networkidle0' 类似,但仅考虑那些与页面加载直接相关的请求(如脚本、样式表和图片)。
*/
await currentPage
    .GoToAsync("https://www.baidu.com/",
        WaitUntilNavigation.Networkidle0);
Console.WriteLine("加载完毕");

在这里插入图片描述

input输入框

//清空之前的数据,TypeAsync方法是追加
await listPage.EvaluateExpressionAsync("document.querySelector('input#kw').value=''");
var searchInput = await currentPage.QuerySelectorAsync("input#kw");
if (searchInput != null)
{
    await searchInput.TypeAsync("蜡笔小新");
}

在这里插入图片描述

搜索按钮点击

var submitButton = await currentPage.QuerySelectorAsync("input[type=\"submit\"]");
if (submitButton != null)
{
    await submitButton.ClickAsync();
}

打开新连接监听请求和响应

currentPage.Request += (object sender, RequestEventArgs args) =>
{
    Console.WriteLine(args.Request.Url);
    Console.WriteLine(args.Request.Method);
    if (args.Request.HasPostData)
    {
        Console.WriteLine(JsonConvert.SerializeObject(args.Request.PostData));
    }
};
currentPage.Response += async (object sender, ResponseCreatedEventArgs args) =>
{
    Console.WriteLine(args.Response.Url);
    if (args.Response.Url.StartsWith("https://ug.baidu.com/mcp/pc/pcsearch"))
    {
        var jsonData = await args.Response.JsonAsync();
        Console.WriteLine(jsonData);
    }
    if (args.Response.Url.StartsWith("https://www.baidu.com/s"))
    {
        var textData = await args.Response.TextAsync();
        Console.WriteLine(textData);
    }
};

在这里插入图片描述
如果是在页面里面打开新的链接,则监听TargetChanged 事件

browser.TargetChanged += async (object sender,TargetChangedArgs args) =>
{
    Console.WriteLine($"url:{args.Target.Url}");
    //列表页面
    if (args.Target.Url.StartsWith("https://www.baidu.com/"))
    {
        var searchResultPage  = await args.Target.PageAsync();
        searchResultPage.Response += async (object sender, ResponseCreatedEventArgs args) =>
		{
		    Console.WriteLine(args.Response.Url);
		    if (args.Response.Url.StartsWith("https://ug.baidu.com/mcp/pc/pcsearch"))
		    {
		        var jsonData = await args.Response.JsonAsync();
		        Console.WriteLine(jsonData);
		    }
		    if (args.Response.Url.StartsWith("https://www.baidu.com/s"))
		    {
		        var textData = await args.Response.TextAsync();
		        Console.WriteLine(textData);
		    }
		};
};

// 等待新标签页加载完成
// var newPage = await browser.WaitForTargetAsync((target) => target.Url == "https://www.nmpa.gov.cn/datasearch/search-result.html");
// currentPage = await newPage.PageAsync();
// Console.WriteLine("新的tab页面加载完成");

获取网页内容

//需要等待一会要不然拿不到数据
//await currentPage.WaitForSelectorAsync("div.c-container");
var response = await currentPage.WaitForResponseAsync((response) => true);
Console.WriteLine(response?.Ok);
Thread.Sleep(3*1000);
var searchResults   = await currentPage.QuerySelectorAllAsync(".c-container");
if (searchResults != null && searchResults.Length > 0)
{
    foreach (var searchResult in searchResults)
    {
        var searchContent = await searchResult.Frame.GetContentAsync();
        Console.WriteLine(searchContent);
    }
}

在这里插入图片描述

关闭浏览器

await browser.CloseAsync();

参考

https://blog.csdn.net/fenglingguitar/article/details/137477378
https://www.nmpa.gov.cn/datasearch/search-result.html
https://blog.csdn.net/charon_0928/article/details/134051787
https://blog.csdn.net/joy1793/article/details/116207436

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

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

相关文章

redis面试(十三)公平锁排队代码剖析

我们来看一下第二种redis分布式锁 第一种锁是可重入锁,非公平可重入锁,所谓的非公平可重入锁是什么意思呢?胡乱的争抢,根本没有任何公平性和顺序性可言 第二种锁,可重入锁,公平锁 通过公平锁&#xff0c…

haproxy七层代理总结

一、HAProxy概念 1.1 什么是HAProxy? HAProxy是一款开源、高性能的负载均衡器和代理服务器,专为TCP和HTTP应用而设计。它可以将客户端的请求分发到多台后端服务器,从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制&a…

一篇文章带你学会向量数据库Milvus

一篇文章带你学会向量数据库Milvus 索引管理 Milvus 提供多种索引类型来对字段值进行排序,以实现高效的相似性搜索。它还提供三种度量类型:余弦相似度 (COSINE)、欧几里得距离 (L2) 和内积 (IP)来测量向量嵌入之间的距离。 建议…

零基础学会机器学习,到底要多久?

这两天啊,有不少朋友和我说,想学机器学习,但是之前没有基础,不知道能不能学得会。 首先说结论,只要坚持,就能学会,但是一定不能三天打鱼两天晒网,要持之以恒,至少每隔两…

小白零基础学数学建模系列-Day4-线性规划基础与案例分析

文章目录 1. 线性规划基础1.1 基本概念1.2 求解方法 2 线性规划经典问题2.1 生产计划问题2. 2 运输问题 案例1:生产计划问题背景模型建立模型求解 案例2:运输问题背景模型建立模型求解 案例3:货机货物装载问题问题背景假设条件问题要求模型建…

【微信小程序】WXSS 模板样式

1. 什么是 WXSS WXSS (WeiXin Style Sheets)是一套样式语言,用于美化 WXML 的组件样式,类似于网页开发中的 CSS。 2. WXSS 和 CSS 的关系 3.rpx (1). 什么是 rpx 尺寸单位 rpx(responsive pixel)是微信小程序独有的,用来解决屏适配的尺寸单位。 (2). rpx 的实现原理 …

哈希表 -四数相加II

454. 四数相加II 方法一:分组哈希表 /*** param {number[]} nums1* param {number[]} nums2* param {number[]} nums3* param {number[]} nums4* return {number}*/ var fourSumCount function(nums1, nums2, nums3, nums4) {const twoSumMap new Map();let coun…

【机器学习之深度学习】深度学习和机器学习的关系以及深度学习的应用场景

引言 深度学习和机器学习是人工智能领域的两个重要分支,它们之间既有联系也有区别 文章目录 引言一、深度学习和机器学习的关系1.1 联系1.2 区别1.2.1 模型复杂度1.2.2 数据需求1.2.3 特征提取1.2.4 训练速度和计算资源 二、深度学习有哪些应用场景2.1 计算机视觉2.…

Unity | AmplifyShaderEditor插件基础(第一集:简单了解ASE和初识)

前言 我本来老老实实的写着我的Shader,群里的小伙伴强烈建议我开始讲ASE,我只能说,我是一个听话的Up。 一、什么是ASE 全称AmplifyShaderEditor,是一个unity插件,存在于unity商城中,售价看他们心情。&am…

deepin V23 前瞻丨深度适配RISC-V架构,打造全面兼容与高性能的开源桌面操作系统

查看原文 中国工程院院士倪光南曾表示,RISC-V架构因其开放性和灵活性,已成为中国CPU领域最受欢迎的选择之一,并有望成为推动新一代信息技术发展的关键驱动力。目前,deepin(深度)社区已与RISC-V生态系统建立…

ECMAScript6语法:类

在 ES6 中新增了类的概率,多个具有相同属性和方法的对象就可以抽象为类。类和对象的关系如下: (1)类抽象了对象的公共部分,它泛指某一大类(class)。 (2)对象特指通过类…

haproxy 7000字配图超详细教程 从小白到入门

简介:HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速,HAProxy具备媲美商用负载均衡器的性能和稳…

基于python理解最大似然MLE-(简单正态分布估计、高斯混合模型GMM)

最大似然法(Maximum Likelihood Estimation,简称MLE)是一种统计方法,用于估计概率模型的参数。其基本思想是寻找一组参数值,使得在这组参数下,观测数据出现的概率(即似然性)最大。这…

ARM64 在线仿真器

今天在晚上找到一个简单的ARM64在线仿真器,它非常适合学习ARM64的指令,在教学中应该很好用。网址ARM64 Online Simulatorhttp://163.238.35.161/~zhangs/arm64simulator/ 它是由康涅狄格州立大学的Shuqun Zhang教授开发的。软件基于Alexandro Sanchez开…

评价算法(topsis熵权法)

评价算法 熵权法 上面箭头的一步用到了带权重的距离公式。 上面是某种求权重的方法,合理就行。 但是在使用熵权法的时候,一定要注意用的是规范化矩阵再用熵权法求权重。 规范化之前一定要判断每一列的性质 #熵权法:import xlrd import num…

巴黎奥运会背后的8K国际公用信号制作

北京时间2024年8月12日凌晨3时,举世瞩目的巴黎奥运会闭幕式在法兰西体育场举行,闭幕式演出部分的主题为“记录”。BOSMA博冠首款8K 50P小型化广播级摄像机B1跟随中央广播电视总台“中国红”8K转播车,为田径比赛和闭幕式提供8K国际公用信号制作…

【Ajax使用说明】Ajax、Axios以及跨域

目录 一、原生Ajax 1.1 Ajax简介 1.2 XML简介 1.3 AJAX 的特点 1.3.1 AJAX的优点 1.3.2 AJAX 的缺点 1.4 AJAX 的使用 1.4.1AJAX的基本操作 1.4.2AJAX的传参 1.4.3 AJAX的post请求及设置请求体 1.4.4 AJAX响应json数据 1.4.5 AJAX请求超时与网络异常处理 1.4.5 AJ…

windows 使用Clion开发FreeSWITCH源码

1.准备环境 window安装clion可以编译freeswitch的docker镜像 2.clion配置ssh和Toolchain的配置 去这里看吧 3.makefile配置 Toolchain记得选ssh的 成功之后左下角有这个小锤子,这个小锤子就是生成makefile文件的,记得点击 同时就会出现这个东西 这样…

长文_ZATA

文章目录 环境配置问题miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 环境配置问题 miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因:fbegmm.dll文件出现问题 解决方案: 使用依赖分析工具https:/…

SuccBI+低代码文档中心 —数据(数据连接、调度管理)

连接数据 数据加工和分析需要连接已存在的数据,通常是业务系统的数据或文件数据,业务系统数据一般存储在关系型数据库中。对于存储在json文件中的,也可以通过脚本数据加工的方式获取数据。 在数据模块下,点击新建,可以…