我已经查看过SO建议的链接,但似乎没有相关内容,所以这里就是..
(以下实际的url和header数据已被混淆)
我非常感谢帮助自动从https网页下载数据,使用Delphi和(最好)Twebbrowser,因为我没有在Indy上取得很大成功。
在Firefox中,我导航到显示一些数据的网址:https://www.thedomain.com/folder1/Showdata.aspx?code=111,在那里我可以点击将数据下载为csv的图片。
我正在尝试使用Delphi中的Twebbrowser自动执行该过程,方法是导航到URL然后单击该图像,或者以编程方式调用与图像相同的功能。
网页显示带有锚文本的图像......
<a class="button dlCSV" href="javascript:void(0);" onclick="MyLib.DownloadCsv();return false;">Download</a>
看起来点击此按钮会导致POST
https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx
实际进行下载的(有一堆标题)。
我首先尝试使用TWebbrowser导航到
https://www.thedomain.com/folder1/Showdata.aspx?code=111
然后在Twebbrowser窗口中手动单击该按钮。 这下载了一个名为Sendcsv.ashx的空文件。
然后我尝试使用此处的代码以编程方式单击图像: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_27493399.html。 这似乎没有做任何事情。它找到了图像并调用了它的click方法,但没有下载任何内容,也没有显示错误信息。
任何人都可以帮我处理使用Delphi下载此数据所需的代码吗?
可能有用的其他信息。
使用Firefox中调试器中的网络选项卡,我设法发现单击图像会导致POST https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx
并且有大量标题如下所示。 但是,我不知道如何编写将这些标题发送到Sendcsv.ashx的代码(如果这是我需要做的!)。
回复标题
请求标题
从上传流中请求标头
答案 0 :(得分:1)
最近,对于这种情况,我一直在使用通过导入MSXML2_TLB.pas
类型库获得的Microsoft XML
单元。
它有一个类XMLHTTP
,它与XmlHttpRequest
完全相同,就像你可能从网络开发中认识到的那样。
uses SysUtils, ActiveX, AxCtrls, MSXML2_TLB;
//be sure to call CoInitialize(nil); on application or thread startup
//procedure ...
var
reqData:string;
req:XMLHTTP;
str:TOleStream;
f:TFileStream;
begin
//Did you catch the request data? load/set/build it here:
//reqData:=
req:=CoXMLHTTP.Create;
req.open('POST','https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx',false,'','');
req.setRequestHeader('Host','www.thedomain.com');
// try first without this one: it may not be required:
//req.setRequestHeader('Referer','https://www.thedomain.com/folder1/Showdata.aspx?code=111');
// same here, may not affect response
//req.setRequestHeader('Cookie','rememberme=True');
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
req.setRequestHeader('Content-Length',IntToStr(Length(reqData)));
req.send(reqData);
if req.status=200 then
begin
str:=TOleStream.Create(IUnknown(req.responseStream) as IStream);
try
f:=TFileStream.Create('thedata.csv',fmCreate);//or TMemoryStream?
try
f.CopyFrom(str,str.Size);
finally
f.Free;
end;
finally
str.Free;
end;
end
else
raise Exception.Create('CSV request failed: '+req.statusText);//parse req.responseText?
end;