制作循环以抓取谷歌下一页时的错误

时间:2013-07-06 12:24:18

标签: c# watin

我有一个简单的代码可以帮助我抓取到Google结果页的第2页:

var ie= new IE();
ie.Link(Find.ByText("2")).Click(); 

我想要的只是使用输入的页数爬到更多的下一页,这样我就像这样循环:

                string[] page = null;
                for (int i = 0; i < NumOfPage; i++)
                {
                 Array.Resize<string> (ref page, i+1);
                page[i] = "\"" + i.ToString() + "\"";
                }
               int count=2;
               while (count<NumOfPage)
                {
                     ie.Link(Find.ByText(page[count])).Click();                                                                                
                     count++;    
                }

但结果是它在第一页暂停,没有爬到下一页。似乎循环不起作用。问题在哪里???

2 个答案:

答案 0 :(得分:0)

我认为您不应该使用Click()方法转到下一页,我发现只有在Click()可见时才会执行Link,因此您必须滚动垂直滚动条到底部首先显示Link(手动滚动或以编程方式工作,如您所愿)。不过我想要转到下一页,您可以使用找到的GoTo()中的Url调用方法Link。我已经测试好了,但页面切换之间的延迟有点大(约2秒或更长)。我不知道你为什么要这样做,并想知道你的意思:

for (int i = 2; i < NumOfPage; i++)
{
   ie.GoTo(ie.Link(WatiN.Core.Find.ByText(i.ToString())).Url);//Don't need quotes at all.
}

:)

答案 1 :(得分:0)

       // Setup browser object
        var browser = new IE();
        var url = "www.google.com";
        browser.GoTo(url);

        var searchBox = browser.TextField(Find.ByName("q"));
        searchBox.Value="Rex";

        //click on the search button
        var btnSearch = browser.Button(Find.ByValue("Search"));
        btnSearch.Click();
        //wait for browser to load properly
        browser.WaitForComplete();

        // Find the navigation menu table            
        var navigationtable = browser.Table(Find.ById("nav"));

        // To go to the second page
        var secondpage = navigationtable.Link(Find.ByText("2"));
        secondpage.Click();
        //wait for browser to load properly
        browser.WaitForComplete();

这只是转到第二页 现在,如果你想循环

然后

for (int i = 2; i <= 10; i++)
{
var nextpage = navigationtable.Link(Find.ByText("i"));
//check if the link exists
/if yes then click on it
if(nextpage.Exists)
nextpage.click();
browser.waitforComplete
}