网站内容抓取(一下中代码实现是用C#语言来实现的抓取问题)

优采云 发布时间: 2021-08-31 00:04

  网站内容抓取(一下中代码实现是用C#语言来实现的抓取问题)

  我相信所有个人网站站长都有抓取他人数据的经验。目前抓取他人网站数据的方式有两种:

  一、使用第三方工具,其中最著名的是优采云采集器,这里不再介绍。

  二、自己写程序抓包,这种方法需要站长自己写程序,可能需要站长的开发能力。

  一开始,我尝试使用第三方工具来抓取我需要的数据。因为网上流行的第三方工具要么不符合我的要求,要么太复杂,一时不知道怎么用,后来干脆决定自己写。现在基本上半天就可以搞定网站(仅程序开发时间,不包括数据抓取时间)。

  经过一段时间的数据爬取生涯,遇到了很多困难。最常见的一种是抓取分页数据。原因是数据分页的形式很多。下面我将主要围绕三种形式介绍抓取分页数据的方法。虽然我在网上看到很多这样的文章,但每次拿别人的代码时总会出现各种问题。以下代码可以以多种方式使用。正确执行,我目前正在使用。本文的代码实现是用C#语言实现的,我觉得其他语言的原理大致相同

  以下切入正题:

  第一种方法:URL地址收录分页信息。这种形式是最简单的。这个表单也很简单,使用第三方工具爬取。基本上不需要写代码。对我来说,我宁愿自己花半天时间写代码,懒得学第三方工具的,都是自己写代码实现的;

  该方法是通过循环生成数据页面的URL地址,如: 这样通过HttpWebRequest访问对应的URL地址,返回对应页面的html文本。接下来的任务是解析字符串并将需要的内容保存到本地的数据库中;爬取代码可以参考如下:

  publicstringGetResponseString(stringurl)

  {

  string_StrResponse="";

  HttpWebRequest_WebRequest=(HttpWebRequest)WebRequest.Create(url);

  _WebRequest.UserAgent="MOZILLA/4.0(COMPATIBLE;MSIE7.0;WINDOWSNT5.2;.NETCLR1.1.4322;.NETCLR2.0.50727;. NETCLR3.0.04506.648;.NETCLR3.5.21022;.NETCLR3.0.4506.2152;.NETCLR3.5.30729)" ;

  _WebRequest.Method="GET";

  WebResponse_WebResponse=_WebRequest.GetResponse();

  StreamReader_ResponseStream=newStreamReader(_WebResponse.GetResponseStream(),System.Text.Encoding.GetEncoding("gb2312"));

  _StrResponse=_ResponseStream.ReadToEnd();

  _WebResponse.Close();

  _ResponseStream.Close();

  return_StrResponse;

  }

  上面的代码可以返回页面html内容对应的字符串,剩下的工作就是从这个字符串中获取你关心的信息。

  第二种方式:可能是通过网站常会的开发遇到的。它的分页控件通过post方式向后台代码提交分页信息,比如.net下Gridview的分页功能,当你点击页面的页码时,你会发现URL地址并没有改变,而是页码变了,页面内容也变了。仔细看会发现,当你将鼠标移到每个页码上时,状态栏会显示 javascript:__dopostback("gridview","page1".) 等等。这种形式的代码其实也不是很难,因为毕竟找页码的规则是有地方的。

  我们知道提交HTTP请求有两种方式。一个是get,一个是post,第一个是get,第二个是post。具体投稿原则不用细说,不是文章。专注

  获取这种页面需要注意页面的几个重要元素

  一、__VIEWSTATE,这应该是.net独有的,也是.net开发者又爱又恨的东西。当你打开一个网站的页面时,如果你发现了这个东西,后来还是有很多乱七八糟的字符的时候,那么这个网站一定要写;

  二、__dopostback 方法,这是一个自动生成页面的javascript方法,包括两个参数,__EVENTTARGET,__EVENTARGUMENT,这两个参数可以参考页码对应的内容,因为点击翻页的时候,会传输页码信息给这两个参数。

  三、__EVENTVALIDATION 这也应该是唯一的

  你不用太在意这三件事是干什么的,自己写代码抓取页面的时候记得提交这三个元素即可。

  和第一种方法一样,必须循环拼凑_dopostback的两个参数,只有收录页码信息的参数。这里需要注意的一点是,每次通过Post提交下一页的请求时,首先要获取当前页面的__VIEWSTATE信息和__EVENTVALIDATION信息,这样就可以通过第一种方式获取到分页数据的第一页页码内容 然后,同时取出对应的__VIEWSTATE信息和__EVENTVALIDATION信息,然后做一个循环处理下一页,然后每次爬到一个页面,记录__VIEWSTATE信息和__EVENTVALIDATION信息,提交给下一页发布数据使用情况

  参考代码如下:

  for(inti=0;i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线