【问题标题】:How to get full webpage HTML in c#?如何在 C# 中获取完整的网页 HTML?
【发布时间】:2017-06-27 00:01:40
【问题描述】:

我正在尝试制作一个网络爬虫来收集新闻文章,但是我无法获取网页的完整 html 内容。 Here is the url 我最初需要抓取的文章搜索结果:

然后,我抓取每篇文章 (example)。

我尝试使用 WebRequest、HTTPWebRequest 和 WebClient 发出请求,但是每次返回的结果仅包含侧边栏的 html 内容等。我使用了 Chrome 开发人员工具,返回的 html 紧随其后页面的主要内容,因此没有帮助。我还查找了内容的 ajax 调用,但没有找到。

我已经成功地使用 Selenium Webdriver 抓取了所需的内容,但这并不理想,因为它访问每个 url 的速度要慢得多,而且加载页面经常会挂起。任何有关请求页面完整 html 内容的帮助将不胜感激。

【问题讨论】:

  • 添加正在运行的代码会有所帮助
  • 如果您没有获得初始请求时需要抓取的 HTML,则很可能是使用 JavaScript 加载的。在这种情况下,您需要复制这些请求以获得所需的内容。
  • 您正在获取文章链接的原始 html。据我所知,如果查询参数为空,则必须发送查询参数fa-mag.com/search.php?query=u&offset=0,它不会返回任何内容。
  • 我已经发送了查询参数。网址正确
  • 你试过NSoup吗?

标签: c# html ajax selenium web-scraping


【解决方案1】:

我不确定您遇到了什么问题,但这是我完成任务的方式。

首先,我在网络浏览器中查看了该页面,并在开发人员工具中打开了网络选项卡。

从这里我收集了我的真实浏览器发送的标题列表。然后,我构造了一个附加后续标头的 HttpWebRequest,并能够检索页面的完整 html。

public string getHtml()
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.fa-mag.com/search.php?and_or=and&date_range=all&magazine=&sort=newest&method=basic&query=ubs");

    req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0";
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    req.AllowAutoRedirect = false;
    req.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5");
    req.Headers.Add("cookie", "analytics_id=595127c20cdfe6.52043028595127c20ce022.71834842; PHPSESSID=tbbo7npldsv26n2q7pg2728k77; D_IID=3E4FEA7F-9794-34EE-99F8-87EEA3DF0689; D_UID=5F374D94-270D-3653-8C54-9A46F381EAE2; D_ZID=505BB8EF-5A2D-3CBD-87D8-FABAD5014776; D_ZUID=BB0C9EF2-0E7B-383E-A03A-A3E92CC8051A; D_HID=9642D775-D860-3F04-8720-73E5339042BA; D_SID=63.138.127.22:6Ci6jv2Xv+yum3m9lNfnyRcAylne67YfnS/u8goKrxQ");
    req.Headers.Add("DNT", "1");
    req.Headers.Add("Upgrade-Insecure-Requests", "1");
    HttpWebResponse res = null;
    try
    {
        res = (HttpWebResponse)req.GetResponse();
    }
    catch (WebException webex)
    {
        res = (HttpWebResponse)webex.Response;
    }

    string html = new StreamReader(res.GetResponseStream()).ReadToEnd();
    return html;
}

如果没有自定义标头,则会在发送 416 响应并执行重定向的页面上提供机器人保护。如果您阅读重定向页面中的 html,则表明该网站已将您检测为机器人。

【讨论】:

  • 您是对的,但会话很可能会过期,您将再次被宣布为机器人。可能需要为重定向进行两次调用。
  • 我刚刚运行了同样的代码,但仍然只收到了页面的部分 html
  • 这里是我得到的html:编辑,太长无法粘贴到这里。
  • 它是从侧边栏还是右侧摩天大楼开始?这就是我在运行您的代码时开始的地方,位于主要内容部分之后
  • 此外,您的代码在会话过期几分钟后完全停止工作,正如上面提到的@FilipCordas。有什么方法可以可靠地获取完整的 html 内容而无需发送唯一的 cookie?
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 2020-02-25
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2018-04-19
相关资源
最近更新 更多