excelvba抓取网页数据(一下就是关于抓取别人网站数据的抓取问题和方法)

优采云 发布时间: 2022-01-13 10:07

  excelvba抓取网页数据(一下就是关于抓取别人网站数据的抓取问题和方法)

  我相信所有个人 网站 网站管理员都有捕获他人数据的经验。目前,获取他人网站数据的方式只有两种:

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

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

  起初,我也尝试使用第三方工具来获取我需要的数据。因为网上流行的第三方工具要么不符合我的要求,要么太复杂,一时不明白怎么用,就干脆决定自己写了。嗯,现在基本上半天就能搞定一个网站(只是程序开发时间,不包括数据采集时间)。

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

  让我们切入正题:

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

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

  公共字符串 GetResponseString(字符串 url)

  {

  字符串 _StrResponse = "";

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

  _WebRequest.UserAgent = "MOZILLA/4.0(兼容;MSIE 7.0;WINDOWS NT 5.2;.NET CLR 1.1.4322;.NET CLR 2.0.50727;.NET CLR 3.0.04506.648;.NET CLR 3.5.21022;. NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";

  _WebRequest.Method = "GET";

  WebResponse _WebResponse = _WebRequest.GetResponse();

  StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));

  _StrResponse = _ResponseStream.ReadToEnd();

  _WebResponse.Close();

  _ResponseStream.Close();

  返回_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信息,提交给下一页post数据用法

  参考代码如下:

  for (int i = 0; i < 1000; i++)

  {

  System.Net.WebClient WebClientObj = new System.Net.WebClient();

  System.采集s.Specialized.NameValue采集 PostVars = new System.采集s.Specialized.NameValue采集();

  PostVars.Add("__VIEWSTATE", "这里是需要提前获取的信息");

  PostVars.Add("__EVENTVALIDATION", "这里是您需要提前获取的信息");

  PostVars.Add("__EVENTTARGET", "这里是__dopostback方法对应的参数");

  PostVars.Add("__EVENTARGUMENT", "这里是__dopostback方法对应的参数");

  WebClientObj.Headers.Add("ContentType", "application/x-www-form-urlencoded");

  尝试

  {

  byte[] byte1 = WebClientObj.UploadValues("", "POST", PostVars);

  string ResponseStr = Encoding.UTF8.GetString(byte1);//获取当前页面对应的html文本字符串

  GetPostValue(ResponseStr);//获取上面需要的信息,比如当前页面对应的__VIEWSTATE,用于抓取下一页

  SaveMessage(ResponseStr);//将你关心的内容保存到数据库中

  }

  捕捉(例外前)

  {

  Console.WriteLine(ex.Message);

  }

  }

  第三种方法是最麻烦最恶心的。在这种页面中,您在翻页过程中的任何地方都找不到页码信息。这个方法花了我很多功夫。方法是使用代码来模拟手动翻页。该方法应该能够处理任何形式的翻页数据。原理是用代码模拟手动点击翻页链接,用代码逐页翻页,然后逐页翻页。爬行。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线