同三个用户(或浏览器)的不等请求共享同多个变量储存空间,查看服务器再次回到的头新闻

一、从UCRUISERL读取并赶回html树

修改版,由于取的网站多对应加了订正.作者就没发新贴了.
1,同贰个用户(或浏览器)的差异请求共享同三个变量积累空间,就称其为Session(会话)
Session内的变量保存在服务器中。
用SessionID以分别分裂的Session(会话),因为不是四个用户在呼吁。

    1.1
Rcurl包

二,
名闻遐迩HTTP是无连接的,所以服务端和客户端交流时说道好利用些什么标记来维持Session(会话)状态,于是应时而生了Cookie(大概你更熟谙Cookie的其余用途)。那正是HTTP协议的图景保持机制,是正统,全数的浏览器都应该协助。为啥不用IP标记?呵呵,因为有人用代理啊,早期的代
理服务器是很广阔的连到Internet的法子。

       运用ENVISIONcurl包能够方便的向服务器发出请求,捕获U奥迪Q5I,get 和
post 表单。比帕杰罗 socktet连接要提供更加高水准的互动,并且帮忙FTP/FTPS/TFTP,SSL/HTTPS,telnet
和cookies等。本文用到的函数是basicTextGatherer和getUQashqaiL。想详细摸底这些包的可以点击参考资料的链接。

So,
在Cookie中放置二个看似于SessionID的Value,同三个客户端在与服务端交互式,该ID便被过往传递,服务端便可依此创设若干变量,就是Session变量。差别的客户端因为SessionID差异,所以访问服务器时获得的Session变量就分化。

        R命令:

证实原理服务器的Session会在客户端产生一时半刻老董KIESS.
APS.NET网址就能够生成ASP.NET_SessionId=hjguqsn34ai3h3aattozr2fy
PHP,JSP网址生成的JSESSIONID=肆D玖D二F0B六伍C77385C43CE四EE2二D0536E
不畏看如何服务器而以
取了登入成功后的COOKIESS,只重要电报脑不清空COOKIESS,那就足以做成免登入了.
换句话A计算机的主任KIESS,无法在B计算机上用.
工具WPE之类的互连网探嗅器.
先记下一回中标登录时所发送的音讯.
找新闻中的POST,和GET
图片 1图片 2

        h <- basicTextGatherer( )  
# 查看服务器重返的头音讯
        txt <- getURL(url,
headerfunction = h$update,.encoding=”UTF-8…”)  # 重回字符串方式html

那网络打资料都并未有完全的材质特别是验证码登入。

      
参数url即为必要拜访的url这里参数用headerfunction用到上一条命令归来的头消息,.encoding钦赐网页的编码情势为“UTF-捌”。

实际上本身那都是从英特网搜聚整理出来的的。做的不是太好。

      
网页的编码情势有为数不少,一般采纳UTF-八,一些华语网页编码格局为“gbk”,能够在浏览器的网页代码查看可能getU奥迪Q7L再次来到的字符串看到。

行使的多个WebClient,HttpWebRequest。NET的类分别做出四个静态类和动态类。

       小木虫网页代码查看

静态类GetHtml
支持一般的网页取多少和POET提交,但不能够协理验证码,自动识别网页编码也得以手动输入网页编码。然而最佳是手动输入那样会让程序少做运转代码。

                                 
图片 3

System.Collections.Specialized.NameValueCollection PostVars =new
System.Collections.Specialized.NameValueCollection()
PostVars.Add(“uid”,”name”);
PostVars.Add(“pwd”,”123456″);

      可知小木虫网页编码格局为gbk。

string tmphtml= GetStrHtmlPost(url,PostVars);

     1.2  XML包

动态类PostWeb
协理验证码、验证用户、登入过会时有发生老总KIES字符串,第四回运维程序时可由此COOKIES而不用再行登入。

       奥迪Q5语言XML包
具备读取大概创设XML(HTML)文件的功能,能够当半夏件也支撑HTTP 也许 FTP
,也提供Xpath(XML路线语言)解析方法。此处函数htmlparse,将文件分析为XML或许HTML树,便于尤其数据的提取或许编辑。

PostWeb web=new PostWeb();

        R命令:

web.GetCode(验证码地址);

       
htmlParse(file,asText=T,encoding=”UTF-8″…) #参数file
即为XML或然HTML文件名大概text,asText参数是T钦点file是text,encoding内定网页编码情势。

