如何抓取网页数据(一下抓取别人网站数据的方式有什么作用?如何抓取)

优采云 发布时间: 2021-12-08 20:15

  如何抓取网页数据(一下抓取别人网站数据的方式有什么作用?如何抓取)

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

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

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

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

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

  让我们切入主题:

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

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

  公共字符串 GetResponseString(string url){

  字符串_StrResponse =“”;

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

  _WebRequest.UserAgent = "MOZILLA/4.0 (COMPATIBLE; 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信息,提交给下一页发布数据使用

  参考代码如下:

  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);//将你关心的内容保存到数据库中

  }catch(异常前){

  Console.WriteLine(ex.Message);

  }

  }

  第三种方法:第三种方法最麻烦也最恶心。这种页面在翻页时没有任何地方可以找到页码信息。这个方法费了不少功夫。后来采用了更狠的方法,用代码模拟手动翻页。这种方法应该能够处理任何形式的翻页数据。原理是用代码模拟手动点击翻页链接,并用代码逐页翻页。然后逐页抓取。

  所谓门外汉看热闹,高手看门道,可能很多人看到这里就说可以通过Webbrowser的控制来实现,是的,我下面的方式就是利用WebBrowser的控制来实现实现,其实在.net下应该也有这种类似的类,不过我没研究过,希望有人有其他方法可以回复我,分享给大家。

  WebBroser控件在自己的程序中嵌入了浏览器,就像IE、Firefox等一样,你也可以用它来开发自己的浏览器。至于用它开发的浏览器的效果,我觉得肯定不如IE和Firefox。哈哈

  我们还是八卦一下,切入主题:

  基本上,你可以使用WebBroser控件来实现IE中任何操作网页的功能,当然点击翻页按钮也是可以的。既然您可以手动点击WebBroser中的翻页按钮,自然我们也可以使用程序代码来指示WebBroser自动为我们翻页。

  其实原理很简单,主要分为以下几个步骤:

  第一步,打开你要爬取的页面,比如:

  调用webBrowser控件Navigate("")的方法;

  此时,您应该在您的WebBrowser 控件中看到您的网页信息,这与在IE 中看到的相同;

  第二步,WebBrowser控件的这个事件DocumentCompleted很重要。当您访问的所有页面都加载完毕时,将触发此事件。所以分析页面元素的过程也需要在这个事件中完成

  字符串 _ResponseStr=this.WebBrowser1.Document.Body.OuterHtml;

  这段代码可以获取当前打开页面的html元素的内容。

  既然已经获取到了当前打开页面的html元素的内容,接下来的工作自然就是解析这个大字符串,得到自己关心的内容,以及解析字符串的过程。你应该可以自己写。

  第三步,重点在这第三步,因为要翻页,按照第二步,解析字符串后,或者在DocumentCompleted事件中,调用方法

  WebBrowser1.Document.GetElementById("页码id").InvokeMember("点击");

  从代码的方法名大家应该就可以理解了,那么调用这个方法后,WebBrwoser控件中的网页就实现了翻页,和手动点击翻页按钮的效果是一样的。

  重点是翻页后会触发DocumentCompleted事件,所以第二步和第三步都在循环中,所以大家需要注意跳出循环的时机。

  它实用的WebBrowser还可以做很多事情,比如自动登录、退出论坛、保存会话、cockie,所以这个控件基本上可以实现你想要在网页上的任何操作,即使你想破解一个网站@ > 以营利为目的登录密码,当然不推荐这个。哈哈

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线