中国银行外汇牌价抓取代码不再起作用了吗?

尔东主机 2008-12-18 03:22:15
我的代码是ASP.NET的,于2008年12月13日突然失效,不知为什么。
抓取到的html代码只有<head>部分。请高手指点!
代码如下:
string html = "";

try
{
DataSet1.WaiHuiDataTable whDT = new DataSet1.WaiHuiDataTable();
string url = "http://www.boc.cn/cn/common/whpj.html";
html = new MyResponse(url).Html;
string pattern = "<td width=\"86\" align=\"center\" valign=\"middle\" bgcolor=\"#FFFFFF\" class=\'nav\'>(.*?)</td>";
MatchCollection matches = Regex.Matches(html, pattern, RegexOptions.IgnoreCase);
string strResult;
i=matches.Count;
strResult = matches[18].Result("$1");
whDT.AddWaiHuiRow("美元", decimal.Parse(strResult) / 100, DateTime.Now);
strResult = matches[90].Result("$1");
whDT.AddWaiHuiRow("欧元", decimal.Parse(strResult) / 100, DateTime.Now);
return whDT;
}
catch (Exception ex)
{
return null;
}

问题补充:MyResponse.cs代码:
Public class MyResponse
{
...
public MyResponse(string url)
{
GetHtmlCode(url);
}

private void GetHtmlCode(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
DateTime begin = DateTime.Now;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

result = response.StatusDescription;
lastModified = response.LastModified;
characterSet = response.CharacterSet;
size = response.ContentLength;

Stream stream = response.GetResponseStream();
DateTime end = DateTime.Now;
cost = end - begin;
StreamReader streamReader = new StreamReader(stream, Encoding.Default);
html = streamReader.ReadToEnd();
stream.Close();
streamReader.Close();
}
...
}
...全文
713 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2008-12-23
  • 打赏
  • 举报
回复
换网址了,用这个网址
http://www.boc.cn/sourcedb/whpj/
而且编码不能用 Encoding.Default,要与网站的一致,用Encoding.UTF8


private string GetHtmlCode(string url, Encoding encoding)
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Web-Sniffer/1.0.24";
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream resStream = response.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, encoding);
string html = (sr.ReadToEnd());
resStream.Close();
sr.Close();
return html;
}
//调用
string html = GetHtmlCode("http://www.boc.cn/sourcedb/whpj/", Encoding.UTF8);
尔东主机 2008-12-22
  • 打赏
  • 举报
回复
应该是这样吧?但是返回如18楼所示错误。
 protected void Page_Load(object sender, EventArgs e)
{
string url = "http://www.boc.cn/cn/common/whpj.html";
string encodeType = "gb2312";
string err = "";
string postData2 = "";

Response.Write(WebClinetPost(url, postData2, encodeType,out err));
}

static string WebClinetPost(string url, string postData, string encodeType, out string err)
{
string uriString = url;
byte[] byteArray;
byte[] responseArray;
Encoding encoding = Encoding.GetEncoding(encodeType);
try
{
WebClient myWebClient = new WebClient();
WebHeaderCollection myWebHeaderCollection;
myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
myWebHeaderCollection = myWebClient.Headers;

byteArray = encoding.GetBytes(postData);
responseArray = myWebClient.UploadData(uriString, "POST", byteArray);
err = string.Empty;
return encoding.GetString(responseArray);
}
catch (Exception ex)
{
err = ex.Message;
return err;
}
}

尔东主机 2008-12-22
  • 打赏
  • 举报
回复
12楼中的postData2到底要怎么定义啊?
real_name 2008-12-22
  • 打赏
  • 举报
回复
帮忙顶个~~~~
qshArcc 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ccb8888 的回复:]
[/Quote]
protected void Page_Load(object sender, EventArgs e)
{
string url = "http://www.boc.cn/cn/common/whpj.html";
string encodeType = "gb2312";
string err = "";

Response.Write(WebClinetPost(url, postData2, encodeType, out err));
}
static string WebClinetPost(string url, string postData, string encodeType, out string err)
{
string uriString = url;
byte[] byteArray;
byte[] responseArray;
Encoding encoding = Encoding.GetEncoding(encodeType);
try
{
WebClient myWebClient = new WebClient();
WebHeaderCollection myWebHeaderCollection;
myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
myWebHeaderCollection = myWebClient.Headers;

byteArray = encoding.GetBytes(postData);
responseArray = myWebClient.UploadData(uriString, "POST", byteArray);
err = string.Empty;
return encoding.GetString(responseArray);
}
catch (Exception ex)
{
err = ex.Message;
return err;
}
}
尔东主机 2008-12-20
  • 打赏
  • 举报
