前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不在乎最新,适合才是最好的

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

原创
作者头像
谭广健
修改2022-05-11 08:58:41
2880
修改2022-05-11 08:58:41
举报
文章被收录于专栏:谭广健的专栏谭广健的专栏

最近在做另一个动环软件的数据接口,本来想按之前的套路直接在其数据库通过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>[\s\S]*?)"".*id=""(?<id>[\s\S]*?)"">(?<uvalue>[\s\S]*?)</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;
        }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档