最近在做另一个动环软件的数据接口,本来想按之前的套路直接在其数据库通过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;
}