【问题标题】:Sleep the WebBrowser instance and not entire program while Scraping抓取时休眠 WebBrowser 实例而不是整个程序
【发布时间】:2017-12-12 23:09:53
【问题描述】:

我正在编写一个从网站上抓取数据的批处理程序。

这是代码:

private async void buttonInfoJobs_Click(object sender, EventArgs e)
{
    const string C_UrlTemplate= "https://www.mysite.it/{0}";

    var _searches = new List<Get_SiteSearchResult>();
    using (JobsDataContext db = new JobsDataContext())
    {
        _searches = db.Get_SiteSearch("JOBS").ToList();
        foreach (var s in _searches)
        {
            WebBrowserJobs wb1 = new WebBrowserJobs();
            Uri uri = new Uri(String.Format(C_UrlTemplate,s.SkillTech));

            wb1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowserJobs_DocumentCompleted);
            wb1.Navigating += new WebBrowserNavigatingEventHandler(webBrowserJobs_Navigating);

            wb1.Url = uri;

        }
    }
}

问题是我必须废弃的网站是在页面中实现 Javascript 并获取页面,网络浏览器重新加载的时间不同。

如果我只要求一个 Url,这非常有效,DocumentCompleted 事件被触发了六次,但最终我得到了所需的内容。

当我必须在一个循环中询问不同的 url 时,问题就来了:网站需要验证码。

我可以通过在细化过程中实现 X 秒的延迟来避免这种情况,但我不知道如何并且是:

如果我输入 System.Threading.Thread.Sleep(5000),所有的执行都将停止,但我只想延迟 webbrowser 的单个任务...

我该如何继续?

【问题讨论】:

  • 既然已经是async,为什么不await Task.Delay(1000);
  • 这对我帮助很大,但我只想延迟 WebBrowser 实例...
  • 我不明白您所说的仅延迟 WebBrowser 实例是什么意思。如果您不希望 WebBrowser 做任何事情,那么不要告诉它做任何事情,或者在告诉它做某事之前等待。

标签: c# .net web-scraping


【解决方案1】:

我可能还回答了你关于 WebScraper 的最后一个问题,所以我会再次帮助你;)

你已经在函数定义中有async关键字,所以你可以直接使用下面的代码:

await Task.Delay(5000);

【讨论】:

  • 嗨,西蒙,是的,是我 ;-) 我尝试了你的解决方案,然后告诉你!
  • 这对我帮助很大,但我只想延迟 WebBrowser 实例...
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多