一直以来都觉得爬虫是一个很高级的东西,只听实验室的师兄师姐们提到过,但是从来都没有自己亲身经历过。现在终于有了机会,对于一个需要经常出入于中国海洋大学财务处的学生来说,与其面对一些嘴脸不正常的理财大妈,听其喋喋不休地对照各种规章制度指责你的种种不是,不断地低头哈腰地聆听各种不堪入耳的教训或者低水平的教育,倒不如自己把他们的所谓通知、消息拿过来分析,按照他们的通知来做事情,就算再次挨批,心理上也拥有一定的道理。
于是,财务处的各种通知如下:
不出意外的话,这个网页算是超级简单的了,分析这个网页的话,只需要获取内部的各种连接,然后对应各个连接获得内部的内容就可以了。如下,用asp.NET作出一个简单的界面:
首先输入相关网址,之后,获得对应的网页,对得到的网页内容进行解析,然后根据输入的字符串获取相关的列表:
List<string> textList = new List<string>();//初始化字符串list用于查询。 protected void Page_Load(object sender, EventArgs e) { }//如果不需要在页面加载的时候出现任何情况,就不需要使用这个load函数啦 protected void Button1_Click(object sender, EventArgs e) { var begin = "<a href="; var end = "</a>"; var show_text = ""; var tempText = GetPage(TextBox1.Text.Trim());//调用爬虫,获取当前地址对应网页的所有内容。 var bodyText = GetValue(tempText, begin,end );//使用正则表达式获取两个特定字符串之间的字符串 while (bodyText!="") { if (bodyText.Contains("new.asp?")) textList.Add(bodyText); tempText = tempText.Substring(tempText.IndexOf(bodyText)+bodyText.Length); bodyText = GetValue(tempText, begin, end); }//根据得到的网页内容或者格式,对特定字符串进行特定的处理, for (int i = 0; i < textList.Count; i++) { show_text += textList[i].Split('>')[1] + "\n"; } showText.Text = show_text+"\n"+textList.Count.ToString(); //显示列表格式的东西 // getDetails(); } public static string GetValue(string str, string s, string e) { Regex rg = new Regex("(?<=(" + s + "))[.\\s\\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline); return rg.Match(str).Value; }//正则表达式,获取str字符串中以s开头以e结尾的字符串 private string GetPage(string address) {
//传说中的网络爬虫,实际上是将获取到的页面转化为stream流读出来,在这里,可以把它显示到一个textbox中。便于直观地查看。
具体的参考网址如下:http://www.cnblogs.com/jiang1984j/archive/2010/08/06/1986753.html string text = ""; try { WebRequest request = WebRequest.Create(address); WebResponse response = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); text = reader.ReadToEnd(); reader.Close(); reader.Dispose(); response.Close(); } catch (Exception ex) { text = ex.Message; } TextBox3.Text = text; return text; } private void getDetails()//这个函数是用来存储得到的字符串(通知的标题)和其内容的对应关系,反正待在实验室的时间来日方长,
于是干脆将得到的信息存下来,便于以后使用。 { var begin = "<table"; var end = "</table>"; var show_text = ""; for (int i = 0; i < textList.Count; i++) { if (!textList[i].Contains("CurPageNum")) { var tempText = GetPage(@"http://222.195.158.66/" + textList[i].Split('>')[0]);//这里是根据查看单条通知的网址拼凑出来的格式,
发现还挺好用的。 show_text = GetValue(tempText, begin, end); SqlConnection oSQLConn = new SqlConnection(); oSQLConn.ConnectionString = @"server=localhost\SQL2005;database=whj;uid=sa;pwd=pwd;Integrated Security=false;
Connection Reset=false"; oSQLConn.Open(); var sqlText = @"insert INTO money_ouc (title,content) values ('" + textList[i].Split('>')[1] + "'" + ",'" +
show_text.ToString() + "')"; SqlCommand sc = new SqlCommand(sqlText, oSQLConn); sc.ExecuteNonQuery(); oSQLConn.Close(); } } //Response.Write(show_text); } //下面这个函数就是一般的小函数,根据一个字符串,去向数据库里面查询数据,因为程序较小,又没有其他用途,所以简单地使用sql字符串操作数据库就可以了,简单方便快捷。 protected void Button2_Click(object sender, EventArgs e) { var find = TextBox2.Text; div2.InnerHtml = ""; SqlConnection oSQLConn = new SqlConnection(); oSQLConn.ConnectionString = @"server=localhost\SQL2005;database=whj;uid=sa;pwd=pwd;Integrated Security=false;Connection
Reset=false";
//另外一种连接数据库的方法:
connectionstring = @"Data Source=localhost;Integrated Security=False;Initial Catalog=FrameExtjs; user=sa;password=pwd;"; oSQLConn.Open(); var sqlText = @"select * from money_ouc where title like '%"+find+"%' or content like '%"+find+"%'"; SqlCommand sc = new SqlCommand(sqlText, oSQLConn); SqlDataReader temp_reader = sc.ExecuteReader(); while (temp_reader.Read()) { div2.InnerHtml += "<table"+ temp_reader["content"].ToString()+"</table>"; div2.InnerHtml += "<br />"; } temp_reader.Close(); oSQLConn.Close(); }
最后发现了一个问题,爬虫之类的东西确实很好玩,不过除了虫子身上的那一段代码,其余的工作就是处理获得的网页内部的各种字符串了,越精确的数据越需要耐心、精致的解析。