string tmplogin=web.LoginPost(“http://www.mystand.com.cn/“);

 

if(tmplogin.Contains(条件))

       这里大家要求读取网页,并且得到该网页的html树内容

{

        自定义函数download,输入strULacrosseL,strU瑞虎L为网站,重返html树内容

string cookie= web.cookieHeader;//保存到文件中下次直接付到类就可免登录

            download <- function(strURL){
              h <- basicTextGatherer( )# 查看服务器再次来到的头音信
              txt <- getURL(strURL, headerfunction =
h$update,.encoding=”gbk”) ## 字符串情势
               htmlParse(txt,asText=T,encoding=”gbk”)     
#选取gbk进行网页的解析
             }

web.GetPage(“http://www.mystand.com.cn/“,
http://www.mystand.com.cn/“);

二、得到3个网页全体的U哈弗L

}

   
有时候大家要求进入各样网页上的子链接取分析数据,那个时候能够用到XML包的getHTMLLinks函数。

 

    R命令:

PostWeb web=new PostWeb();

        getHTMLLinks(doc,  xpQuery =
“//a/@href”…)
#doc为分析后的HTML树文件,xpQuery钦定想相称的Xpath成分(上边会详细讲一点Xpath基础)。

web.cookieHeader=cookie;//把保存文件中的cookie付到类中

    此处大家供给获得小木虫“导师招生”页面下的有所话题链接。

web.GetPage(“http://www.mystand.com.cn/“,
http://www.mystand.com.cn/“);

    二.1首先大家要博得导师招生的首先页,第壹页,第一页,以致到最终1页的网址。

图片 4
图片 5using System;
图片 6using System.Collections.Generic;
图片 7using System.Text;
图片 8using System.Net;
图片 9using System.Text.RegularExpressions;
图片 10using System.IO;
图片 11using System.IO.Compression;
图片 12
图片 13namespace Manager.Net.Html
图片 14{
图片 15    #region  HTML相关类
图片 16    /// <summary>
图片 17    /// HTML相关
图片 18    /// </summary>
图片 19    public class CHtml
图片 20    {
图片 21      
图片 22        #region 过滤 Sql 语句字符串中的注入脚本
图片 23        /// <summary>
图片 24        /// 过滤 Sql 语句字符串中的注入脚本
图片 25        /// </summary>
图片 26        /// <param name=”source”>传入的字符串</param>
图片 27        /// <returns></returns>
图片 28        public static string FilterSql(string source)
图片 29        {
图片 30            //单引号替换到五个单引号
图片 31            source = source.Replace(“‘”, “””);
图片 32            source = source.Replace(“\””, ““”);
图片 33            source = source.Replace(“|”, “|”);
图片 34            //半角封号轮换为全角封号,制止多语句施行
图片 35            source = source.Replace(“;”, “;”);
图片 36
图片 37            //半角括号轮换为全角括号
图片 38            source = source.Replace(“(“, “(”);
图片 39            source = source.Replace(“)”, “)”);
图片 40
图片 41            /**/
图片 42            ///////////////要用正则表明式替换,防止字母大小写得情况////////////////////
图片 43
图片 44            //去除施行存款和储蓄进度的下令关键字
图片 45            source = source.Replace(“Exec”, “”);
图片 46            source = source.Replace(“Execute”, “”);
图片 47
图片 48            //去除系统存储进度或扩张存款和储蓄进度关键字
图片 49            source = source.Replace(“xp_”, “x p_”);
图片 50            source = source.Replace(“sp_”, “s p_”);
图片 51
图片 52            //幸免1陆进制注入
图片 53            source = source.Replace(“0x”, “0 x”);
图片 54
图片 55            return source;
图片 56        }
图片 57
图片 58        #endregion
图片 59
图片 60        #region 输出HTML
图片 61        /// <summary>
图片 62        /// 输出HTML
图片 63        /// </summary>
图片 64        /// <param name=”Stream”>流</param>
图片 65        /// <param name=”Encod”>编码</param>
图片 66        /// <returns></returns>
图片 67        public static string HtmlStr(System.IO.Stream Stream, Encoding Encod)
图片 68        {
图片 69
图片 70            System.IO.StreamReader sr;
图片 71            if (Encod != null)
图片 72            {
图片 73                sr = new System.IO.StreamReader(Stream, Encod);
图片 74                return sr.ReadToEnd();
图片 75            }
图片 76            else
图片 77            {
图片 78                sr = new System.IO.StreamReader(Stream, Encoding.Default);
图片 79                return sr.ReadToEnd();
图片 80
图片 81            }
图片 82
图片 83        }
图片 84        #endregion
图片 85
图片 86        #region 查证用户提交的UENVISIONL参数字符里面是或不是有不法字符,假若有则赶回True.幸免SQL注入.
图片 87        /// <summary>
图片 88        /// 查验用户提交的U帕杰罗L参数字符里面是或不是有不法字符,要是有则赶回True.幸免SQL注入.
图片 89        /// </summary>
图片 90        /// <param name=”str”>(string)</param>
图片 91        /// <returns>bool</returns>
图片 92        public static bool VerifyString(string str)
图片 93        {
图片 94            string strTmp = str.ToUpper();
图片 95            if (strTmp.IndexOf(“SELECT “) >= 0 || strTmp.IndexOf(” AND “) >= 0 || strTmp.IndexOf(” OR “) >= 0 ||
图片 96                strTmp.IndexOf(“EXEC “) >= 0 || strTmp.IndexOf(“CHAR(“) >= 0)
图片 97            {
图片 98                return true;
图片 99            }
图片 100
图片 101            strTmp.Replace(“‘”, “'”).Replace(“;”, “;”);
图片 102            return false;
图片 103        }
图片 104        #endregion
图片 105
图片 106        #region 相称页面包车型地铁图形地址
图片 107        /// <summary>
图片 108        /// 相配页面的图纸地址
图片 109        /// </summary>
图片 110        /// <param name=”HtmlCode”></param>
图片 111        /// <param name=”imgHttp”>要填补的http://路径信息&lt;/param&gt;
图片 112        /// <returns></returns>
图片 113        public static string GetImgSrc(string HtmlCode, string imgHttp)
图片 114        {
图片 115            string MatchVale = “”;
图片 116            string Reg = @”<img.+?>”;
图片 117            foreach (Match m in Regex.Matches(HtmlCode.ToLower(), Reg))
图片 118            {
图片 119                MatchVale += GetImg((m.Value).ToLower().Trim(), imgHttp) + “|”;
图片 120            }
图片 121
图片 122            return MatchVale;
图片 123        }
图片 124        #endregion
图片 125
图片 126        #region 相配<img src=”” />中的图片路线实际上链接
图片 127        /// <summary>
图片 128        /// 相称<img src=”” />中的图片路线实际上链接
图片 129        /// </summary>
图片 130        /// <param name=”ImgString”><img src=”” />字符串</param>
图片 131        /// <returns></returns>
图片 132        public static string GetImg(string ImgString, string imgHttp)
图片 133        {
图片 134            string MatchVale = “”;
图片 135            string Reg = @”src=.+\.(bmp|jpg|gif|png|)”;
图片 136            foreach (Match m in Regex.Matches(ImgString.ToLower(), Reg))
图片 137            {
图片 138                MatchVale += (m.Value).ToLower().Trim().Replace(“src=”, “”);
图片 139            }
图片 140            if (MatchVale.IndexOf(“.net”) != -1 || MatchVale.IndexOf(“.com”) != -1 || MatchVale.IndexOf(“.org”) != -1 || MatchVale.IndexOf(“.cn”) != -1 || MatchVale.IndexOf(“.cc”) != -1 || MatchVale.IndexOf(“.info”) != -1 || MatchVale.IndexOf(“.biz”) != -1 || MatchVale.IndexOf(“.tv”) != -1)
图片 141                return (MatchVale);
图片 142            else
图片 143                return (imgHttp + MatchVale);
图片 144        }
图片 145        #endregion
图片 146
图片 147        #region 获取页面的链接正则
图片 148        /// <summary>
图片 149        /// 获取页面包车型大巴链接正则
图片 150        /// </summary>
图片 151        /// <param name=”HtmlCode”></param>
图片 152        /// <returns></returns>
图片 153        public static string GetHref(string HtmlCode)
图片 154        {
图片 155            string MatchVale = “”;
图片 156            string Reg = @”(h|H)(r|R)(e|E)(f|F) *= *(‘|””)?((\w|\\|\/|\.|:|-|_)+)[\S]*”;
图片 157            foreach (Match m in Regex.Matches(HtmlCode, Reg))
图片 158            {
图片 159                MatchVale += (m.Value).ToLower().Replace(“href=”, “”).Trim() + “|”;
图片 160            }
图片 161            return MatchVale;
图片 162        }
图片 163        #endregion
图片 164
图片 165        #region 去HTML标记
图片 166        /// <summary>
图片 167        /// 去HTML标记
图片 168        /// </summary>
图片 169        /// <param name=”strhtml”>HTML页面</param>
图片 170        /// <returns></returns>
图片 171        public static string RemoveHTML(string strhtml)
图片 172        {
图片 173            string stroutput = strhtml;
图片 174            Regex regex = new Regex(@”<[^>]+>|</[^>]+>”);
图片 175            stroutput = regex.Replace(stroutput, “”);
图片 176            return stroutput.Trim();
图片 177        }
图片 178        #endregion
图片 179
图片 180        /// <summary>
图片 181        /// 去中文
图片 182        /// </summary>
图片 183        /// <param name=”strhtml”>HTML页面</param>
图片 184        /// <returns></returns>
图片 185        public static string RemoveChinese(string strhtml)
图片 186        {
图片 187            string stroutput = strhtml;
图片 188            Regex regex = new Regex(@”[\u4e00-\u9fa5]”);
图片 189            stroutput = regex.Replace(stroutput, “”);
图片 190            return stroutput.Trim();
图片 191        }
图片 192        #region 去UBB标记
图片 193        /// <summary>
图片 194        /// 去UBB标记
图片 195        /// </summary>
图片 196        /// <param name=”strhtml”>HTML页面</param>
图片 197        /// <returns></returns>
图片 198        public static string RemoveUBB(string strhtml)
图片 199        {
图片 200            string stroutput = strhtml;
图片 201            Regex regex = new Regex(@”\[[^[\[\]]*]”);
图片 202            stroutput = regex.Replace(stroutput, “”);
图片 203            return stroutput.Trim();
图片 204        }
图片 205        #endregion
图片 206
图片 207        #region 去UBB和HTML标记
图片 208        /// <summary>
图片 209        /// 去UBB和HTML标记
图片 210        /// </summary>
图片 211        /// <param name=”strhtml”>HTML页面</param>
图片 212        /// <returns></returns>
图片 213        public static string RemoveUBBHTML(string strhtml)
图片 214        {
图片 215
图片 216            return RemoveUBB(RemoveHTML(strhtml));
图片 217        }
图片 218        #endregion
图片 219
图片 220        #region 取网页编码
图片 221        /// <summary>
图片 222        /// 取网页编码
图片 223        /// </summary>
图片 224        /// <param name=”strHtml”>HTML页面</param>
图片 225        /// <returns>再次回到编码</returns>
图片 226        public static Encoding GetEncoding(string strHtml)
图片 227        {
图片 228
图片 229            string pattern = @”(?i)\bcharset=(?<charset>[-a-zA-Z_0-9]+)”;
图片 230            string charset = Regex.Match(strHtml, pattern).Groups[“charset”].Value;
图片 231            if (charset.Length <= 0)
图片 232            {
图片 233                if (strHtml.Contains(“charset=\””))
图片 234                    charset = Manager.Text.StringEx.GetStringMiddle(strHtml, “charset=\””, “\””);
图片 235
图片 236            }
图片 237            if (charset.Length <= 0)
图片 238            {
图片 239                if (strHtml.Contains(“charset=”))
图片 240                    charset = Manager.Text.StringEx.GetStringMiddle(strHtml, “charset=”, “\””);
图片 241            }
图片 242            if (charset.Length <= 0)
图片 243            {
图片 244                charset = Encoding.UTF8.BodyName;
图片 245            }
图片 246            try
图片 247            {
图片 248                return Encoding.GetEncoding(charset);
图片 249            }
图片 250            catch (Exception)
图片 251            {
图片 252
图片 253                return Encoding.Default;
图片 254            }
图片 255
图片 256
图片 257
图片 258        }
图片 259        #endregion
图片 260
图片 261        #region 取IE版本
图片 262        /// <summary>
图片 263        /// 取IE版本
图片 264        /// </summary>
图片 265        /// <returns></returns>
图片 266        public static string GetIEVersion()
图片 267        {
图片 268            using (Microsoft.Win32.RegistryKey versionKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@”Software\Microsoft\Internet Explorer”))
图片 269            {
图片 270                String version = versionKey.GetValue(“Version”).ToString();
图片 271                return version;
图片 272            }
图片 273        }
图片 274        #endregion
图片 275
图片 276    }
图片 277    #endregion
图片 278
图片 279    #region 模拟网页提交数据类
图片 280    /// <summary>
图片 281    /// 模拟网页提交数据
图片 282    /// </summary>
图片 283    public class PostWeb
图片 284    {
图片 285        属性
图片 286
图片 287        相关设置
图片 288
图片 289        #region 验证码
图片 290        /// <summary>
图片 291        /// 验证码,并保留文件
图片 292        /// </summary>
图片 293        /// <param name=”strU陆风X捌L”>验证码地址</param>
图片 294        /// <param name=”dir”>目录</param>
图片 295        /// <param name=”filename”>文件</param>
图片 296        /// <param name=”imageFormat”>格式</param>
图片 297        public void GetCode(string strURL, string dir, string filename, System.Drawing.Imaging.ImageFormat imageFormat)
图片 298        {
图片 299            string path = “”;
图片 300            if (!String.IsNullOrEmpty(dir))
图片 301            {
图片 302
图片 303                System.IO.Directory.CreateDirectory(dir);
图片 304                path = dir + “\\”;
图片 305
图片 306            }
图片 307            string FileNamePath = path + filename;
图片 308            System.Drawing.Image code = GetCode(strURL);
图片 309            code.Save(FileNamePath, imageFormat);
图片 310            code.Dispose();
图片 311        }
图片 312
图片 313        /// <summary>
图片 314        /// 验证码,返回Bitmap
图片 315        /// </summary>
图片 316        /// <param name=”strUOdysseyL”>验证码地址</param>
图片 317        /// <returns></returns>
图片 318        public System.Drawing.Image GetCode(string strURL)
图片 319        {
图片 320            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
图片 321            ProxySetting(myHttpWebRequest);
图片 322            NetworkCredentialSetting(myHttpWebRequest);
图片 323            myHttpWebRequest.Method = “GET”;
图片 324            myHttpWebRequest.KeepAlive = true;
图片 325            CookieCollection myCookies = null;
图片 326            CookieContainer myCookieContainer = new CookieContainer();
图片 327            myHttpWebRequest.CookieContainer = myCookieContainer;
图片 328            try
图片 329            {
图片 330
图片 331
图片 332                using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse())
图片 333                {
图片 334                    cookieHeader = myHttpWebRequest.CookieContainer.GetCookieHeader(new Uri(strURL));
图片 335                    myCookies = response.Cookies;
图片 336                    System.Drawing.Image code = System.Drawing.Image.FromStream(response.GetResponseStream(), false, false);
图片 337                    return code;
图片 338
图片 339                }
图片 340            }
图片 341            catch
图片 342            {
图片 343
图片 344                return null;
图片 345            }
图片 346        }
图片 347        #endregion
图片 348
图片 349        public string GetCookies(string strURL)
图片 350        {
图片 351            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
图片 352            myHttpWebRequest.Method = “Get”;
图片 353            CookieCollection myCookies = null;
图片 354            CookieContainer myCookieContainer = new CookieContainer();
图片 355            myHttpWebRequest.CookieContainer = new CookieContainer();
图片 356            try
图片 357            {
图片 358                using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse())
图片 359                {
图片 360                
图片 361                    cookieHeader = myHttpWebRequest.CookieContainer.GetCookieHeader(myHttpWebRequest.RequestUri);
图片 362                    myCookies = myHttpWebRequest.CookieContainer.GetCookies(myHttpWebRequest.RequestUri);
图片 363                    SetEncod(response.CharacterSet);
图片 364
图片 365
图片 366                    return System.Web.HttpUtility.HtmlDecode(System.Web.HttpUtility.UrlDecode(CHtml.HtmlStr(response.GetResponseStream(), tmpEncod))).Replace(“\r”, “”).Replace(“\n”, “”).Replace(“\t”, “”).Replace(”  “, “”);
图片 367              
图片 368                }
图片 369                   
图片 370
图片 371
图片 372
图片 373             
图片 374            }
图片 375            catch
图片 376            {
图片 377                cookieHeader = “”;
图片 378                return “”;
图片 379            }
图片 380        
图片 381        }
图片 382
图片 383        #region 登陆
图片 384        /// <summary>
图片 385        /// 作用描述:模拟登入页面,提交登入数据开始展览登入,并记录Header中的cookie
图片 386        /// </summary>
图片 387        /// <param name=”strUKugaL”>登六数据交由的页面地址</param>
图片 388        /// <param name=”strArgs”>用户登入数据</param>
图片 389        /// <param name=”strReferer”>引用地址</param>
图片 390        /// <returns>能够回来页面内容或不回来</returns>
图片 391        public string LoginGet(string strURL, string strReferer)
图片 392        {
图片 393
图片 394            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
图片 395            ProxySetting(myHttpWebRequest);
图片 396            NetworkCredentialSetting(myHttpWebRequest);
图片 397            WebConfig(myHttpWebRequest);
图片 398            myHttpWebRequest.Referer = strReferer;
图片 399            myHttpWebRequest.Method = “Get”;
图片 400            CookieCollection myCookies = null;
图片 401            CookieContainer myCookieContainer = new CookieContainer();
图片 402            myHttpWebRequest.CookieContainer = new CookieContainer();
图片 403           
图片 404            if (cookieHeader.Length > 0)
图片 405            {
图片 406                myCookieContainer.SetCookies(new Uri(strURL), cookieHeader);
图片 407                myHttpWebRequest.CookieContainer = myCookieContainer;
图片 408            }
图片 409
图片 410
图片 411
图片 412
图片 413            try
图片 414            {
图片 415                using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse())
图片 416                {
图片 417
图片 418                    cookieHeader = myHttpWebRequest.CookieContainer.GetCookieHeader(myHttpWebRequest.RequestUri);
图片 419                    myCookies = myHttpWebRequest.CookieContainer.GetCookies(myHttpWebRequest.RequestUri);
图片 420                    SetEncod(response.CharacterSet);
图片 421
图片 422
图片 423                    return System.Web.HttpUtility.HtmlDecode(System.Web.HttpUtility.UrlDecode(CHtml.HtmlStr(response.GetResponseStream(), tmpEncod))).Replace(“\r”, “”).Replace(“\n”, “”).Replace(“\t”, “”).Replace(”  “, “”);
图片 424                }
图片 425            }
图片 426            catch
图片 427            {
图片 428                cookieHeader = “”;
图片 429                return “”;
图片 430            }
图片 431        }
图片 432
图片 433
图片 434
图片 435        /// <summary>
图片 436        /// 功效描述:模拟登陆页面,提交登陆数据进行登6,并记录Header中的cookie
图片 437        ///  LoginPost(“http://www.mystand.com.cn/login/submit.jsp","userid=hgj0000&password=06045369","http://www.mystand.com.cn/“);
图片 438        /// </summary>
图片 439        /// <param name=”strU奥德赛L”>登录数据提交的页面地址</param>
图片 440        /// <param name=”strArgs”>用户登入数据</param>
图片 441        /// <param name=”strReferer”>引用地址</param>
图片 442        /// <returns>能够再次来到页面内容或不回来</returns>
图片 443        public string LoginPost(string strURL, string strArgs, string strReferer)
图片 444        {
图片 445
图片 446            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
图片 447            ProxySetting(myHttpWebRequest);
图片 448            NetworkCredentialSetting(myHttpWebRequest);
图片 449            WebConfig(myHttpWebRequest);
图片 450            myHttpWebRequest.Referer = strReferer;
图片 451            myHttpWebRequest.Method = “Post”;
图片 452            myHttpWebRequest.ContentType = “application/x-www-form-urlencoded”;
图片 453            byte[] bs = Encoding.ASCII.GetBytes(strArgs);
图片 454            myHttpWebRequest.ContentLength = bs.Length;
图片 455
图片 456            try
图片 457            {
图片 458                CookieCollection myCookies = null;
图片 459                CookieContainer myCookieContainer = new CookieContainer();
图片 460                myHttpWebRequest.CookieContainer = new CookieContainer();
图片 461                if (cookieHeader.Length > 0)
图片 462                {
图片 463                 
图片 464                    myCookieContainer.SetCookies(new Uri(strURL), cookieHeader);
图片 465                    myHttpWebRequest.CookieContainer = myCookieContainer;
图片 466                }
图片 467                using (Stream reqStream = myHttpWebRequest.GetRequestStream())
图片 468                {
图片 469                    reqStream.Write(bs, 0, bs.Length);
图片 470                }
图片 471
图片 472                using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse())
图片 473                {
图片 474
图片 475                    cookieHeader = myHttpWebRequest.CookieContainer.GetCookieHeader(myHttpWebRequest.RequestUri);
图片 476                    myCookies = myHttpWebRequest.CookieContainer.GetCookies(myHttpWebRequest.RequestUri);
图片 477                    SetEncod(response.CharacterSet);
图片 478                    return System.Web.HttpUtility.HtmlDecode(System.Web.HttpUtility.UrlDecode(CHtml.HtmlStr(response.GetResponseStream(), tmpEncod))).Replace(“\r”, “”).Replace(“\n”, “”).Replace(“\t”, “”).Replace(”  “, “”);
图片 479                }
图片 480            }
图片 481            catch(Exception ex){ cookieHeader = “”; return “”; }
图片 482        }
图片 483        #endregion
图片 484
图片 485        #region 取数据
图片 486        /// <summary>
图片 487        /// 作用描述:在PostLogin成功登陆后记录下Headers中的cookie,然后拿走此网址上别样页面包车型大巴内容
图片 488        /// </summary>
图片 489        /// <param name=”strUTiggoL”>获取网站的某页面包车型大巴地址</param>
图片 490        /// <param name=”strReferer”>引用的地点</param>
图片 491        /// <returns>重返页面内容</returns>
图片 492        public string GetPage(string strURL, string strReferer)
图片 493        {
图片 494
图片 495            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
图片 496            ProxySetting(myHttpWebRequest);
图片 497            NetworkCredentialSetting(myHttpWebRequest);
图片 498            WebConfig(myHttpWebRequest);
图片 499            myHttpWebRequest.Method = “Get”;
图片 500            if (!string.IsNullOrEmpty(strReferer))
图片 501                myHttpWebRequest.Referer = strReferer;
图片 502            myHttpWebRequest.Headers.Add(“cookie:” + cookieHeader);
图片 503            CookieContainer myCookieContainer = new CookieContainer();
图片 504
图片 505            try
图片 506            {
图片 507                using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse())
图片 508                {
图片 509                    SetEncod(response.CharacterSet);
图片 510
图片 511                    return System.Web.HttpUtility.HtmlDecode(System.Web.HttpUtility.UrlDecode(CHtml.HtmlStr(response.GetResponseStream(), tmpEncod))).Replace(“\r”, “”).Replace(“\n”, “”).Replace(“\t”, “”).Replace(”  “, “”);
图片 512                }
图片 513            }
图片 514            catch
图片 515            {
图片 516                return “”;
图片 517
图片 518            }
图片 519        }
图片 520
图片 521        /// <summary>
图片 522        /// 成效描述:在PostLogin成功登录后记录下Headers中的cookie,然后拿走此网址上别样页面包车型客车剧情
图片 523        /// </summary>
图片 524        /// <param name=”strURL”>获取网站的某页面包车型客车地方</param>
图片 525        /// <param name=”strReferer”>引用的地方</param>
图片 526        /// <returns>再次回到页面内容</returns>
图片 527        public string PostPage(string strURL, string strArgs, string strReferer)
图片 528        {
图片 529            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
图片 530            ProxySetting(myHttpWebRequest);
图片 531            NetworkCredentialSetting(myHttpWebRequest);
图片 532            WebConfig(myHttpWebRequest);
图片 533            myHttpWebRequest.Referer = strReferer;
图片 534            myHttpWebRequest.Method = “Post”;
图片 535            myHttpWebRequest.ContentType = “application/x-www-form-urlencoded”;
图片 536            byte[] bs = Encoding.ASCII.GetBytes(strArgs);
图片 537            myHttpWebRequest.ContentLength = bs.Length;
图片 538            if (cookieHeader.Length > 0)
图片 539                myHttpWebRequest.Headers.Add(“cookie:” + cookieHeader);
图片 540            CookieContainer myCookieContainer = new CookieContainer();
图片 541
图片 542            try
图片 543            {
图片 544                using (Stream reqStream = myHttpWebRequest.GetRequestStream())
图片 545                {
图片 546                    reqStream.Write(bs, 0, bs.Length);
图片 547                }
图片 548                using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse())
图片 549                {
图片 550
图片 551                    SetEncod(response.CharacterSet);
图片 552
图片 553                    return System.Web.HttpUtility.HtmlDecode(System.Web.HttpUtility.UrlDecode(CHtml.HtmlStr(response.GetResponseStream(), tmpEncod))).Replace(“\r”, “”).Replace(“\n”, “”).Replace(“\t”, “”).Replace(”  “, “”);
图片 554                }
图片 555            }
图片 556            catch
图片 557            {
图片 558
图片 559                return “”;
图片 560            }
图片 561        }
图片 562        #endregion
图片 563
图片 564       
图片 565    }
图片 566    #endregion
图片 567
图片 568    #region 表态取网页数据
图片 569    /// <summary>
图片 570    /// 表态取网页数据
图片 571    /// </summary>
图片 572    public class GetHtml
图片 573    {
图片 574
图片 575
图片 576        /// <summary>
图片 577        /// 模拟提交表单POST
图片 578        /// System.Collections.Specialized.NameValueCollection PostVars =new System.Collections.Specialized.NameValueCollection()
图片 579        /// PostVars.Add(“uid”,”name”);
图片 580        /// PostVars.Add(“pwd”,”123456″);
图片 581        /// GetStrHtmlPost(url,PostVars)
图片 582        /// </summary>
图片 583        /// <param name=”url”>地址</param>
图片 584        /// <param name=”PostVars”>PostValue</param>
图片 585        /// <returns></returns>
图片 586        public static string GetStrHtmlPost(String url, System.Collections.Specialized.NameValueCollection PostVars)
图片 587        {
图片 588            if (PostVars == null)
图片 589                return “”;
图片 590            System.Net.WebClient WebClientObj = new System.Net.WebClient();
图片 591
图片 592            string html;
图片 593            try
图片 594            {
图片 595                byte[] buf = WebClientObj.UploadValues(url, “POST”, PostVars);
图片 596                //下边都没用啊,就地点一句话就足以了
图片 597                html = System.Text.Encoding.Default.GetString(buf);
图片 598                Encoding encoding = CHtml.GetEncoding(html);
图片 599                if (encoding == Encoding.UTF8) return html;
图片 600                return encoding.GetString(buf);
图片 601
图片 602            }
图片 603            catch
图片 604            {
图片 605
图片 606            }
图片 607
图片 608            return “”;
图片 609
图片 610        }
图片 611
图片 612        /// <summary>
图片 613        /// 获取网页的HTML内容
图片 614        /// </summary>
图片 615        /// <param name=”url”>url</param>
图片 616        /// <returns></returns>
图片 617        public static string GetStrHtml(string url)
图片 618        {
图片 619            return GetStrHtml(url, null);
图片 620        }
图片 621
图片 622        /// <summary>
图片 623        ///  获取网页的HTML内容
图片 624        /// </summary>
图片 625        /// <param name=”url”>URL</param>
图片 626        /// <param name=”encoding”>Encoding</param>
图片 627        /// <returns></returns>
图片 628        public static string GetStrHtml(string url, Encoding encoding)
图片 629        {
图片 630            byte[] buf = new WebClient().DownloadData(url);
图片 631            if (encoding != null) return encoding.GetString(buf);
图片 632            string html = Encoding.UTF8.GetString(buf);
图片 633            encoding = CHtml.GetEncoding(html);
图片 634            if (encoding == Encoding.UTF8) return html;
图片 635            return encoding.GetString(buf);
图片 636        }
图片 637
图片 638    }
图片 639    #endregion
图片 640    
图片 641}
图片 642

        导师招生首页

 

                        图片 643

       导师招生第叁页,第贰页。

                      图片 644

                   图片 645

       
