【问题标题】:C# winforms webbrowser not going to url's asked forC# winforms webbrowser 不会请求 url
【发布时间】: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?虽然他们似乎并没有特别禁止抓取,但他们确实有“过度带宽”的规定,他们对您使用获得的数据的方式非常严格,并且有一个条款规定他们可以终止任何帐户出于任何原因,由他们自行决定。
  • 嗨罗伯特,我没有做任何不妥的事情。我正在做的事情可以手动完成,通过单击链接,然后获取所需的数据,然后转到下一个链接东相同。所以,我只是想通过代码来实现这一点,以加快进程。我没有他们的帐户。他们确实有一个会员部分,付费订阅将允许您以溢价获取数据。我想获取的数据不属于优质数据。

标签: c# winforms


【解决方案1】:

您是否尝试过 Navigate(...) 方法?理论上,Navigate 和 Url 的行为是相同的,但我可以推断它们的行为有点不同。

http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.navigate(v=vs.110).aspx

【讨论】:

  • 嗨卢卡斯,感谢您的回复。我确实尝试了导航方法,结果完全一样。
  • 几乎可以肯定页面中有某种自动导航破坏了 Javascript 代码。你有没有考虑过这种可能性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2019-02-21
  • 2010-10-23
相关资源
最近更新 更多