Хотя по-прежнему происходит множество улучшений , Puppeteer-Sharp является поточно-ориентированным.Чтобы улучшить производительность загрузки, есть несколько подходов, которые вы можете использовать.
Запустите один браузер и затем подключитесь к нему
Вы можете запустить один (настоящий) браузер и затемиспользуйте метод ConnectAsync
для подключения к нему.
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = false,
});
var theBrowser1 = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = browser.WebSocketEndpoint });
var theBrowser2 = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = browser.WebSocketEndpoint });
var page1 = await theBrowser1.NewPageAsync();
var page2 = await theBrowser2.NewPageAsync();
await Task.WhenAll(
page1.GoToAsync("https://www.stackoverflow.com"),
page2.GoToAsync("https://serverfault.com/")
);
Я знаю, что код не работает параллельно, но вы поймете, как повторно использовать тот же браузер.
Создание новых страниц в одном браузере
Если вы используете TPL , у вас не должно возникнуть проблем при создании новых страниц из разных потоков с использованием одного и того же браузера.
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = false,
});
var urls = new string[]
{
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com",
"https://www.stackoverflow.com"
};
await Task.WhenAll(
urls.Select(url => Task.Factory.StartNew(async () =>
{
var page = await browser.NewPageAsync();
return page.GoToAsync(url);
})));
Опять же, этот пример просто для того, чтобы дать вам представление о том, как это можно сделать.
Очередь страниц
Есть один пользователь, которыйсоздал очередь из X страниц (для x от 0 до X => NewPage), а затем он брал страницы из этой очереди.Вы можете увидеть пример здесь .