百度网页关键字抓取(以记录几个问题(嘿嘿,没什么技术含量)(图))

优采云 发布时间: 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;

}

  一般都能解决。如果还是有问题,就像我的一样,那就定义一个变量来判断变量的值。. . 嘿嘿

  至此,实战中的这两个问题已经全部解决,并且成功捕获到了想要的数据。. .

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线