使用web浏览器没有URL自动filedownload(Automated filedownload

2019-07-30 09:43发布

我一直在努力使用System.Windows.Forms.WebBrowser写在C#中的WebCrawler的。 我试图下载文件时关闭一个网站,并将其保存在本地机器上。 更重要的是,我想这是完全自动化。 文件下载可以通过点击一个按钮,调用火花显示“你想打开或保存此文件吗?”对话框中选择下载的JavaScript函数开始。 我绝对不希望手动点击“另存为”,并在文件名输入。

我知道HttpWebRequest和WebClient的的下载功能,但由于在下载开始一个JavaScript,我不知道现在该文件的URL。 据透露,javascript的是改变一些值,并提交形式doPostBack功能。

我试着让在另存为对话框从web浏览器集中到没有多少成功它在那里自动化。 我知道有一种方法强制下载保存,而不是要求通过将报头的http请求保存或打开,但我不知道如何指定文件路径下载到。

Answer 1:

我想你应该防止下载对话框,从中甚至呈现。 这里可能是一个办法做到这一点:

  • JavaScript代码会导致您的浏览器控件导航到一个特定的URL(什么会导致出现下载对话框)

  • 为了防止实际导航到以下链接WebBrowser控件,附加一个事件处理程序的导航事件。

  • 在您的导航事件你要分析,如果这是你想要停止的实际导航操作(这是一个下载网址,或许检查文件扩展名,必须有一个可识别的格式)。 使用WebBrowserNavigatingEventArgs.Url这样做。

  • 如果这是正确的网址,通过设置WebBrowserNavigatingEventArgs.Cancel物业停止导航。

  • 继续下载自己用的HttpWebRequest或WebClient的类

看看这个网页,了解事件的详细信息:
http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.navigating.aspx



Answer 2:

类似的解决方案可在http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/d338a2c8-96df-4cb0-b8be-c5fbdd7c9202/?prof=required

这项工作很好,如果有直接的URL包括下载文件名。

但有时一些URL动态生成的文件。 所以,URL没有文件名,但请求URL后,一些网站上创建文件动态,然后打开/保存对话框出现。

例如一些链接动态生成PDF文件。

如何处理这种类型的网址吗?



Answer 3:

看看埃里卡Chinchio文章http://www.codeproject.com/Tips/659004/Download-of-file-with-open-save-dialog-box

我已经成功地使用它下载动态生成PDF格式的URL。



Answer 4:

假设System.Windows.Forms.WebBrowswer使用与您想要下载受保护的链接访问受保护的页面:

此代码检索要使用Web浏览器来下载实际的链接。 此代码将需要更改您的具体行动。 最重要的部分是这样的一个领域documentLinkUrl下面将要使用的。

var documentLinkUrl = default(Uri);
browser.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
{
    var aspForm = browser.Document.Forms[0];
    var downloadLink = browser.Document.ActiveElement
        .GetElementsByTagName("a").OfType<HtmlElement>()
        .Where(atag => 
            atag.GetAttribute("href").Contains("DownloadAttachment.aspx"))
        .First();

    var documentLinkString = downloadLink.GetAttribute("href");
   documentLinkUrl = new Uri(documentLinkString);
}
browser.Navigate(yourProtectedPage);

现在,受保护的页面已经被Web浏览器导航到和下载链接已被收购,此代码下载链接。

private static async Task DownloadLinkAsync(Uri documentLinkUrl)
{
    var cookieString = GetGlobalCookies(documentLinkUrl.AbsoluteUri);
    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = documentLinkUrl })
    {
        cookieContainer.SetCookies(this.documentLinkUrl, cookieString);
        var response = await client.GetAsync(documentLinkUrl);
        if (response.IsSuccessStatusCode)
        {
            var responseAsString = await response.Content.ReadAsStreamAsync();
            // Response can be saved from Stream

        }
    }
}

上面的代码依赖于GetGlobalCookies从埃里卡Chinchio方法,其可以通过@Pedro莱昂纳多(可提供的优异的文章中找到此处 ),

[System.Runtime.InteropServices.DllImport("wininet.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
    System.Text.StringBuilder pchCookieData, ref uint pcchCookieData, int dwFlags, IntPtr lpReserved);

const int INTERNET_COOKIE_HTTPONLY = 0x00002000;

private string GetGlobalCookies(string uri)
{
    uint uiDataSize = 2048;
    var sbCookieData = new System.Text.StringBuilder((int)uiDataSize);
    if (InternetGetCookieEx(uri, null, sbCookieData, ref uiDataSize,
            INTERNET_COOKIE_HTTPONLY, IntPtr.Zero)
        &&
        sbCookieData.Length > 0)
    {
        return sbCookieData.ToString().Replace(";", ",");
    }
    return null;
}


文章来源: Automated filedownload using WebBrowser without url