发现首页网站是http://muchong.com/html/f430.html,余下的网址符合http://muchong.com/html/f430\_ 
+   第几页   +.html 

        于是网站我们得以手动编辑。

        strURLs=”http://muchong.com/html/f430.html

        n=50

        strURLs <-
c(strURLs,paste(rep(“http://muchong.com/html/f430\_",n),c(2:n),".html",sep=“”))

        strUPAJEROLs包罗了具备一到50页导师招生网页的网址。

    2.2取得每1页导师招生里面八个话题的链接

             

       
在先生招生页面下,有众多话题,大家须求获得各类话题的链接。

        用getHTMLLinks函数查看导师招生里面有着U哈弗L,再对照话题网站。

 

        图片 646

        http://muchong.com/html/201702/11075436.html

        开掘话题网址是结合成分是http://muchong.com/ +
html/201702/11075436.html 类似的URL

        那时笔者利用先从师资招生网页提取全体UBMWX伍L,再相配 html *
.html格式的U奥迪Q五L,最后再前边加上http://muchong.com/ 的策略。

        自定义greg函数用李林则相称,并且获得相配到的字符串。
            greg <- function(pattern,istring){
                gregout <- gregexpr(pattern,istring)  
#pattern为合营形式,istring为待相称的字符串
               
substr(istring,gregout[[1]],gregout[[1]]+attr(gregout[[1]],’match.length’)-1)
             }

         自定义extradress函数,用于提取strU大切诺基L网页的中的 U猎豹CS6L
,最终处理回来各样话题网页的链接。

            extradress <- function(strURL){
                 prefix <- “http://muchong.com/
                 pattern <- “html/[0-9/]+.html”
                 links <- getHTMLLinks(strURL)
                 needlinks <- gregexpr(pattern,links)
                 needlinkslist <- list()
                for (i in which(unlist(needlinks)>0)){
                    preadress <-
substr(links[i],needlinks[[i]],needlinks[[i]]+attr(needlinks[[i]],’match.length’)-1)
                    needlinkslist<-
c(needlinkslist,list(preadress))
                   adresses <-
lapply(needlinkslist,function(x)paste(prefix,x,sep=””))
                 }
                return (adresses)
                 }

     

叁、从HTML树中获取我们所要的多寡

    三.1 XML文书档案基本知识

    上面是小木虫的局地html:

 

    图片 647

 

  
html为根成分,head和body是html的子元素,div是body的子成分,div有质量id,style,属性前边对应着属性值。“小木虫—“一行是p成分的文书内容。

    叁.2 得到某些成分的剧情

       此处用到XML包中的getNodeSet函数,getNodeSet函数

        R命令:

        getNodeSet(doc, path…)
#doc 正是html树文件对象,path
正是因素路线。能够用/从根成分1偶发内定路径,也足以用//直接定位到某壹层成分。

        举个例子要牢固到html下的body下的div,path
即为/html/body/div,也可//body/div间接从body开首定点。重临列表,要是固定到多个要素,将重返多少个要素的列表。本次大家要定为到网页的话题内容:

 

                      图片 648

     大家那边一向定位到p成分,再从列表中筛选。

     先输入指令

      getNodeSet(doc,’//p’)

 

      图片 649

 

      getNodeSet(doc,’//p’)[[2]]就是大家必要的始末。

 

      图片 650

     

     
不过回去的结果是个指标,要转移为字符串要用到函数xmlValue获得成分值。

       xmlValue(x…) #
x正是getNodeSet得到的靶子

       此处

  xmlValue(getNodeSet(a,'//p')[[2]]) 得到我们所要的内容


  


   此时,我们获得了每一个话题的内容,我们就可以从内容中提取有效信息,是否招调剂,大学名,导师名字,研究方向,联系人,邮箱,电话等。

肆、从小木虫获取调护诊治新闻实例

   
作者师妹是生物正式的内需调护治疗的上学的小孩子,今后亟待从小木虫网址提取外人发表的消息,做成贰个表格格局,便于筛选查看和发送邮件。

   以下是任何代码内容

 

library(RCurl)
library(XML)

download <- function(strURL){
    h <- basicTextGatherer()# 查看服务器再次回到的头消息
    txt <- getURL(strURL, headerfunction = h$update,.encoding=”gbk”)
## 字符串情势
    htmlParse(txt,asText=T,encoding=”gbk”)     
#挑选gbk实行网页的辨析
}

extradress <- function(strURL){
  prefix <- “http://muchong.com/
  pattern <- “html/[0-9/]+.html”
  links <- getHTMLLinks(strURL)
  needlinks <- gregexpr(pattern,links)
  needlinkslist <- list()
  for (i in which(unlist(needlinks)>0)){
    preadress <-
substr(links[i],needlinks[[i]],needlinks[[i]]+attr(needlinks[[i]],’match.length’)-1)
    needlinkslist<- c(needlinkslist,list(preadress))
    adresses <-
lapply(needlinkslist,function(x)paste(prefix,x,sep=””))
  }
  return (adresses)
}

gettopic <- function(doc){
    xmlValue(getNodeSet(doc,’//p’)[[2]])
}

greg <- function(pattern,istring){
    gregout <- gregexpr(pattern,istring)
   
substr(istring,gregout[[1]],gregout[[1]]+attr(gregout[[1]],’match.length’)-1)
}

getinf <- function(topic){
pattern1 <-
“招[\u4E00-\u9FA5]+[0-9-]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*(研究生)|(调剂)”
pattern2 <- “([\u4E00-\u9FA5]*课题组|[\u4E00-\u9FA5]*团队)”
 
pattern21 <- “[\u4E00-\u9FA5]*[:、;,,;]*(教授|博士)”
pattern3 <-
“[\u4E00-\u9FA5]*[:、;,,;]*[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+[.A-Za-z]*”
    #相称@1陆三.com类或许@abc.edu.cn两类邮箱
pattern4 <- “[\u4E00-\u9FA5]+老师”  #极度某先生
pattern5 <-
“[\u4E00-\u9FA5]*[::]*1[3,5,8]{1}[0-9]{1}[0-9]{8}|0[0-9]{2,3}-[0-9]{7,8}(-[0-9]{1,4})?”
#相配联系人和数码
pattern6 <-
“(主|从事)*[\u4E00-\u9FA5]*(的研究|方向)为*[:、;,,;]*[\u4E00-\u9FA5]*”
pattern7 <- “[\u4E00-\u9FA5]+(大学|学院|研究院|研究所)”
pattern8
<-“[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+[.A-Za-z]*”
#正确相称邮箱

cate <- greg(pattern1,topic)
proj <- greg(pattern2,topic)
PI <- greg(pattern21,topic)
email <- greg(pattern3,topic)
man <- greg(pattern4,topic)
phone <- greg(pattern5,topic)
direc <- greg(pattern6,topic)
univ <- greg(pattern7,topic)
print(cate)
if (greg(“(分子|生物|植物|细胞|医学|动物|水)+”,topic) !=””){
    if (man ==”” && proj != “”){
        man <- unlist(strsplit(proj,”课题组”)[1])
    }
 
    if (email != “”){
      email <- greg(pattern10,email)
    }
    
   
data.frame(“类别”=cate,”大学”=univ,”课题”=proj,”PI”=PI,”联系人”=man,”邮箱”=email,”方向”=direc,”电话”=phone)
}
else{
  return(“”)
}
}

strURLs=”http://muchong.com/html/f430.html
n=50
dat <-
data.frame(“URL”=”URL”,”类别”=”类别”,”大学”=”大学”,”课题”=”课题”,”PI”=”PI”,”联系人”=”联系人”,”邮箱”=”邮箱”,”方向”=”方向”,”电话”=”电话”)
strURLs <-
c(strURLs,paste(rep(“http://muchong.com/html/f430\_",n),c(2:n),".html",sep=“”))
output1 <- “a2017.2.21.txt” #未管理数据,用于进一步管理
output2 <- “b2017.2.21.txt” #特别筛选的数量,用于查看

for ( strURL in strURLs){
    adresses <- extradress(strURL)
    for (adress in adresses){
      message(adress)
      doc <- download(adress)
      topic <- gettopic(doc)
      inf <- getinf(topic)
      if (inf != “”){
        URL <- data.frame(“URL”=adress)
        inf <- cbind(URL,inf)
        dat<- rbind(dat,inf)
      }
    }
}

write.table(dat, file = output1, row.names = F, col.names=F,quote = F,
sep=”\t”)  # tab 分隔的公文
message(“完成!”)

dat <- read.table(output1,sep=”\t”,header=T)
dat <- dat[dat$邮箱, ] #除去未有邮箱数据
dat <- dat[!duplicated(dat$邮箱), ]  #删除重复邮箱数据
dat$index <- as.numeric(rownames(dat))
dat <- dat[order(dat$index,decreasing=F),]
#将乱序后的数目重复依据index排序
dat$index <- NULL
write.table(dat, file = output2, row.names = F, col.names=F,quote = F,
sep=”\t”)  # tab 分隔的文本
message(“完成!”)

 

 

谈起底祝全部报考博士人都能得逞被心仪的学院和学校录取!

 

 

参考资料:

Rcurl包 :https://cran.r-project.org/web/packages/RCurl/RCurl.pdf

XML包:https://cran.r-project.org/web/packages/XML/XML.pdf

XML基本知识:http://www.cnblogs.com/thinkers-dym/p/4090840.html

 

相关文章