不在乎最新,适合才是最好的

2022-05-11 08:58:41 浏览数 (1)

最近在做另一个动环软件的数据接口,本来想按之前的套路直接在其数据库通过ODBC取数据就完毕;但无奈它的数据库是NexusDB,查了一下其ODBC的连接包是需要1百多美金并且每年续费,更重要是其设备和系统环境状态都不稳定;如果再部署IIS的容易出问题。于是就想其他办法,想放弃的时候,突然想到可以通过以前常用的网络爬虫把数据爬回来,但这个有账号和密码,怎么爬,本来想通过模拟账号和密码登录,但其代码又是delphi的WEB登录方式很麻烦。。正在纠结的时候,突然发现其IE游览器地址有一个get的进入方法,那就容易很多了。。

一个个问题扫除后就可以开干了,本来用.net写爬虫是我以前的强项,但这次想换换用.net core的写。于是就按图索引,写了.net core 的WEBAPI 框架,感觉非常简单。。。只需要建一个控制器,在控制器中加个IActionResult就可以了。

正在洋洋得意的时候,又一个问题犯难了,因为通过.net core进行爬虫,我还没认真搞过,那只能借用万能的网络,搜了几篇.net core 的爬虫代码。。成功是成功了但被爬回来的是UTF编码(爬的页面是GBK),所以又绕了一圈。。解决。但又一个问题摆在面前就是,教程说用AngleSharp进行提取,顶花了我一个早上都搞不顶,那好吧,留给我们的时间不多,先把问题解决了再算,于是只能走回之前的路。。用HttpWebRequest请求获取,然后通正则去处理,代码如下。

代码语言:javascript复制
    public static string GetHtmls(string url)
          {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            Encoding encoding = Encoding.GetEncoding("GBK");
             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
             HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
             try
             {
                 Stream receive = response.GetResponseStream(); 
                 StreamReader readStream = new StreamReader(receive, Encoding.GetEncoding("GBK")); 
                 return readStream.ReadToEnd();
             } 
             catch (Exception)
             {
                 return "";
             }
         }

上面获取页面内容,下面是提取相关的主代码。

代码语言:javascript复制
public static string Getcode(string sourse, string startstr, string endstr)
        {
            string result = string.Empty;
            int startindex, endindex;
            try
            {
                startindex = sourse.IndexOf(startstr);
                if (startindex == -1)
                    return result;
                string tmpstr = sourse.Substring(startindex   startstr.Length);
                endindex = tmpstr.IndexOf(endstr);
                if (endindex == -1)
                    return result;
                result = tmpstr.Remove(endindex);
            }
            catch (Exception ex)
            {
              //  Log.WriteLog("MidStrEx Err:"   ex.Message);
            }
            return result;
        }

下面就是正则的重头戏:

代码语言:javascript复制
Regex.Replace(unit, @"<img(.[^>]*)>", String.Empty, RegexOptions.IgnoreCase);//将img取掉
Regex.Replace(unit, @"<div(.[^>]*)>", String.Empty, RegexOptions.IgnoreCase).Replace("</div>","");//将div取掉
var Html_arr = unit.Split("</span>");//将</span>分组
foreach (var arr in Html_arr) {
  //通过正则提取相关的数据
  Regex regex = new Regex(@"<span.*title=""(?<title>[sS]*?)"".*id=""(?<id>[sS]*?)"">(?<uvalue>[sS]*?)</span>", RegexOptions.IgnoreCase);
  Match match = regex.Match(arr  "</span>");
   if (match.Success)//判断是否存在
     {
       string span_name = match.Groups["title"].Value; //获取设备名
       string span_id = match.Groups["id"].Value; //获取设备ID
       string span_txt = match.Groups["uvalue"].Value; //获取设备的值
       List_str List_arr = new List_str();
       List_arr.Name = span_name;
       List_arr.Id = span_id;
       List_arr.Value = span_txt.Replace(span_name   ":", "");
       //List_arr.Txt = arr;
       List_obj.Add(List_arr);
      }             
 }

搞掂这样就将提取出来的代码通过正则写入到list中,在通过list转为JSON 大功告成。

最后再放出一个取除HTML的函数。

代码语言:javascript复制
     public static string DelHtml(string html, int length = 0)
        {
            string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>] >", "");
            strText = System.Text.RegularExpressions.Regex.Replace(strText, "&[^;] ;", "");
            if (length > 0 && strText.Length > length)
                return strText.Substring(0, length);
            return strText;
        }

0 人点赞