WebClient.DownloadString 越来越乱
WebClient.DownloadString getting gibberish
我最近写了一个网络爬虫作为业余项目,我的结构是它使用 System.Net.WebClient
的 DownloadString
函数下载指定地址 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
我最近写了一个网络爬虫作为业余项目,我的结构是它使用 System.Net.WebClient
的 DownloadString
函数下载指定地址 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