将图片框图像设置为PhantomJS加载页面中的图像

时间:2017-07-28 21:39:25

标签: c# selenium selenium-webdriver phantomjs picturebox

目前的情况是我正在使用PhantomJS和Selenium加载网页,因为主机网站支持cloudflare ddos​​保护,所以我不能使用任何没有内置javascript的东西。这一直运行良好有一段时间但网站最近一直在使用他们自己的CDN来传递这些图像,这会在将PictureBox.ImageLocation设置为src时出现问题。

如果有任何方法可以获得<img>代码src,并将其转换为bitmapimage,以便能够直接从我的图片框中的PhantomJS使用该图片,那就是太棒了。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

对于与我情况相同的人:

事实证明,为PhantomJS和selenium存储适当的缓存并不容易,所以我转向另一条路线,最终工作。

当PhantomJS访问锁定在JS墙后面的网站时(例如CloudFlare DDOS Protection),它很可能会存储一个带有auth令牌的cookie,说明您的浏览器通过了测试。

起初,它对我不起作用,因为CloudFlare似乎还记录了哪个用户代理已为该令牌授权,并且任何不匹配都会丢弃所使用的令牌。

我设法使用以下代码解决了这个问题:

private Image GetImage(string ImageLocation)
{
    byte[] data = null;
    using (CustomWebClient WC = new CustomWebClient())
    {
        WC.Headers.Add(System.Net.HttpRequestHeader.UserAgent, "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A403 Safari/601.1.46");
        WC.Headers.Add(System.Net.HttpRequestHeader.Cookie, "cf_clearance=" + PhantomObject.Manage().Cookies.GetCookieNamed("cf_clearance").Value);
        data = WC.DownloadData(ImageLocation);
    }
    Bitmap MP = new Bitmap(new System.IO.MemoryStream(data));
    data = null;
    return MP;
}

在此代码中,PhantomObject是我的PhantomJS驱动程序对象,CustomWebClient只是一个普通的网站,对我正在使用的网站进行了一些调整。

我基本上使用我的PhantomJS驱动程序使用的伪造用户代理,以及在CloudFlare清除cookie的标题中传递,从那里我的webclient能够成功访问网站数据并下载图像&#39 ; s数据,然后我转变为位图并返回。