WebClient.DownloadString 越来越乱

WebClient.DownloadString getting gibberish

我最近写了一个网络爬虫作为业余项目,我的结构是它使用 System.Net.WebClientDownloadString 函数下载指定地址 html 和然后进行一些字符串操作以拉出 html 中包含的所有链接,然后在它找到的所有链接上重复该过程(跳过任何已抓取的链接)。

它适用于大多数地址,但当我以 www.yahoo.com 作为种子启动它时,它会做一些非常奇怪的事情。不是从 DownloadString 调用返回 html 标记,而是返回一堆乱码。

我对 DownloadString 功能的理解是,它基本上会返回您在网页上 view page source 时看到的内容,但事实并非如此,因为当我在 www.yahoo.com 在浏览器中我按预期查看 HTML。

非常简短地看了一下,我最初的想法是,看起来字符串是使用与用于解码它的编码器不同的编码器编码的,但我没有看到手动设置要使用的编码的方法通过 System.Net.WebClient class 下载字符串时。

这是我收到的部分文字:

‹Ä½y“£FÖ7úÿó)4í™ûQ«Ä.è;^´ïû~ûvH€Ö ÷›€ÈL©ªì‰{­» gÉ“'OîÉ¿ÿQî•Æ‹~%cûÿùwøŸŒ¥þþEÜ¥|ÉØ’cüþEsr“Ñ—ŒbK¾KËlδâÚûãg윻2}×Ïy€S°õ3úü/w 2žB†©š.íí ³±+·7s®“9XÚQórže˜AƼŒªùëÀÝfÊ×ÿÊë€" µdÙ¾¤k_2~p¶µß¿È

所以我最初的问题是,有人知道我从 www.yahoo.com 拉 html 时是否做错了什么吗?如果是这样,还有其他方法可以拉 html 吗?我的下一个问题是,如果这是设计使然,那么他们是如何实现的?他们为什么要加扰它?他们是否试图阻止竞争对手抓取他们的网站?

看来yahoo对user agent很有讲究。您可以指定它以获得适当的纯文本响应:

    Using webRequest As WebClient = New WebClient
        webRequest.Headers(HttpRequestHeader.UserAgent) = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)"
        Dim url As String = "http://www.yahoo.com"
        Dim webPage As String = webRequest.DownloadString(url)
        Debug.WriteLine(webPage)
    End Using