网页中flash数据抓取(一下抓取别人网站数据的方式有什么作用?如何抓取)
优采云 发布时间: 2022-03-09 10:06网页中flash数据抓取(一下抓取别人网站数据的方式有什么作用?如何抓取)
我相信所有个人网站站长都有抓取别人数据的经历。目前抓取别人的网站数据只有两种方式:
一、使用第三方工具,其中最著名的是优采云采集器,这里不做介绍。
二、编写你自己的程序来捕获。这种方式需要站长自己编写程序,可能需要站长的开发能力。
起初,我也尝试使用第三方工具来获取我需要的数据。因为网上流行的第三方工具要么不符合我的要求,要么太复杂,一时间不明白怎么用,后来索性决定自己写,现在基本可以了半天搞定网站(只是程序开发时间,不包括数据采集时间)。
经过一段时间的数据抓取生涯,我遇到了很多困难。最常见的一种是分页数据的爬取。原因是数据分页的形式有很多种。下面我主要关注三种类型。以这种文章的形式介绍抓取分页数据的方法,虽然在网上看到很多,但是每次拿别人的代码总是会出现各种各样的问题。它可以正确执行,我目前正在使用它。本文的代码实现是用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);//将你关心的内容保存到数据库中
}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("click");
从代码的方法名应该可以理解,那么调用该方法后,WebBrwoser控件中的网页就会实现翻页,和手动点击翻页按钮是一样的.
关键是翻页后也会触发DocumentCompleted事件,所以进入了第二步和第三步循环,所以大家需要注意判断跳出循环的时机.
其实你可以用WebBrowser做很多事情,比如自动登录、退出论坛、保存会话和cockie,所以这个控件基本上可以在网页上做任何你想做的事情,即使你想要为了暴利破解一个网站@@的登录密码,当然不推荐这样。呵呵