相信所有个人网站的站长都有抓取别人数据的经历吧,目前抓取别人网站数据的方式无非两种方式:
一、使用第三方工具,其中最著名的是火车头采集器,在此不做介绍。
二、自己写程序抓取,这种方式要求站长自己写程序,可能对对站长的开发能力有所要求了。
本人起初也曾试着用第三方的工具抓取我所需要的数据,由于网上的流行的第三方工具不是不符合我的要求,就是过于复杂,我一时没有搞明白怎么用,后来索性决定自己写吧,现在本人基本上半天可以搞定一个网站(只是程序开发时间,不包括数据抓取的时间)。
经过一段时间的数据抓取生涯,也曾遇到了很多困难,其中最常见的一个就是关于分页数据的抓取问题,原因在于分数据分页的形式有很多种,下面我主要针对三种形式介绍一下抓取分页数据的方法,此类文章虽然在网上见过很多,但每次拿别人的代码总也总是有各种各样的问题,下面各种方式的代码都是能正确执行,并且我目前也正在使用中的。本文中代码实现是用C#语言来实现的,我想其他语言原理大致相同。
下面切入正题:
第一种方式:URL地址中包含分页信息,这种形式是最简单的,这种形式使用第三方工具抓取也很简单,基本上不用写代码,对于我这种宁可自己花个半天时间写代码也懒得学第三方工具的人,还是通过自己写代码实现了;
这种方式就是通过循环生成数据分页的URL地址 如: 这样通过HttpWebRequest访问对应URL地址,返回对应页面的html文本,接下来的任务就是对字符串的解析,将需要的内容保存到本地数据库内;抓取的代码可参考下面:
public string GetResponseString(string url){
string _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();
return _StrResponse;
}
上面的代码可以返回对应页面的html内容的字符串,剩下的工作就是从这个字符串中获取自己关心的信息了。
第二种方式:可能是通过asp.net开发的网站常会遇到,它的分页控件通过post方式 提交分页信息到后台代码,如.net下Gridview自带的分页功能,当你点击分页的页码时,会发现URL地址没有变化,但页码变化了,页面内容也变化,仔细看会发现,把鼠标移到每个页码上的时候状态栏会显示 javascript:__dopostback("gridview","page1")等等 之类的代码,这种形式其实也不是很难,因为毕竟有地方得到页码的规律可寻。
我们知道http请求提交的方式有两种一种是get一种是Post,第一种方式是get方式,那么第二种方式就是post方式,具体提交的原理不必细说,不是本文的重点
抓取这种页面 需要注意asp.net页面的几个重要的元素
一、 __VIEWSTATE ,这个应该是.net特有的,也是让.net开发人员既爱又恨的东西,当你打开一个网站的某一个页面的时候,如果发现这个东西,而且后面还跟随着一大堆乱七八糟的字符的时候,那这个网站肯定是用asp.net写的了;
二、__dopostback方法,这个是asp.net页面自动生成一个javascript方法,包含两个参数,__EVENTTARGET,__EVENTARGUMENT,这两个参数可以参看页码对应的内容,因为点击翻页的时候,会将页码信息传给这两个参数。
三、__EVENTVALIDATION 这个也也应该是asp.net特有的东西
大家也不用 太关心这三个东西都是干什么的,只需要注意自己写代码抓取页面的时候 记得提交这三个元素就可以了。
和第一种方式一样,肯定要通过循环的方式是去拼凑_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.Collections.Specialized.NameValueCollection PostVars = new System.Collections.Specialized.NameValueCollection();
PostVars.Add("__VIEWSTATE", "此处是您需要提前得到的信息");
PostVars.Add("__EVENTVALIDATION", "此处是您需要提前得到的信息");
PostVars.Add("__EVENTTARGET", "此处是__dopostback方法对应的参数");
PostVars.Add("__EVENTARGUMENT", "此处是__dopostback方法对应的参数");
WebClientObj.Headers.Add("ContentType", "application/x-www-form-urlencoded");
try
{
byte[] byte1 = WebClientObj.UploadValues("http://www.xxxx.cn/messagelist.aspx", "POST", PostVars);
string ResponseStr = Encoding.UTF8.GetString(byte1); //得到当前页面对应的html 文本字符串
GetPostValue(ResponseStr);//得到当前页面对应的 __VIEWSTATE 等上面需要的信息,为抓取下一页面使用
SaveMessage(ResponseStr);//保存自己关心的内容到数据库中
}catch (Exception ex){
Console.WriteLine(ex.Message);
}
}
第三种方式:第三种方式是最麻烦的,也是最恶心的,这种页面 在你翻页的过程中没有任何一个地方可以找到页码信息,这种方式费了我很大的力气,后来采用了一个比较狠的办法,用代码模拟手动翻页,这种方式应该可以处理任何形式的翻页数据,原理就是,用代码模拟人工点击翻页链接,用代码一页一页的翻页,然后一页一页的抓取。
正所谓外行看热闹,内行看门道,很多人可能看到这里就会说用Webbrowser这可控件就可以实现,对,我下面的这种方式就是用WebBrowser的这个控件来实现,其实在.net下这种类似的类应该还有,但我没有去研究过,也希望如果有人有其他的方式,可以回复我,与大家一起分享。
WebBroser控件可是在自己的程序中内嵌一个浏览器,就像IE,火狐之类的一样,你也可以用他开发自己的浏览器,至于用它开发的浏览器的效果怎么样,我觉得肯定是不如IE和火狐了。呵呵
我们还是 闲言少叙,切入主题:
使用WebBroser控件基本上可以实现你在IE中操作网页的任何功能,所以点击翻页按钮当然也是可以的了,那既然可以在WebBroser中可以手动点击翻页按钮,自然我们用程序代码同样可以指使WebBroser自动替我们翻页了。
其实原理很简单,主要分以下几个步骤:
第一步,打开你想抓取的页面 比如:http://www.zxskb.com/zr/list_O.html
调用webBrowser控件的方法Navigate("http://www.zxskb.com/zr/list_O.html");
此时,你应该在你的WebBrowser控件中看到你的网页信息,和IE中看到的是一样的;
第二步 ,WebBrowser控件的这个事件DocumentCompleted 很重要,当你访问的页面全部加载完之后,会触发这个事件。所以我们分析页面元素的过程也需要在这个事件内完成
string _ResponseStr=this.WebBrowser1.Document.Body.OuterHtml;
这句代码可以得到当前打开页面的html元素的内容。
既然已经得到当前打开页面的html元素的内容了,剩下的工作自然就是解析这个大字符串,得到自己关心的内容,解析字符串的过程,大家应该自己都能写了。
第三步, 重点在这第三步呢,因为要翻页了,接第二步,解析完字符串之后,还是在DocumentCompleted事件中,调用方法
WebBrowser1.Document.GetElementById("页码的id").InvokeMember("click");
从代码的方法名种大家应该能明白了,那么调用完这个方法,之后WebBrwoser控件内的网页就实现了翻页,和你用手去点翻页按钮是一样的效果。
重点在于,翻页之后,还会触发DocumentCompleted事件,所以进入了第二步,第三步的循环了,所以大家需要注意判断跳出循环的时机。
其实用WebBrowser还能干很多事情,比如自动登录,注销某个论坛,保存session, cockie,所以 这个控件基本上可以实现你想对网页的任何操作,哪怕你是想暴利破解一个网站的登录密码,当然这个是不提倡的了。呵呵
分享到:
相关推荐
4. **页面信息抓取**:包括网页抓取、页面解析、数据校验和数据存储,确保数据的准确性和完整性。 5. **抓取统计**:提供网页统计信息、日志查看和详细统计,帮助用户监控抓取进度和效果。 6. **其他功能**:包括...
在网页开发中,数据分页显示是一项非常重要的技术,特别是在处理大量数据时,为了提高用户体验和页面加载速度,我们通常不会一次性将所有数据都显示在页面上,而是采用分页的方式,每次只加载一部分数据。...
在`PagerDemo`项目中,你可以找到一个完整的数据分页系统实例,它可能包含了上述提到的各种分页实现方式和UI交互代码。通过分析这个项目,你将能更好地理解.NET中的数据分页机制,并能将其应用到自己的项目中。
网页动态分页是一种常见的网页设计技术,用于处理大量数据的展示问题。在互联网应用中,如果一次性加载所有数据,不仅会消耗用户大量的流量,还可能导致网页加载速度变慢,用户体验下降。因此,动态分页应运而生,它...
网页分页技术是网站设计中不可或缺的一部分,尤其在处理大量数据或内容时,它能有效地组织和导航用户浏览。在“24款网页分页方法满足网站需要”这个主题中,我们将探讨各种分页实现方式及其优缺点,帮助开发者根据...
在网页开发中,数据量较大的情况下,为了提高用户体验,通常会采用分页的方式来展示数据。JSP(JavaServer Pages)是Java技术中用于创建动态网页的一种技术,它结合了HTML和Java代码,允许开发者在服务器端处理数据...
分页通常分为前端分页和后端分页两种方式。前端分页是在客户端(用户的浏览器)完成,通过JavaScript处理数据并显示相应的部分;而后端分页则在服务器端完成,服务器只返回当前页所需的数据,减轻了客户端的压力。 ...
在网页开发中,分页是一种常见的功能,它用于处理大量数据的展示,使得用户可以逐页浏览,提高用户体验。在Java环境下,实现网页分页通常会涉及到Struts框架,这是一种基于MVC(Model-View-Controller)设计模式的...
本资源"60种网页分页案例和好的实践"提供了丰富的示例,帮助我们了解并掌握如何有效地实现网页分页。以下将对其中涉及的重要知识点进行详细介绍: 1. 分页基础概念:分页是一种用户界面设计技术,用于将大量内容...
网页动态Flash抓取器,可以截取网页上的FLASH文件。
以下是关于三种数据分页方法的详细说明: 1. 基于LIMIT和OFFSET的分页: 在SQL语句中,LIMIT和OFFSET关键字常用于实现数据分页。LIMIT用于限制返回的结果数量,OFFSET则指定从哪一行开始获取数据。例如,要获取第2...
以下是关于如何使用Java+Jsoup抓取网页数据的详细讲解。 首先,你需要了解HTML的基础结构,因为Jsoup的工作原理是解析HTML文档并提供类似于DOM的API来操作这些文档。HTML是由标签组成的树形结构,每个标签都有属性...
它是Element UI的一部分,提供了一种灵活的方式来展示和操作表格数据。它支持各种自定义,如排序、筛选、分页等,非常适合用于数据展示和处理。 接下来,我们引入`file-saver`库。`file-saver`是一个轻量级的...
本文将深入探讨“再谈kettle两种循环之-调用http分页接口循环获取数据”这一主题,旨在提供对循环Job、变量运用、调用HTTP分页接口、生成连续记录以及MD5加密等知识点的详细理解和实践指导。 首先,Kettle中的循环...
本主题将深入探讨`IDataReader`分页以及SQL中的三种分页方式:基于ROW_NUMBER()的分页、基于LIMIT/OFFSET的分页(在MySQL中常见)和基于游标的分页。 首先,我们来看`IDataReader`分页。`IDataReader`是.NET ...
网页分页控件是网页开发中的一个重要组成部分,尤其在处理大量数据时,它能有效地提高用户体验,避免一次性加载过多的数据导致页面响应速度变慢。在本文中,我们将深入探讨网页分页控件的工作原理、常见类型、实现...
本篇将重点介绍在Java环境中,如何通过三种不同的方式来实现分页功能。 首先,我们来看看什么是分页。分页是将大量数据分成若干小部分,每次只显示一部分,用户可以通过翻页来查看更多的数据。在Web开发中,分页...
在IT领域,网络数据抓取是一项重要的技能,它允许我们从网页中提取所需的信息,用于数据分析、内容聚合或自动化任务。HttpClient和Jsoup是两个Java库,分别专注于HTTP通信和HTML解析,它们常被组合使用来高效地抓取...
在Windows Presentation Foundation(WPF)中,数据分页控件是一种强大的工具,它允许用户以分页方式查看大量数据,从而提高应用程序的性能和用户体验。本文将深入探讨WPF的数据分页控件及其核心概念、使用方法以及...
在IT行业中,分页缓存是一种优化大数据量查询性能的技术,尤其在Web应用程序中非常常见。它通过将数据库查询结果存储在内存缓存中,减少对数据库的直接访问,从而提高系统响应速度和用户体验。本篇文章将深入探讨...