?????? 现在采集程序最最常用到的就是火车头了,只要你会编写采集规则就能将网站上的数据抓下来居为已有。
?????? 不过做为一个开发者,这样做起来也也感觉不爽。不能一次性解决需求。
?????? 现在写一个简单的采集程序。
??????? 由于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数据再读取的相关方法和工具使用技巧请等待后续。。。。
?
写的不好,欢迎拍砖。。