puppeteersharp爬取网页数据

官网

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

好的,我来为您介绍如何使用Playwright模拟浏览器获取https://www.nmpa.gov.cn/datasearch/search-result.html的数据。 首先,您需要安装Playwright库。可以使用以下命令在终端中安装: ``` npm install playwright ``` 然后,您可以使用以下代码模拟打开浏览器,导航到目标网站,并搜索数据: ```javascript const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch({ headless: false }); // 打开Chromium浏览器 const page = await browser.newPage(); // 创建一个新页面 await page.goto('https://www.nmpa.gov.cn/datasearch/search-result.html'); // 导航到目标网站 // 等待搜索框加载完成 await page.waitForSelector('.search-input-wrapper input'); // 在搜索框中输入关键字 await page.type('.search-input-wrapper input', '口罩'); // 点击搜索按钮 await page.click('.search-input-wrapper button'); // 等待搜索结果加载完成 await page.waitForSelector('.search-result-list'); // 获取搜索结果 const results = await page.evaluate(() => { const list = []; const elements = document.querySelectorAll('.search-result-list .search-item'); for (const element of elements) { const title = element.querySelector('.search-item-title a').innerText; const date = element.querySelector('.search-item-time').innerText; const link = element.querySelector('.search-item-title a').href; list.push({ title, date, link }); } return list; }); console.log(results); await browser.close(); // 关闭浏览器 })(); ``` 上面的代码首先打开Chromium浏览器,然后导航到目标网站。接着,它等待搜索框加载完成,输入关键字并点击搜索按钮。然后,它等待搜索结果加载完成,并且使用`evaluate`方法获取搜索结果。最后,它将搜索结果打印到控制台中,并关闭浏览器。 希望这可以帮助您获取目标网站的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值