我最近写了一个网络抓取工具作为辅助项目,我构建它的方式是它使用System.Net.WebClient
的{{1}}函数来下载指定的地址html然后做一些字符串操作来拉出html中包含的所有链接,然后在它找到的所有链接上重复该过程(跳过已经被抓取的任何链接)。
它适用于大多数地址但是当我以DownloadString
作为种子启动它时,它会做一些非常奇怪的事情。而不是从www.yahoo.com
调用回来获得html标记,而是回到了一堆乱码。
我对DownloadString
功能的理解是,它基本上会回复您在网页DownloadString
上看到的内容,但事实并非如此,因为当我在view page source
上执行此操作时{1}}在浏览器中我按预期查看HTML。
非常简单地看一下我最初的想法是,看起来字符串是用不同的编码器编码的,而不是用来解码它的编码器但是我没有看到一种方法来手动设置要使用的编码通过www.yahoo.com
类下载字符串时。
这是我收到的文字的一部分:
System.Net.WebClient
所以我最初的问题是,当从‹Ä½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¶µß¿È
中提取html时,是否有人知道我做错了什么?如果是这样,还有另一种方法我应该拉动HTML吗?我的下一个问题是,如果这是设计,那么他们是如何实现这一目标的呢?他们为什么要争先恐后呢?他们是否试图阻止竞争对手抓取他们的网站?
答案 0 :(得分:2)
似乎雅虎特别关注用户代理。您可以指定此选项以获取相应的纯文本响应:
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