【问题标题】:How to scrape dynamic website in C#? [closed]如何在 C# 中抓取动态网站? [关闭]
【发布时间】:2017-09-03 13:32:33
【问题描述】:

我正在尝试抓取https://public.rts.iebc.or.ke/enr/index.html#/Kenya_Elections_Senator/1

使用 HtmlAgilityPack。这是一个动态网站。页面加载完成后显示内容。我的代码通过this方法返回加载栏的HTML,而this方法抛出TargetInvocationException。我不知道如何让它等到页面完全加载然后刮掉它。

【问题讨论】:

  • 哦,我多么喜欢这种网站,盯着空白页看了几分钟。我以为人们会从 Flash 中学到 SEO 课程...至于问题,WebBrowser 可以工作,但它是一团糟。
  • 我也试过WebBrowser,但还是不行。
  • @MeanCoder,你到底想从那个页面上抓取什么?为了等待页面加载检查这个stackoverflow.com/questions/2777878/… 但是在加载后你还想得到事件触发动态生成的Html。

标签: javascript c# html


【解决方案1】:

HtmlAgilityPack 只是 .Net 的一个库。您提出请求,该库允许您轻松解析 HTML 响应。如果它不包含您要抓取的数据,那么您需要执行不同的请求。在您提到的页面的情况下,它使用 Ajax 来更新页面,但 Html 是从 Json 响应动态生成的。 HtmlAgilityPack 不解析 json 但 Html,这是一个问题。如果您的代码反复请求同一个 Url,那么您每次都会使用原始 Html 获得一个新页面,这也不能解决您的问题。

如果您使用的是 WebBrowser,您可以使用计时器等待。

使用 .Net 的 Selenium 驱动程序,您需要设置超时,以便它会在引发未找到异常之前继续尝试查找元素一段时间。

【讨论】:

  • 我使用过 WebBroswer,但没有找到任何此类选项。你能给我一个硒教程的链接吗?
  • 如何让浏览器等待标签出现?
  • @MeanCoder,如前所述,您可以添加一个计时器,然后在Tick 事件上尝试获取元素并禁用计时器。另一种选择是在循环中调用DoEvents() (System.Windows.Forms.Application.DoEvents())。这可能更容易,但使用 Timer 是在不中断主线程的情况下实现目标的正确方法。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2015-06-11
相关资源
最近更新 更多