回复
但就是不行啊,请看18楼!
mark620 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ccb8888 的回复:]
C# code
protected void Page_Load(object sender, EventArgs e)
{
string url = "http://www.boc.cn/cn/common/whpj.html";
string encodeType = "gb2312";
string err = "";

Response.Write(WebClinetPost(url, postData2, encodeType, out err));
}
static string WebClinetPost(string url, string postData, string encodeType, out s…
[/Quote]

正解。
ximi82878 2008-12-20
  • 打赏
  • 举报
回复
都是高手,帮忙顶个~~~~
尔东主机 2008-12-19
  • 打赏
  • 举报
回复
编码已经改为
StreamReader streamReader = new StreamReader(stream, Encoding.UTF8);
还是不管用!
尔东主机 2008-12-19
  • 打赏
  • 举报
回复
网址没错啊!还是 http://www.boc.cn/cn/common/whpj.html

正则表达式没错,只是采集到的HTML代码只有<HEAD>部分,没有<body>部分,看来中行做了防采集处理了。
尔东主机 2008-12-19
  • 打赏
  • 举报
回复
我跟踪输出了采集到的html的值,如下:
<html>
<head>
<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
<meta http-equiv="refresh" content="0;url=/sourcedb/whpj/">
</head>
</html>

错误信息:
DataSet1.WaiHuiDataTable whDT = GetWaiHui();
whDT.WriteXml(System.AppDomain.CurrentDomain.BaseDirectory + "WaiHui.xml");
出现错误:未将对象引用设置到对象的实例。

strResult = matches[18].Result("$1");
出现错误:指定的参数已超出有效值的范围。
参数名: i - 0(我跟踪的i=matches.Count;)

尔东主机 2008-12-19
  • 打赏
  • 举报
回复
12楼的代码可以运行了,
但是得到的结果是:


15楼的xocom:代码分享一下怎么样?帮人帮到底嘛!
gui0605 2008-12-19
  • 打赏
  • 举报
回复
LS已经说改版了......
HDNGO 2008-12-19
  • 打赏
  • 举报
回复
就怕改版~
尔东主机 2008-12-19
  • 打赏
  • 举报
回复
12楼的postData2要怎么定义啊?
尔东主机 2008-12-19
  • 打赏
  • 举报
回复
十分感谢,但是12楼的代码无法运行噢!
紫气东来_999 2008-12-19
  • 打赏
  • 举报
回复
银行网页改版了,前几天我们也改了对应代码
ccb8888 2008-12-19
  • 打赏
  • 举报
回复

protected void Page_Load(object sender, EventArgs e)
{
string url = "http://www.boc.cn/cn/common/whpj.html";
string encodeType = "gb2312";
string err = "";

Response.Write(WebClinetPost(url, postData2, encodeType, out err));
}
static string WebClinetPost(string url, string postData, string encodeType, out string err)
{
string uriString = url;
byte[] byteArray;
byte[] responseArray;
Encoding encoding = Encoding.GetEncoding(encodeType);
try
{
WebClient myWebClient = new WebClient();
WebHeaderCollection myWebHeaderCollection;
myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
myWebHeaderCollection = myWebClient.Headers;

byteArray = encoding.GetBytes(postData);
responseArray = myWebClient.UploadData(uriString, "POST", byteArray);
err = string.Empty;
return encoding.GetString(responseArray);
}
catch (Exception ex)
{
err = ex.Message;
return err;
}
}


这个抓取方法没问题,一会再发个更简洁的。。
GTX280 2008-12-18
  • 打赏
  • 举报
回复
up
zhu4139365 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tianhuo_soft 的回复:]
外汇 换网址了
[/Quote]
加载更多回复(6)

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