• 抓取网页,按照需求获得自己喜欢的内容


    一直以来都觉得爬虫是一个很高级的东西,只听实验室的师兄师姐们提到过,但是从来都没有自己亲身经历过。现在终于有了机会,对于一个需要经常出入于中国海洋大学财务处的学生来说,与其面对一些嘴脸不正常的理财大妈,听其喋喋不休地对照各种规章制度指责你的种种不是,不断地低头哈腰地聆听各种不堪入耳的教训或者低水平的教育,倒不如自己把他们的所谓通知、消息拿过来分析,按照他们的通知来做事情,就算再次挨批,心理上也拥有一定的道理。

    于是,财务处的各种通知如下:

    不出意外的话,这个网页算是超级简单的了,分析这个网页的话,只需要获取内部的各种连接,然后对应各个连接获得内部的内容就可以了。如下,用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] + "
    ";
                }
                showText.Text = show_text+"
    "+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=localhostSQL2005;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=localhostSQL2005;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(); }
    最后发现了一个问题,爬虫之类的东西确实很好玩,不过除了虫子身上的那一段代码,其余的工作就是处理获得的网页内部的各种字符串了,越精确的数据越需要耐心、精致的解析。
  • 相关阅读:
    mysql主从与mycat与MHA
    mycat+mysql集群:实现读写分离,分库分表
    centos7下扩展根分区(图文详解)
    MySQL高可用之MHA的搭建
    zabbix_agentd客户端安装与配置(windows操作系统)
    centos7手把手教你搭建zabbix监控
    有关添加System.Web的问题
    锚标签<a>
    MVC3出现“提供程序未返回 ProviderManifestToken 字符串”的解决办法
    解决.net后台调用js弹窗后,前台界面样式乱掉问题
  • 原文地址:https://www.cnblogs.com/jzwh/p/3294332.html
Copyright © 2020-2023  润新知