【发布时间】:2015-01-20 01:57:36
【问题描述】:
一位朋友要求我开发一个能够提取数据的 winform 应用程序。我想这很容易——我错了!
在我的 winform 中,我包含了一个 webbrowser 控件和一些按钮。网络浏览器的 URL 是 @987654321@,您可以想象,它是为灰狗获取数据的地方。在上面的页面上,该区域内有许多特定于比赛时间的链接。如果您单击其中任何一个,它会将您带到那场比赛,以及我需要提取的数据。所以,我最初的想法是从上面的链接中获取所有链接,然后将它们存储在一个列表中,然后只需一个按钮即可获取任何链接,然后将网络浏览器带到该位置。在那里,我可以提取数据并根据需要进行存储。
所以,首先,我使用
//url = link above
wb1.Url = new Uri(url);
获取数据(即当天每场比赛的链接)
一旦我有了这个,使用另一个按钮去特定的比赛
wb1.Url = new Uri("http://www.racingpost.com/greyhounds/card.sd#resultday=2015-01-17&raceid=1344640");
然后,在那里,单击另一个按钮以捕获数据,然后返回上面的原始链接。
问题是,它不会转到链接中存在的位置。但是,如果我在网络浏览器中手动单击链接,它就没有问题。
我查看了网络浏览器的属性,所有这些看起来都很好 - 尽管我无法确定这一点!
我知道如果我尝试手动访问链接,我可以,但如果我尝试通过代码进行操作,它就不会让步。我只能假设我在代码中做错了什么。
希望其中一些有意义 - 第一次发布,如果我把它弄得一团糟,请道歉。我将提供所有代码没问题,但似乎无法弄清楚如何以“代码格式”发布代码?
//这里是代码
public partial class Form1 : Form
{
Uri _url;
public Form1()
{
InitializeComponent();
wb1.Url = new Uri("http://www.racingpost.com/greyhounds/card.sd");
wb1.Navigated +=new WebBrowserNavigatedEventHandler(wb1_Navigated);
}
classmodules.trackUrl tu;
private void btnGrabData_Click(object sender, EventArgs e)
{
classmodules.utility u = new classmodules.utility();
rtb1.Text = u.GetWebData("http://www.racingpost.com/greyhounds/card.sd");
HtmlDocument doc = wb1.Document;
string innerText = (((mshtml.HTMLDocument)(doc.DomDocument)).documentElement).outerHTML;
innerText = Regex.Replace(innerText, @"\r\n?|\n", "");
rtb1.Text = innerText;
tu = new classmodules.trackUrl();
u.splitOLs(ref tu, innerText);
classmodules.StaticUtils su = new classmodules.StaticUtils();
su.SerializeObject(tu, typeof(classmodules.trackUrl)).Save(@"d:\dogsUTL.xml");
classmodules.ExcelProcessor xl = new classmodules.ExcelProcessor();
xl.createExcel(tu);
}
private void wb1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb1 = sender as WebBrowser;
this.Text = wb1.Url.ToString();
}
void wb1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
_url = e.Url;
}
private void btnGoBack_Click(object sender, EventArgs e)
{
goBack();
}
private void goBack()
{
wb1.Url = new Uri("http://www.racingpost.com/greyhounds/card.sd");
}
private void btnGetRaceData_Click(object sender, EventArgs e)
{
HtmlDocument doc = wb1.Document;
string innerText = (((mshtml.HTMLDocument)(doc.DomDocument)).documentElement).outerHTML;
rtb2.Text = innerText;
}
//###############################
//好的,这里是我想要获取 URL 并单击按钮 // 以指示网络浏览器转到该位置的点。我将一个初始 //counter 添加到 0,然后从列表中获取第一个 url,增加 //counter,然后当我再次单击按钮时,urlNo 将是 1,然后它//尝试第二个 url
int urlNo = 0;
private void btnUseData_Click(object sender, EventArgs e)
{
if (tu.race.Count > urlNo)
{
string url = tu.race[urlNo].url;
wb1.Url = new Uri(url);
lblUrl.Text = url;
urlNo++;
}
else
{
lblUrl.Text = "No More";
}
}
【问题讨论】:
-
您是否仔细阅读了您正在抓取的网站的Terms and Conditions?虽然他们似乎并没有特别禁止抓取,但他们确实有“过度带宽”的规定,他们对您使用获得的数据的方式非常严格,并且有一个条款规定他们可以终止任何帐户出于任何原因,由他们自行决定。
-
嗨罗伯特,我没有做任何不妥的事情。我正在做的事情可以手动完成,通过单击链接,然后获取所需的数据,然后转到下一个链接东相同。所以,我只是想通过代码来实现这一点,以加快进程。我没有他们的帐户。他们确实有一个会员部分,付费订阅将允许您以溢价获取数据。我想获取的数据不属于优质数据。