百度网页关键字抓取(以记录几个问题(嘿嘿,没什么技术含量)(图))
优采云 发布时间: 2021-10-18 02:01百度网页关键字抓取(以记录几个问题(嘿嘿,没什么技术含量)(图))
这个文章是在模拟抓取百度搜索内容时录制的。. . . 记录几个问题
(嘿嘿,没有技术含量,只记录遇到的麻烦和想法)
在C#中,为了实现网页内容的爬取,我们一般都会用到System.Net下的一些常用类,比如
HttpWebRequest、HttpWebResponse 等。. . .
为了抓取网页内容,我们首先要根据我们的目录来分析这个网站。. .
目的:根据关键词抓取百度搜索的前50条记录(不含促销)。抓取内容:标题、链接、显示内容
分析结果:
搜索链接:关键字 &rn=pagesize
显示结果:每条记录用一张表来显示内容,表的id从1开始增加。。
根据我们的目的和分析结果,我们知道这个抓取任务很简单,因为我们只抓取了50条记录,那么我们就可以连接了
修改为关键字&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 来请求
既然知道需要根据结果表的id来获取内容,我就放弃了原来的请求方式,采用了webbrowser。原因很简单。在webbrowser中可以直接根据id获取对象进行直接操作。嘿,不是吗?比我们手写的常规更容易匹配吗?而且正规的没那么好,真的有点麻烦。. .
使用webbrowser时遇到的问题是DocumentCompleted事件会被多次调用
解决方案:
判断 ReadyState == WebBrowserReadyState.Complete
if (myBrowser.ReadyState != WebBrowserReadyState.Complete)
{
return;
}
一般都能解决。如果还是有问题,就像我的一样,那就定义一个变量来判断变量的值。. . 嘿嘿
至此,实战中的这两个问题已经全部解决,并且成功捕获到了想要的数据。. .