关于抓取百度搜索内容
时间:2010-09-13 来源:-Enchant
在一次模拟抓取百度搜索内容的实战中,记录了该文章。。。。以记录几个问题
(嘿嘿,没什么技术含量,只是记录遇到的麻烦和思路)
在C#中,为了实现网页内容的抓取,我们一般使用 System.Net 下的一些常用类,如
HttpWebRequest、HttpWebResponse等等。。。。。
为了抓取网页内容,首先我们要根据我们的目录来分析这个网站。。。
目的:根据关键字来抓取百度搜索的前50条记录(排除推广)
抓取内容:标题、连接、显示内容
分析结果:
搜索连接 : http://www.baidu.com/s?wd=关键字&rn=pagesize
显示结果 :采用每条记录一个table来显示内容,table的 id从1开始递增。。
根据我们的目的和分析结果,我们就知道这次抓取任务很简单啦,由于我们只有抓取50条记录,那么就可以把连接
修改成 http://www.baidu.com/s?wd=关键字&rn=50 ,然后直接带上关键字访问这个连接就可以了。。
此时第一个问题出现:
中文编码:
刚开始我以为使用 UrlEncode把中文编码一下就可以了,结果发现返回的结果出现乱码,又用firebug看了下返回的编码是utf8的,于是修改我使用的编码,采用utf8,结果发现除了我的关键字其他都是正确的,晕啦,还有这种事情哇?
终于在一次无意中查看到原来正常请求都是按照gb2312来传的,所以我们的把 “关键字”改成gb2312的格式再去请求就可以了
方法一:
string keyWord = System.Web.HttpUtility.UrlEncode(_keyWord, System.Text.UnicodeEncoding.GetEncoding("GB2312")).ToUpper();
方法二:(一个朋友的方法)
public string ConvertText(string _str, string enconding) { byte[] buffer = Encoding.GetEncoding(enconding).GetBytes(_str); string tmpCity = ""; foreach (byte b in buffer) tmpCity += string.Format("%{0:X}", b); return tmpCity; }
当我们正确请求拿到html字符串的时候就可以去分析处理了,原先我采用的Httpwebrequest来请求并返回html的字符串方式,发现取里面的内容挺麻烦,尤其正则表达式写的还挺烦的呢。
此时出现第二个问题:(也不算问题啦,只能算思路)
改用WebBrowser代替Httpwebrequest来请求
由于我们知道我们要根据结果table的 id来取得里面的内容,所以我放弃了原先的请求方式,采用了webbrowser,原因很简单,webbrowser里可以直接根据id来获取对象来直接操作,嘿嘿,岂不是比我们手写正则来匹配方便?而且正则还不太好些,还真有点麻烦。。。
到此为止 这次实战存在的2个问题全部得以解决,顺利抓取到想要的数据。。。