Puppeteer Sharp: 使用C#和Headless Chrome爬網(wǎng)頁

Puppeteer 是谷歌構(gòu)建的流行的Headless Chrome NodeJS API爬蟲庫痊班。Puppeteer Sharp是用C#寫的,由達里奧·孔德拉蒂烏克2017年發(fā)行,為.NET開發(fā)者提供同樣的功能纱烘。

Puppeteer logo

Puppeteer Sharp使 .NET 開發(fā)人員能夠以編程方式控制開源的谷歌瀏覽器雳灵。Puppeteer API 的便利性是能夠使用瀏覽器的無頭特性,而不需要把瀏覽器顯示出來糊肠,以此提高性能辨宠。

Why use Puppeteer Sharp?

如果您是 .NET 開發(fā)人員,通過 Nuget 包安裝到項目中可以實現(xiàn):

  • 使用無頭 Web 瀏覽器抓取 Web
  • 使用測試框架自動測試Web 應用程序
  • 檢索 JavaScript 呈現(xiàn)的 HTML

在現(xiàn)代 Web 中货裹,Web 應用程序通常依賴 JavaScript 來加載 UI嗤形。如果您用爬蟲加載必應地圖,您可能會失望地收到:

Bing Maps empty

除了檢索JavaScript呈現(xiàn)的HTML弧圆,Puppeteer Sharp 還能夠通過注入HTML來導航網(wǎng)站;與UI元素交互;截圖或創(chuàng)建PDF赋兵,并且現(xiàn)在有更多的功能包含在流行的谷歌NodeJS API中。

Getting Started

在新或現(xiàn)有的 .NET 項目中使用Puppeteer Sharp 搔预。安裝最新版本的Nuget包"PuppeteeSharp"霹期。

image.png

首先我們需要下載Chrome瀏覽器到本地。這是Puppeteer Sharp將使用與網(wǎng)站交互的瀏覽器斯撮。
幸運的是经伙,我們可以使用 C# 下載默認修訂版或開發(fā)人員指定的修訂版。僅當本地計算機上不存在該修訂版本時,才會下載帕膜。

// Download the Chromium revision if it does not already exist
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);

如果下載成功枣氧,您將在項目目錄中看到在操作系統(tǒng)上運行所需的瀏覽器版本:

image.png

加載網(wǎng)頁

現(xiàn)在,您已將瀏覽器下載到本地計算機垮刹,您可以開始加載網(wǎng)頁并檢索 JavaScript 呈現(xiàn)的 HTML达吞。
首先,我們將啟動無頭 Web 瀏覽器的實例荒典,加載新選項卡并轉(zhuǎn)到"https://www.bing.com/地圖":

// Create an instance of the browser and configure launch options
Browser browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
   Headless = true
});

// Create a new page and go to Bing Maps
Page page = await browser.NewPageAsync();
await page.GoToAsync("https://www.bing.com/maps");

image.png

在無頭瀏覽器中成功加載網(wǎng)頁后酪劫,讓我們通過搜索本地旅游景點與網(wǎng)頁進行交互:

// Search for a local tourist attraction on Bing Maps
await page.WaitForSelectorAsync(".searchbox input");
await page.FocusAsync(".searchbox input");
await page.Keyboard.TypeAsync("CN Tower, Toronto, Ontario, Canada");
await page.ClickAsync(".searchIcon");
await page.WaitForNavigationAsync();

我們可以使用Puppeteer Sharp與JavaScript呈現(xiàn)的必應地圖HTML互動,并搜索"CN Tower, Toronto, Ontario, Canada"寺董!
如果要存儲 HTML 以分析地址或描述等信息覆糟,可以輕松地將 HTML 存儲在變量中:

// Store the HTML of the current page
string content = await page.GetContentAsync();

完成后,關(guān)閉瀏覽器以釋放資源:

// Close the browser
await browser.CloseAsync();

屏幕截圖和 PDF 文檔

