首页 > 其他分享 >puppeteersharp爬取网页数据

puppeteersharp爬取网页数据

时间:2024-08-17 18:26:56浏览次数:17  
标签:args 网页 puppeteersharp await Console 爬取 https var currentPage

官网

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);
    }
}

在这里插入图片描述

切换tab选项卡

//切换tab选项卡
await currentPage.BringToFrontAsync();

关闭浏览器

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

标签:args,网页,puppeteersharp,await,Console,爬取,https,var,currentPage
From: https://blog.csdn.net/qq_36437991/article/details/141138324

相关文章

  • 【Python爬虫+可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图,一个完
    要使用Python爬取天气数据并实现数据可视化,特别是绘制天气轮播图(指的是随时间变化的天气图表),我们可以使用几个流行的库:requests 用于网络请求,pandas 用于数据处理,matplotlib 或 plotly 用于数据可视化。此外,为了处理时间序列数据,pandas 的日期时间功能非常有用。先来看......
  • 生鲜商城购物系统解决方案毕设毕业设计.web期末作业设计网页.css网页成品参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 零成本 API 服务搭建,用 GitHub Actions 自动爬取文章?
    前言本着将成本降到最低,我目前做的应用或小程序都是单机的,也就是不用请求接口,只要一上架就没有任何支出。但是写死的数据毕竟有限,应用的内容单一无法紧跟时事热点,每次打开一个样,自然就没有留存。遇到有错字啥还要更新版本,那有没有方法既能丰富应用内容,又不用增加成本呢?既要又要,......
  • 一个简单静态网页
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metaname="viewport"content="width=device-width,initial-scale=1.0">  <title>网络安全C10期课程</title> ......
  • 掌握Golang的html/template:打造动态网页的秘籍
    掌握Golang的html/template:打造动态网页的秘籍在Web开发的世界中,动态内容的生成是至关重要的。Golang以其简洁高效的特性,成为了后端开发的热门选择。而html/template包,则是Golang中用于创建HTML模板的官方工具,它不仅安全,而且功能强大。本文将带领你深入了解如何使用html/te......
  • 437.蓝色简单的多乐士油漆公司网站 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有各行各业的Web前端网页制作的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • c# net爬取百度热搜
    varurl="https://top.baidu.com/board?tab=realtime";//百度using(varhttpClient=newHttpClient()){varresponse=awaithttpClient.GetStringAsync(url);varhtmlDocument=newHtmlDocument();htmlDocument.LoadHtml(response);varcategoryWrapN......
  • 乐器在线购物商城系统解决方案毕设毕业设计.web期末作业设计网页.css网页成品参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 小白手动网页简单写
    情境最近在参加一个培训,这里是第一课的作业题.使用html写一个网页,要求满足以下条件:网页标题:网络安全C10期课程网页背景颜色:蓝色超链接:网页中含有一个超链接,点击即可跳转至百度自动跳转:如果网页中不做任何操作,5秒后跳转至马哥教育官网环境作为小白,......
  • 用html2canvas转当前网页为图片的流程
    1、从canvas中直接提取图片元数据//图片导出为png格式vartype='png';varimgData=canvas.toDataURL(type);上面的代码得到的数据格式为:data:image/png;base64,.....2、将mime-type改为image/octet-stream,强制让浏览器直接download**获取mimeType@param{Str......