有关为什么我不能刮一个网站的任何想法?

时间:2010-01-18 12:41:30

标签: asp.net screen-scraping

我正在构建一个需要从合作伙伴网站获取信息的网站。现在我的抓取代码适用于其他网站,但不是这个。这是一个常规的.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

3 个答案:

答案 0 :(得分:2)

我首先要看看我从wget或使用像http://www.fiddler2.com/fiddler2/">Fiddler这样的工具获得的响应,以测试响应并检查您要回复的任何标题

有时网站会返回不同代理字符串的不同响应等等,因此您可能需要调整请求标头并伪装成其他浏览器以获取您要查找的数据。如果您在运行脚本的同一台计算机上使用Fiddler,您应该能够确切地看到浏览器中页面请求与脚本页面请求之间的确切区别。

甚至可能有一个简单的302重定向或类似的事情,你的代码没有跟随。

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

编辑 - Fiddler在您自己的代码中使用起来有点棘手,因为它表现为代理 - 它使用常规浏览器设置自己,但您必须手动告诉您的代码在127.0.0.1端口8888上通过代理运行为了让小提琴手看到你的结果。

答案 1 :(得分:1)

要进行故障排除,请检查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);
...

答案 2 :(得分:1)

问题似乎是第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字符串中的有问题的字符。