Puppeteer Sharp的好處之一是能夠生成當前頁面的屏幕截圖和 PDF 文檔遮咖。這對于調(diào)試滩字、自動測試或以特定分辨率捕獲網(wǎng)頁特別有用。
如果您想獲取當前頁面的屏幕截圖:

await page.ScreenshotAsync("C:\\Files\\screenshot.png");

Puppeteer screenshots

或者御吞,要生成當前頁面的 PDF 文檔:

await page.PdfAsync("C:\\Files\\document.pdf");

image.png

更改網(wǎng)頁大小

如果需要測試特定顯示大小的網(wǎng)頁(例如查看頁面在手機上的顯示方式)麦箍,可以使用 Puppeter Sharp 更改當前頁面的網(wǎng)頁的大小:

// Change the size of the view port to simulate the iPhone X
await page.SetViewportAsync(new ViewPortOptions
{
    Width = 1125,
    Height = 2436
});

image.png

跟蹤日志

除了上述功能陶珠,Puppeteer Sharp對于監(jiān)視和檢測與網(wǎng)頁用戶界面相關(guān)的問題很有用挟裂, .NET 開發(fā)人員可以使用 Puppeteer Sharp 來檢查任何網(wǎng)絡(luò)性能問題。

為此揍诽,我們可以啟動和停止跟蹤日志:

await page.Tracing.StartAsync(new TracingOptions { Path = "C:\\Files\\trace.json" });

...

await page.Tracing.StopAsync();

image.png

如果跟蹤日志未捕獲調(diào)試會話中所需的詳細信息诀蓉,則可以啟用 Chrome DevTools 以進一步的分析:

Browser browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
   Devtools = true
});

如果您在Puppeteer Sharp中啟用 Chrome DevTools,則無頭配置將自動禁用寝姿,您將能夠查看瀏覽器交排,而 DevTools 將顯示查看 Web 應用程序的 JavaScript 呈現(xiàn)代碼的選項,以及查看網(wǎng)絡(luò)活動等功能饵筑。

image.png

連接到遠程瀏覽器

Puppeteer Sharp的最后一個功能埃篓,是連接到遠程瀏覽器的能力。如果您的服務(wù)器上無法安裝瀏覽器(比如Linux)根资,則此功能可能很有用架专。

比如老外的這個browserless.io:,不差錢的童鞋可以使用

image.png

var connectOptions = new ConnectOptions()
{
   BrowserWSEndpoint = "$wss://chrome.browserless.io/"
};

using (var browser = await Puppeteer.ConnectAsync(connectOptions))
{
   ...
}

項目捐助

項目官網(wǎng) puppeteersharp.com.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玄帕,一起剝皮案震驚了整個濱河市部脚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裤纹,老刑警劉巖委刘,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧没,死亡現(xiàn)場離奇詭異,居然都是意外死亡锡移,警方通過查閱死者的電腦和手機呕童,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淆珊,“玉大人夺饲,你說我怎么就攤上這事∈┓” “怎么了往声?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長戳吝。 經(jīng)常有香客問我浩销,道長,這世上最難降的妖魔是什么骨坑? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任撼嗓,我火速辦了婚禮,結(jié)果婚禮上欢唾,老公的妹妹穿的比我還像新娘。我一直安慰自己粉捻,他們只是感情好礁遣,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肩刃,像睡著了一般祟霍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盈包,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天沸呐,我揣著相機與錄音,去河邊找鬼呢燥。 笑死崭添,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的叛氨。 我是一名探鬼主播呼渣,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寞埠!你這毒婦竟也來了屁置?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仁连,失蹤者是張志新(化名)和其女友劉穎蓝角,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡使鹅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年揪阶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并徘。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡遣钳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麦乞,到底是詐尸還是另有隱情蕴茴,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布姐直,位于F島的核電站倦淀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏声畏。R本人自食惡果不足惜撞叽,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望插龄。 院中可真熱鬧愿棋,春花似錦、人聲如沸均牢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徘跪。三九已至甘邀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垮庐,已是汗流浹背松邪。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哨查,地道東北人逗抑。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像解恰,于是被迫代替她去往敵國和親锋八。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345