【问题标题】:Any thoughts on why I can't scrape a site?关于为什么我不能抓取网站的任何想法?
【发布时间】:2011-01-06 08:39:51
【问题描述】:

我正在构建一个需要从合作伙伴网站抓取信息的网站。现在我的抓取代码在其他网站上效果很好,但不是这个。这是一个常规的 .html 网站。我的想法是它可能是用 php 生成的(网站是用 php 构建的)。

我不知道我只是在猜测生成的部分,我需要您的专业人士帮助。如果这很重要,那就是我使用的代码。 htmlDocument 是 htmlAgilityPack 但这与它无关。在我尝试的网站上结果为空。

        string result;
        var objRequest = System.Net.HttpWebRequest.Create(strUrl);
        var objResponse = objRequest.GetResponse();

        using (var sr = new StreamReader(objResponse.GetResponseStream()))
        {
            result = sr.ReadToEnd();
            sr.Close();

            var doc = new HtmlDocument();
            doc.LoadHtml(result);                

            foreach (var c in doc.DocumentNode.SelectNodes("//a[@href]"))
            {
                litStatus.Text += c.Attributes["href"].Value + "<br />";
            }
        }

编辑:

这是来自 w3 验证器,可能与此有关?

抱歉,我无法验证此文档,因为它在第 422 行包含一个或 更多我无法解释为 utf-8 的字节(换句话说,找到的字节无效 指定字符编码中的值)。请检查文件的内容和 字符编码指示。

错误是:utf8 "\xA9" 没有映射到 Unicode

【问题讨论】:

  • 那么,result 的值是多少?
  • @Marc:OP 声明“我尝试的网站上的结果为空”
  • 我已经尝试了大约 15 个站点,而我需要的是唯一一个 null ..
  • 可能是你解析的 HTML 不是合法的 HTML,你检查 W3C 验证器时检查结果的值是否有效?
  • result obj 是否为空,和/或 litStatus 是否为空?根据null 的不同,可能会出现不同的问题。您可以发布您尝试加载的文档的 URL 吗?

标签: asp.net screen-scraping


【解决方案1】:

我会首先查看我从 wget 之类的简单工具中得到什么响应,或者使用 http://www.fiddler2.com/fiddler2/">Fiddler 之类的工具来测试响应并检查您返回的任何标头。

有时网站会从不同的代理字符串返回不同的响应等等,因此您可能需要调整您的请求标头并伪装成不同的浏览器来获取您正在寻找的数据。如果您在运行脚本的同一台机器上使用 Fiddler,您应该能够准确地看到来自浏览器的页面请求和来自脚本的页面请求之间的不同之处。

甚至可能有一个简单的 302 重定向或类似的事情发生,而您的代码没有遵循。

如果您可以使用浏览器访问该页面,那么您肯定可以通过发送与浏览器发送完全相同的请求来访问它。

Edit- 在您自己的代码中使用 Fiddler 会有些棘手,因为它的行为类似于代理 - 它使用常规浏览器设置自己,但您必须手动告诉您的代码通过 127.0.0.1 端口 8888 上的代理运行为了让 Fiddler 看到你的结果。

【讨论】:

  • 我得到了萤火虫,但我不知道在标题中查找什么?对不起
  • 这就是 Fiddler 有用的原因,因为您想要找到您的 asp.net 脚本发出的请求和浏览器发出的请求之间的差异。每个方向的标头都会很有用 - 您可能会从您的 asp.net 代码中的请求和响应对象中找到这些。
  • 我现在让 fiddler 运行,我观看了一些视频,但我没有收到任何不同的请求,而不是我所看到的。如果你只花一分钟看看它们是不同的,我会很高兴的。你不必,但我会appriciate它。阿迪是raggarportalen.se/Kalender.html
  • 对,所以如果您使用“请求生成器”选项卡将 url 键入提琴手,您将获得该页面。然后尝试从那里的请求中删除用户代理。你会得到一个空的响应。 User-Agent 是什么无关紧要,但您必须在请求中设置 User-Agent。
【解决方案2】:

要进行故障排除,请检查 objResponse.StatusCode 和 objResponse.StatusDescription 的值:

string result;
var objRequest = System.Net.HttpWebRequest.Create(strUrl);
var objResponse = (System.Net.HttpWebResponse) objRequest.GetResponse();

Console.WriteLine(objResponse.StatusCode);
Console.WriteLine(objResponse.StatusDescription);
...

【讨论】:

  • 我无法访问 objResponse.StatusCode 和 objResponse.StatusDescription。
  • 为什么不呢?我假设您在 using 语句之前尝试过类似:Console.WriteLine(objResponse.StatusCode);。当你尝试时会发生什么?代码不能编译吗?它会在运行时崩溃吗?打印什么值?
  • objResponse 不包含那个选项,StatusCode。
  • 我明白了,我猜它是一个抽象的 WebResponse。将“var objResponse =”行更改为“var objResponse = (HttpWebResponse) objRequest.GetResponse();”
  • 没错。我从 StatusCode 和 StatusDescription 得到 OK,OK。所以我不知道出了什么问题。我发布了来自 w3 验证器的消息。你可能明白这意味着什么?
【解决方案3】:

问题似乎是第 421 行注释中的字符:

<!-- KalenderMx v1.4 � by shiba-design.de -->

在声明的字符编码iso-8859-1之外:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

在使用 htmlAgilityPack LoadHtml() 对其进行评估之前,您可以尝试通过过滤器将解析的文档字符串运行到​​ convertremove 字符串中的违规字符。

【讨论】:

  • 我的问题是在我可以用 htmlAgilityPack 做任何事情之前。当我抓取网站时,我的结果为空。我敢打赌它与评论有关,但我不知道如何解决它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2013-06-07
相关资源
最近更新 更多