网页抓取数据(第三方工具抓取别人网站数据的方式无非两种方式!)

优采云 发布时间: 2021-09-22 04:15

  网页抓取数据(第三方工具抓取别人网站数据的方式无非两种方式!)

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

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

  二、编写您自己的程序并获取它。这种方式要求站长编写自己的程序,这可能需要站长的开发能力

  起初,我试图使用第三方工具来捕获我需要的数据。因为互联网上流行的第三方工具要么不符合我的要求,要么太复杂,我一时不知道如何使用它们。后来,我决定自己写。现在我基本上可以处理一个网站(仅程序开发时间,不包括数据捕获时间)

  经过一段时间的数据采集工作,我遇到了很多困难。最常见的问题之一是获取分页数据的问题。原因是有多种形式的数据分页。接下来,我将以三种形式介绍获取分页数据的方法。虽然我在网上看到了很多这样的文章代码,但每次我使用别人的代码时,总会出现各种各样的问题。以下代码可以正确执行,我目前也在使用它们。本文的代码实现是用c语言实现的。我认为其他语言的原则大致相同

  让我们开门见山:

  第一种方式:URL地址收录分页信息。这种形式是最简单的。使用第三方工具捕获此表单也非常简单。基本上,不需要编写代码。对于像我这样宁愿花半天时间编写代码而不愿学习第三方工具的人,我仍然自己编写代码

  此方法通过循环生成数据页的URL地址。例如,通过Httpwebrequest访问相应的URL地址,并返回相应页面的HTML文本。下一个任务是解析字符串并将所需内容保存到本地数据库;有关捕获的代码,请参阅以下内容:

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

  字符串_StrResponse=“”

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

  _WebRequest.UserAgent=“MOZILLA/4.0(兼容;MSIE7.0;WINDOWS NT5.2.NET CLR1.1.4322.NET CLR2.0.50727.NET CLR3.0.0450 6.648.NET CLR@k305.21022.NET CLR3.0.450 6.2152.NET CLR@k305.30729)",

  _WebRequest.Method=“GET”

  WebResponse _WebResponse=_WebRequest.GetResponse()

  StreamReader _ResponseStream=新的StreamReader(_WebResponse.GetResponseStream(),System.Text.Encoding.GetEncoding(“gb2312”)

  _StrResponse=_ResponseStream.ReadToEnd()

  _WebResponse.Close()

  _ResponseStream.Close()

  返回响应

  }

  上面的代码可以返回与页面的HTML内容相对应的字符串。其余的是从该字符串中获取您关心的信息

  第二种方式:可能是开发过程中经常遇到的,它的分页控件通过post将分页信息提交给后台代码,比如.Net下的GridView的分页功能,当你点击分页的页码时,你会发现URL地址没有变,但是页码变了而且页面内容也发生了变化。如果你仔细观察,你会发现当你将鼠标移动到每个页码上时,状态栏会显示javascript:_dopostback(“GridView”,“page1”)和其他代码。事实上,这种形式并不很难,因为毕竟,有一个地方可以找到页码的规律

  我们知道提交HTTP请求有两种方式,一种是get,另一种是post。第一种是get,第二种是post。具体的提交原则不需要详细解释,这不是本文的重点

  要获取此类页面,您需要注意页面的几个重要元素

  一、_viewstate应该是.Net独有的,也是.Net开发人员喜欢和讨厌的东西。当你打开一个网站页面时,如果你发现这个东西后面有很多乱七八糟的字符,那么这个网站一定是用英语写的

  二、__dopostback方法。这是从页面自动生成的JavaScript方法,其中收录两个参数_eventtarget和_eventargument。这两个参数可以引用与页码对应的内容,因为当您单击翻页时,页码信息将传输到这两个参数

  三、__EVENTVALIDATION这也应该是独一无二的

  你不必太在意这三件事是做什么的,你只需要在编写代码获取页面时注意提交这三个元素

  与第一种方法一样,_doPostBack的两个参数必须以循环方式拼合在一起。只有收录页码信息的参数才需要拼合在一起。这里需要注意的一点是,每次通过post提交下一页的请求时,您应该首先获得_viewstateinformation和_eVentValidation当前页面的信息,因此分页数据更准确。第一种方法可用于获取第一页的页面内容,然后同时取出相应的u viewstate信息和_eventvalidation信息,然后循环下一页,然后记录_viewstate信息和_eventvali抓取每页后采集信息,以便为下一页文章提交数据

  参考代码如下:

  对于(int i=0;i

  System.Net.WebClient-WebClientObj=新系统.Net.WebClient()

  System.采集s.Specialized.NameValue采集 PostVars=新的System.采集s.Specialized.NameValue采集()

  添加(“\u viewstate”,“这是您需要提前获取的信息”)

  添加(“\u eventvalidation”,“这是您需要提前获取的信息”)

  Add(“\u eventtarget”,“这里是与\u dopostback方法相对应的参数”)

  Add(“\u eventargument”,“这里是与\u dopostback方法相对应的参数”)

  添加(“ContentType”,“application/x-www-form-urlencoded”)

  试一试

  {

  byte[]byte1=WebClientObj.UploadValues(“,“POST”,PostVars)

  字符串responsest=编码。UTF8.GetString(byte1);//获取当前页面对应的HTML文本字符串

  Getpostvalue(responsest);//获取所需信息,例如与当前页面对应的_viewstate,以便抓取下一页

  Savemessage(responsest);//将您关心的内容保存到数据库中

  }捕获(例外情况除外){

  控制台写入线(例如消息)

  }

  }

  第三种方法:第三种方法是最麻烦、最恶心的。翻页的过程中找不到页面信息。这种方法需要很多努力。后来,我采用了一种更残酷的方法,用代码模拟手动翻页。这种方法应该能够处理任何形式的翻页数据a、 其原理是,使用代码模拟手动单击翻页链接,使用代码逐页翻页,然后逐页抓取

  这就是所谓的门外汉看热闹,专家看门口。很多人可能会在这里看到,并说它可以通过使用WebBrowser控件来实现。是的,我下面的方法是使用WebBrowser控件来实现它。事实上,.Net下应该有类似的类,但我还没有研究过。我也希望如果有人有其他的方法,他们可以回复我,和你一起分享

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

  让我们少说,切入主题:

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

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

  第一步是打开要捕获的页面,例如:

  调用WebBrowser控件的方法navigate(“”)

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

  其次,WebBrowser控件的事件documentcompleted非常重要。当您访问的所有页面都加载时,将触发此事件。因此,在此事件中还需要完成分析页面元素的过程

  字符串_responsest=这个。WebBrowser1.Document.Body.OuterHtml

  此代码可以获取当前打开页面的HTML元素的内容

  现在您已经获得了当前打开页面的HTML元素的内容,接下来的工作自然是解析大字符串,获取您关心的内容,以及解析字符串的过程。您应该能够自己编写它

  第三步

  重点是第三步,因为我们必须翻过这一页并采取第二步

  在DocumentCompleted事件中

  WebBrowser1.Document.Getelementbyid(“页码的ID”).Invokemember(“单击”)

  您应该能够理解代码的方法名称。调用此方法后,WebBrowser控件中的网页将实现翻页,这与用手单击翻页按钮的效果相同

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线