现在采集程序最最常用到的就是火车头了,只要你会编写采集规则就能将网站上的数据抓下来居为已有。
不过做为一个开发者,这样做起来也也感觉不爽。不能一次性解决需求。
现在写一个简单的采集程序。
由于WEB的开发语言很多,不同的语言做出的网站在采集规则的写法上也有不同。
比如一般的分页就不会存在大的问题,多数还是以GET为主,如果碰到用.net开发的网站,在分页时会发现分页的连接上为javascript:__doPostBack('','');这种方式的,这个是以POST方式来实现分页的。
今天先说一下简单的分页采集(以get方式获取),其它方式后续再写出来
其实web的采集就是要模仿出一个浏览器出来去访问http服务器,将获取到的html代码解析出来。
在C#中有多个方法来实现HTML的request,可以使用WebClient,httpwebrequest还可以使用webbrowser;
这里只说使用httpwebrequest的实现。
这里在采集上还要有一个技巧,有些网站的URL规则可能根本就不需求你先来采集分页的页面就能直接采集你想要的内容。如很多个网站都是采用ID来显示最后的路径,例:http://www.aaaa.com/a/show.php?id=111111
这样的采集就是直接访问URL就是,总之一句话,只有先取到了想要采集的页面URL才能取到想要的东西(相当的废话。。。)
不多说,先来代码
public abstract class WebControler
{
#region ConstString
protected string sUserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
protected string sContentType = "application/x-www-form-urlencoded";
protected string sRequestEncoding = "utf-8";
protected string sResponseEncoding = "utf-8";
protected CookieContainer _cookieContainer = null;
#endregion
/// <summary>
/// 了类中去继承,根据不同网站的验证方式实现登陆验证
/// 以获取用户唯一标识的cookie
/// </summary>
protected virtual void CheckLogin()
{
_cookieContainer = new CookieContainer();
}
/// <summary>
/// 读取访问URL所返回的HTML字符串
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetHtmlFromUrl(string url)
{
CheckLogin() ;
WebRequest request = WebRequest.Create(url);
HttpWebRequest httpRequest = request as HttpWebRequest;
if (httpRequest == null)
{
throw new ApplicationException(
string.Format("Invalid url string: {0}", url)
);
}
//有些网站加入了限制,只有先从首页或验证页面访问才能访问,一般都记录到cookie中
//这里就是将验证后的cookie容器赋给采集的client
httpRequest.CookieContainer = _cookieContainer;
httpRequest.UserAgent = sUserAgent;
httpRequest.Accept = "*/*";
httpRequest.Headers.Add("Accept-Language", "zh-cn");
httpRequest.KeepAlive = true;
httpRequest.Timeout = 10000;
httpRequest.Method = "GET";
HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse();
string sResponse = string.Empty;
if (response.StatusCode == HttpStatusCode.OK)
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
{
sResponse = reader.ReadToEnd();
reader.Close();
}
}
response.Close();
return sResponse;
}
}
如果碰到要验证的网站抓取,只要先继承下这个类,将CheckLogin()方法重写就是
如果是可以直接采集的网站,一个循环就去采吧,将返回的字符串再自己解析,取出自己有用的数据即可。
对于html的解析可以参考Smglreader
先说这么多,后面有关POST数据再读取的相关方法和工具使用技巧请等待后续。。。。
写的不好,欢迎拍砖。。
技术交流群:199703615
分享到:
相关推荐
C#(也称Csharp)在多线程下并发执行HTTP请求的实现,采用C#封装HttpWebRequest类开发的多线程并发采集程序源码文档,文档中详细说明了HttpWebRequest并发HTTP请求实现网站采集的方法,经过测试同时并发1000+不是问题...
NULL 博文链接:https://hipeace87.iteye.com/blog/773804
解决火车头7.6网站报错System.Net.HttpWebRequest问题的处理 插件 无限制。 https.dll 永久使用无限制版本https
利用HttpWebRequest+HtmlAgilityPack进行数据采集,开发环境:Visual Studio 2010,.Net Framework 4.0
C#(Csharp)多线程HTTP并发请求(HttpWebRequest)采集蜘蛛
通过HttpWebRequest加用户名,密码,验证码模拟登录别人系统,采集信息
简单C#信息采集工具实现 http://blog.csdn.net/xiaoxiao108/archive/2011/06/01/6458367.aspx 最近想整只爬虫玩玩,顺便熟悉下正则表达式。 开发环境 vs2008 sql2000 实现方法如下 1.先抓取网页代码 2.通过正则...
读取远程网页能做什么就不用多说了吧,做小偷程序或是采集,也就诸如此类了吧。 public string GetPage(string url) { HttpWebRequest request = null; HttpWebResponse response = null; StreamReader reader =...
首先说明:代码片段是从网络获取,然后自己修改。我想好的东西应该拿来分享。...我们所要做的仅仅是在采集的时候(或者说HttpWebRequest提交数据的时候),将Cookie信息放入Http请求头里面就可以了。 在
利用HttpWebRequest登录百度空间,获取登录后的COOKIE,然后访问采集到的百度空间列表!那你空间将在显示在对方的最近访客里,来提高你的空间访问量!百度最近限制很严格,已经没有太大实际意义了~
NCrawler是一款国外的开源网络爬虫软件,遵循LGPL许可协议。其HTML处理使用的是htmlagilitypack开源库,...同时其采用HttpWebRequest异步的方式获取网页,采集效率较高。台湾微软MSDN有一篇如何使用NCrawler参考文章。
NCrawler是一款国外的开源网络爬虫软件,遵循LGPL许可协议。其HTML处理使用的是htmlagilitypack开源库,采用xpath的方式处理定位网页元素,十分方便。同时其采用HttpWebRequest异步的方式获取网页,采集效率较高。
同时取消的模块如下:采集、群组、邮件订阅、工具箱(包含火车时刻表、公交路线、手机归属地、身份证归属地)、Theme主题:可根据后台设置的值自动给网站配色、调整尺寸)。欲使用上述功能的朋友可下载JumbotCms v4.4.4...