【问题标题】:Download image from page with Puppeteersharp使用 Puppeteersharp 从页面下载图像
【发布时间】:2021-03-30 00:15:47
【问题描述】:

有没有办法通过 Puppeteersharp 下载页面上显示的图像?

我知道我可以使用选择器来检索 src,然后使用 WebClient 或 HTTPRequest,但我想知道我是否可以直接这样做

【问题讨论】:

  • 您可以使用响应事件。但是您需要事先知道网址

标签: c# webautomation puppeteer-sharp


【解决方案1】:

如果有人需要,这是我在下面使用的代码:

        Base64Image img = new Base64Image();            
        using (Page page = await parentPage.Browser.NewPageAsync())
        {                
            var tcs = new TaskCompletionSource();
            page.Response += async (sender, e) =>
            {
                string contentType = null;
                string[] imageMimeTypes = { "image/jpeg", "image/png", "image/webp", "image/gif" };

                if (e.Response.Headers.ContainsKey("content-type"))
                    contentType = (string)e.Response.Headers["content-type"].ToLower();

                if (e.Response.Headers.ContainsKey("Content-Type"))
                    contentType = (string)e.Response.Headers["Content-Type"].ToLower();

                if (imageMimeTypes.Any(t => t == contentType))
                {
                    img.ContentType = contentType;
                    

                    await e.Response.BufferAsync().AsTask().ContinueWith(async (data) => img.Bytes = await data);   
                    tcs.TrySetResult();
                }
            };
            await Task.WhenAll(page.GoToAsync(uri.AbsoluteUri), tcs.Task);
            await page.CloseAsync();
        }
        return img;

【讨论】:

  • 为什么是Task.WhenAll?导航到带有await page.GoToAsync() 的页面,然后导航到await 解析任务。 Response 事件不能在GoToAsync 之前触发,所以没有理由使用Task.WhenAll
  • 根据我的测试,GoToAsync() 触发了Response 事件。 Task.WhenAll 等待 GoToAsyncResponse 事件完成。也许我可以用不同的方式把它们锁起来。
猜你喜欢
  • 2016-01-05
  • 2022-09-23
  • 2010-09-20
  • 1970-01-01
  • 2022-11-06
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多