如何从未知位置下载文件
本文关键字:下载 文件 位置 未知 | 更新日期: 2023-09-27 18:18:37
我有一个问题,我一直在努力解决,但似乎找不到答案,所以希望有人在这里可以帮助我找到一个答案。
问题是,我试图从一个动态生成下载文件的网站创建一个网络抓取。本网站需要输入各种参数,以便对您的数据请求进行分类。一旦你点击提交按钮,网站就会根据你的参数动态生成数据请求,并将结果下载到文件中。
当尝试用c#这样做时,我的代码成功地提交了带有所需参数的请求,并捕获了HTML响应,但似乎无法捕获文件下载响应。远程URL上的文件下载位置被屏蔽。下载文件名以"Inquiry_currentdate_currenttime.xml"格式动态生成。文件大小可以根据所提交的数据请求而变化。
这个远程URL将数据文件推送给我,而不是我使用c# DownloadFile从URL中提取数据。我如何捕获这个"被推送"的文件?
到目前为止,我所尝试的代码如下。此代码成功提交请求并获得Html响应。 foreach (string fy in lstFY)
{
foreach (string st in lstState)
{
HtmlHandler b = new HtmlHandler();
b.Get(gWebTgtName);
b.FormElements["ctl00$ContentPlaceHolder$ddlFundingYear"] = fy;
b.FormElements["ctl00$ContentPlaceHolder$ddlState"] = st;
//set reporting format (XML) radiobutton
b.FormElements["ctl00$ContentPlaceHolder$rblReportFormat"] = "xml";
//set "select data points" ckbx
b.FormElements["ctl00$ContentPlaceHolder$cbSelectDatapoints"] = "on";
//set "select All Data Points" ckbx
b.FormElements["ctl00$ContentPlaceHolder$cbAll"] = "on";
//set "submit button"
b.FormElements["ctl00$ContentPlaceHolder$bSearch"] = "Build Data File!";
//SUBMIT (build data file)
string resp3 = b.Post(gWebTgtName);
//RESPONSE
//save XMLfile
//process XMLfile
}
}
public string Post(string url)
{
_isPost = true;
CreateWebRequestObject().Load(url, "POST");
return _htmlDoc.DocumentNode.InnerHtml;
}
private HtmlWeb CreateWebRequestObject()
{
HtmlWeb web = new HtmlWeb();
web.UseCookies = true;
web.PreRequest = new HtmlWeb.PreRequestHandler(OnPreRequest);
web.PostResponse = new HtmlWeb.PostResponseHandler(OnAfterResponse);
web.PreHandleDocument = new HtmlWeb.PreHandleDocumentHandler(OnPreHandleDocument);
return web;
}
protected bool OnPreRequest(HttpWebRequest rqst)
{
AddCookiesTo(rqst); // Add cookies that were saved from previous requests
if (_isPost) AddPostDataTo(rqst); // We only need to add post data on a POST request
return true;
}
protected void OnAfterResponse(HttpWebRequest rqst, HttpWebResponse resp)
{
SaveCookiesFrom(resp); // Save cookies for subsequent requests
GetDownload(DRTCollector.gWebTgtName);
string sWebPage = string.Empty;
// get correct charset and encoding from the server's header
string sCharset = resp.CharacterSet;
Encoding encoding = Encoding.GetEncoding(sCharset);
// read response
using (StreamReader sr = new StreamReader(resp.GetResponseStream(), encoding))
{
sWebPage = sr.ReadToEnd();
// Close and clean up the StreamReader
sr.Close();
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(sWebPage);
}
}
private void AddCookiesTo(HttpWebRequest rqst)
{
if (Cookies != null && Cookies.Count > 0)
{
rqst.CookieContainer.Add(Cookies);
}
}
private void AddPostDataTo(HttpWebRequest rqst)
{
string payload = FormElements.AssemblePostPayload();
byte[] buff = Encoding.UTF8.GetBytes(payload.ToCharArray());
rqst.ContentLength = buff.Length;
rqst.ContentType = "application/x-www-form-urlencoded";
rqst.Accept = "image/png,image/*;q=0.8,*/*;q=0.5";
//rqst.ContentType = "application/xml";
//rqst.Accept = "application/xml";
System.IO.Stream reqStream = rqst.GetRequestStream();
reqStream.Write(buff, 0, buff.Length);
}
没有任何代码来更好地描述您正在做的事情,我建议您尝试使用Selenium或其他Web UI测试工具来生成测试代码并检查其功能。使用一些Fiddler会话数据,应该能够重新处理。Selenium很不错,因为它可以用多种语言生成测试代码,包括c#(而且它是免费的)。HTH