1 #region * 在一个TR中,解析TD,获取一期的号码
2 ///
3 /// 在一个TR中,解析TD,获取一期的号码
4 ///
5 ///
6 ///
7 private void ResolveTd(ref WinNo wn, string trContent)
8 {
9 List<int > redBoxList = null ;
10 // 匹配期号的表达式
11 string patternQiHao = " " ;
12 Regex regex = new Regex(patternQiHao);
13 Match qhMatch = regex.Match(trContent);
14 wn.QiHao = trContent.Substring(qhMatch.Index + 17 + patternQiHao.Length, 7 );
15 // 匹配蓝球的表达式
16 string patternChartBall02 = " " ;
17 regex = new Regex(patternChartBall02);
18 Match bMatch = regex.Match(trContent);
19 wn.B = Convert.ToInt32(trContent.Substring(bMatch.Index + patternChartBall02.Length, 2 ));
20 // 存放匹配出来的红球号码
21 redBoxList = new List<int >();
22 // 匹配红球的表达式
23 string patternChartBall01 = " " ;
24 regex = new Regex(patternChartBall01);
25 MatchCollection rMatches = regex.Matches(trContent);
26 foreach (Match r in rMatches)
27 {
28 redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index + patternChartBall01.Length, 2 )));
29 }
30 // 匹配红球的表达式
31 string patternChartBall07 = " " ;
32 regex = new Regex(patternChartBall07);
33 rMatches = regex.Matches(trContent);
34 foreach (Match r in rMatches)
35 {
36 redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index + patternChartBall07.Length, 2 )));
37 }
38 // 排序红球号码
39 redBoxList.Sort();
40 // 第一个红球号码
41 wn.R1 = redBoxList[0 ];
42 // 第二个红球号码
43 wn.R2 = redBoxList[1 ];
44 wn.R3 = redBoxList[2 ];
45 wn.R4 = redBoxList[3 ];
46 wn.R5 = redBoxList[4 ];
47 wn.R6 = redBoxList[5 ];
48 }
下面这块的代码是某招聘网站的截取数据,就是一串的截取HTML标签的内容,哈哈,当时在写这个时候相当的头痛,不知有做个这方法工作的人是不是有同感,当你解析比较多网站的数据就更加了(我写了抓取前程无忧、猎聘网、前程无忧和拉勾网的数据),O(∩_∩)O哈哈~想死呀,使用正则表达是去截取数据,再去提取相应信息的工作。
// 正则表达式过滤:正则表达式,要替换成的文本
private static readonly string [][] Filters =
{
new [] { @" (?is).*? " , "" },
new [] { @" (?is).*? " , "" },
new [] { @" (?is) " , "" }, // 过滤Html代码中的注释
new [] { @" (?is).*? " ,"" },
// new[] { "(?is).*?
",""}
new [] { @" (?is)常用链接:.*? " ,"" }
};
private void GetJobInfoFromUrl(string url)
{
try
{
JobInfo info = new JobInfo();
// --
string pageStr = GetHtmlCode.GetByget(url, " utf-8 " );
if (string .IsNullOrEmpty(pageStr))
{
return ;
}
// --
pageStr = pageStr.Replace(" \r\n " , "" );// 替换换行符
// 获取html,body标签内容
string body = string .Empty;
string bodyFilter = @" (?is) " ;
Match m = Regex.Match(pageStr, bodyFilter);
if (m.Success)
{
body = m.ToString().Replace(" " , " " ).Replace(" \r\n " , "" );
}
// 过滤样式,脚本等不相干标签
foreach (var filter in Filters)
{
body = Regex.Replace(body, filter[0 ], filter[1 ]);
}
// --
if (!string .IsNullOrEmpty(mustKey) && !body.Contains(mustKey))
{
return ;
}
body = Regex.Replace(body, " \\s " , "" );
info.Url = url;
string basicInfoRegexStr0 = " (.*?) " ; // 职位名称
string position = Regex.Match(body, basicInfoRegexStr0).Value;
info.Position = string .IsNullOrEmpty(position) ? "" : position.Substring(position.IndexOf(" > " ) + 1 , position.IndexOf(" " ) - position.IndexOf(" > " ) - 1 );// 职位名称
string basicInfoRegexStr1 = " (.*?) " ;// 公司名称
string company = Regex.Match(body, basicInfoRegexStr1).Value;
info.Company = string .IsNullOrEmpty(company) ? "" : company.Substring(company.IndexOf(" " ) + 4 , company.IndexOf(" " ) - company.IndexOf(" " ) - 4 );// 公司名称
string basicInfoRegexStr2 = " (.*?) " ;// 工作地点
string address = Regex.Match(body, basicInfoRegexStr2).Value;
info.Address = string .IsNullOrEmpty(address) ? "" : address.Substring(address.IndexOf(" " ) + 6 , address.IndexOf(" " ) - address.IndexOf(" " ) - 6 );// 工作地点
string basicInfoRegexStr3 = " 企业性质: (.*?)" ;// 公司性质
string nature = Regex.Match(body, basicInfoRegexStr3).Value;
info.Nature = string .IsNullOrEmpty(nature) ? "" : nature.Substring(nature.IndexOf(" " ) + 7 , nature.IndexOf(" " ) - nature.IndexOf(" " ) - 7 );// 公司性质
if (string .IsNullOrEmpty(info.Nature))
{
string basicInfoRegexStr3_1 = " 性质: (.*?)" ;
string nature_1 = Regex.Match(body, basicInfoRegexStr3_1).Value;
info.Nature = string .IsNullOrEmpty(nature_1) ? "" : nature_1.Substring(nature_1.IndexOf(" " ) + 7 , nature_1.LastIndexOf(" " ) - nature_1.IndexOf(" " ) - 7 );// 公司性质
}
string basicInfoRegexStr4 = " 企业规模: (.*?)" ;// 公司规模
string scale = Regex.Match(body, basicInfoRegexStr4).Value;
info.Scale = string .IsNullOrEmpty(scale) ? "" : scale.Substring(scale.IndexOf(" " ) + 7 , scale.IndexOf(" " ) - scale.IndexOf(" " ) - 7 );// 公司规模
if (string .IsNullOrEmpty(info.Scale))
{
string basicInfoRegexStr4_1 = " 规模: (.*?)" ;
string scale_1 = Regex.Match(body, basicInfoRegexStr4_1).Value;
info.Scale = info.Nature = string .IsNullOrEmpty(scale_1) ? "" : scale_1.Substring(scale_1.IndexOf(" " ) + 7 , scale_1.LastIndexOf(" " ) - scale_1.IndexOf(" " ) - 7 );// 公司规模
}
string basicInfoRegexStr5 = " (.*?) " ;// 工作经验
string experience = Regex.Match(body, basicInfoRegexStr5).Value;
info.Experience = string .IsNullOrEmpty(experience) ? "" : experience.Substring(experience.IndexOf(" > " ) + 1 , experience.IndexOf(" " ) - experience.IndexOf(" > " ) - 1 );// 工作经验
string basicInfoRegexStr6 = " (.*?) " ;// 最低学历
string education = Regex.Match(body, basicInfoRegexStr6).Value;
info.Education = string .IsNullOrEmpty(education) ? "" : education.Substring(education.IndexOf(" " ) + 6 , education.IndexOf(" " ) - education.IndexOf(" " ) - 6 );// 最低学历
string basicInfoRegexStr7 = " (.*?)< " ;// 月薪
string salary = Regex.Match(body, basicInfoRegexStr7).Value;
info.Salary = string .IsNullOrEmpty(salary) ? "" : salary.Substring(salary.IndexOf(" > " ) + 1 , salary.LastIndexOf(" < " ) - salary.IndexOf(" > " ) - 1 );// 月薪
string timeInfoRegexStr = " 发布时间:(.*?) " ;// 发布时间
string time = Regex.Match(body, timeInfoRegexStr).Value;
info.Time = string .IsNullOrEmpty(time) ? "" : time.Substring(time.IndexOf(" " ) + 4 , time.IndexOf(" " ) - time.IndexOf(" " ) - 4 );// 发布时间
if (GetJobEnd != null )
{
GetJobEnd(pageStr, info);
}
}
catch (Exception exMsg)
{
throw new Exception(exMsg.Message);
}
}
}
从以上代码可以看出都是在截取(正则表达式)相应内容,非常复杂,稍微一不注意就截取不到网站数据,写起来相当的费劲,最后通过QQ群(186841119 )里的朋友的介绍采用了Fizzler来提取网站数据,一下子感觉就容易多了,下面着中来介绍一下Fizzler这个工具(好像这个是开源的),相关介绍可以去网站查询到。
首先提供这个工具的下载地址:Fizzler
这个里面包括三个文件:Fizzler.dll、Fizzler.Systems.HtmlAgilityPack.dll、HtmlAgilityPack.dll三个文件,在VS2010里引用里直接进行引用就可以了。
完成以上即完成了对Fizzler的引用。
using HtmlAgilityPack;
using Fizzler;
using Fizzler.Systems.HtmlAgilityPack;
以上就可以在CS里进行了引用,
下面来进行代码的实现,
private static WebDownloader m_wd = new WebDownloader();
///
/// 获取HTML内容
///
/// 链接
/// 字符集
///
public static string GetHtml(string Url, Encoding Code)
{
return m_wd.GetPageByHttpWebRequest(Url, Code);
}
public string GetPageByHttpWebRequest(string url, Encoding encoding)
{
Stream sr = null ;
StreamReader sReader = null ;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = " Get " ;
request.Timeout = 30000 ;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
if (response.ContentEncoding.ToLower() == " gzip " )// 如果使用了GZip则先解压
{
sr = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
}
else
{
sr = response.GetResponseStream();
}
sReader = new StreamReader(sr, encoding);
return sReader.ReadToEnd();
}
catch
{
return null ;
}
finally
{
if (sReader != null )
sReader.Close();
if (sr != null )
sr.Close();
}
}
以上即实现抓取HTML数据代码,,以上代码基本上也没啥区别,就是普通抓取数据的方法。
///
/// 获取相应的标签内容
///
/// 链接
/// CSS路径
/// 字符集
///
public static IEnumerable GetUrlInfo(string Url, string CSSLoad, Encoding Code)
{
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument
{
OptionAddDebuggingAttributes = false ,
OptionAutoCloseOnEnd = true ,
OptionFixNestedTags = true ,
OptionReadEncoding = true
};
htmlDoc.LoadHtml(GetHtml(Url, Code));
IEnumerable NodesMainContent = htmlDoc.DocumentNode.QuerySelectorAll(CSSLoad);// 查询的路径
return NodesMainContent;
}
///
/// 获取相应的标签内容
///
/// html内容
/// CSS路径
///
public static IEnumerable GetHtmlInfo(string html, string CSSLoad)
{
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument
{
OptionAddDebuggingAttributes = false ,
OptionAutoCloseOnEnd = true ,
OptionFixNestedTags = true ,
OptionReadEncoding = true
};
htmlDoc.LoadHtml(html);
IEnumerable NodesMainContent = htmlDoc.DocumentNode.QuerySelectorAll(CSSLoad);// 查询的路径
return NodesMainContent;
}
以上两个方法即实现对相应路径标签数据的抓取,一个方法是根据URL进行抓取,一个是根据HTML内容去抓取相应的数据,下面着重介绍CSSLoad的获取方法,这个需要安装火狐浏览器即可,火狐浏览器需要安装FireBug插件进行查询,如下图(网站工具栏):
再点击像蜘蛛一样的图标,这样可以看到如下:
这样可以看到所有的HTML标签,那么紧接着如何去获取CSS路径呢,那相对来说就非常简单了。
点击蓝色的箭头选取网站相关的内容,
这样相应的HTML同样选中了,这样离我们拿到CCS路径更近一步了,紧接着点击右键即可复制CCS路径即可。如下:
点击复制CSS路径就可以了,复制出CSS路径如下:
html body#Posts form#frmMain table#BodyTable tbody tr td#Body div#Main div#Editor_Edit div#Editor_Edit_Contents div#edit_container div#Editor_Edit_APOptions div#Editor_Edit_APOptions_Contents.Edit div.edit_option div#Editor_Edit_APOptions_Advancedpanel1 div#Editor_Edit_APOptions_Advancedpanel1_Header.subCollapsibleTitle
看到这一串路径别急,我们也不需要把这串路径全部复制到我们程序里,否则这样显得太负责了,我们只需要将最后的部分节点放到上面的方法里面,我们就能读取到HTML标签相应的内容,下面举一个简单例子就进行说明。
1 ///
2 /// 解析每一条招聘信息
3 ///
4 ///
5 private void GetJobInfoFromUrl(object Url)
6 {
7 try
8 {
9 JobInfo info = new JobInfo();
10 info.Url = Url.ToString();
11 // --获取HTML内容
12 string html =AnalyzeHTML.GetHtml(Url.ToString(), Encoding.UTF8);
13 if (string .IsNullOrEmpty(html)) { return ; }
14 // --职位名称
15 IEnumerable NodesMainContent1 = AnalyzeHTML.GetHtmlInfo(html, " div.title-info h1 " );
16 if (NodesMainContent1.Count()>0 )
17 {
18 info.Position = NodesMainContent1.ToArray()[0 ].InnerText;
19 }
20 // --公司名称
21 IEnumerable NodesMainContent2 = AnalyzeHTML.GetHtmlInfo(html, " div.title-info h3 " );
22 if (NodesMainContent2.Count() > 0 )
23 {
24 info.Company = NodesMainContent2.ToArray()[0 ].InnerText;
25 }
26 // --公司性质/公司规模
27 IEnumerable NodesMainContent4 = AnalyzeHTML.GetHtmlInfo(html, " div.content.content-word ul li " );
28 if (NodesMainContent4.Count() > 0 )
29 {
30 foreach (var item in NodesMainContent4)
31 {
32 if (item.InnerHtml.Contains(" 企业性质 " ))
33 {
34 string nature = item.InnerText;
35 nature = nature.Replace(" 企业性质: " , "" );
36 info.Nature = nature;
37 }
38 if (item.InnerHtml.Contains(" 企业规模 " ))
39 {
40 string scale = item.InnerText;
41 scale = scale.Replace(" 企业规模: " , "" );
42 info.Scale = scale;
43 }
44 }
45 }
46 else // 第二次解析企业性质和企业规模
47 {
48 IEnumerable NodesMainContent4_1 = AnalyzeHTML.GetHtmlInfo(html, " div.right-post-top div.content.content-word " );
49 if (NodesMainContent4_1.Count() > 0 )
50 {
51 foreach (var item_1 in NodesMainContent4_1)
52 {
53 string [] arr = item_1.InnerText.Split(" \r\n " .ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
54 if (arr != null && arr.Length > 0 )
55 {
56 foreach (string str in arr)
57 {
58 if (str.Trim().Contains(" 性质 " ))
59 {
60 info.Nature = str.Replace(" 性质: " , "" ).Trim();
61 }
62 if (str.Trim().Contains(" 规模 " ))
63 {
64 info.Scale = str.Replace(" 规模: " , "" ).Trim();
65 }
66 }
67 }
68 }
69 }
70 }
71 // --工作经验
72 IEnumerable NodesMainContent5 = AnalyzeHTML.GetHtmlInfo(html, " div.resume.clearfix span.noborder " );
73 if (NodesMainContent5.Count() > 0 )
74 {
75 info.Experience = NodesMainContent5.ToArray()[0 ].InnerText;
76 }
77 // --公司地址/最低学历
78 IEnumerable NodesMainContent6 = AnalyzeHTML.GetHtmlInfo(html, " div.resume.clearfix " );
79 if (NodesMainContent6.Count() > 0 )
80 {
81 foreach (var item in NodesMainContent6)
82 {
83 string lable = Regex.Replace(item.InnerHtml, " \\s " , "" );
84 lable = lable.Replace(" " , "" );
85 string [] arr = lable.Split(" " .ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
86 if (arr != null && arr.Length > 2 )
87 {
88 info.Address = arr[0 ];// 公司地址
89 info.Education = arr[1 ];// 最低学历
90 }
91 }
92 }
93 // --月薪
94 IEnumerable NodesMainContent7 = AnalyzeHTML.GetHtmlInfo(html, " div.job-title-left p.job-main-title " );
95 if (NodesMainContent7.Count() > 0 )
96 {
97 info.Salary = NodesMainContent7.ToArray()[0 ].InnerText;
98 }
99 // --发布时间
100 IEnumerable NodesMainContent8 = AnalyzeHTML.GetHtmlInfo(html, " div.job-title-left p.release-time em " );
101 if (NodesMainContent8.Count() > 0 )
102 {
103 info.Time = NodesMainContent8.ToArray()[0 ].InnerText;
104 }
105 // --
106 if (GetJobEnd != null )
107 {
108 GetJobEnd("" , info);
109 }
110 }
111 catch (Exception exMsg)
112 {
113 throw new Exception(exMsg.Message);
114 }
115 }
以上这个方法也是解析某招聘网站标签的内容,但已经看不到复杂的正则表达式去截取HTML标签了,这样显得代码更加干练、简单,再整一个配置页面既可应付抓取网站标签经常变化的难题,这样就显得抓取别人网站数据就是一件非常简单的事情了,O(∩_∩)O哈哈~是不是啦!!!
以上只代表个人观点!!!如有兴趣一起加QQ群:(186841119 ),参与谈论和学习交流
转载于:https://www.cnblogs.com/luoyuhao/p/4174772.html
你可能感兴趣的:(抓取网站数据不再是难事了,Fizzler(So Easy)全能搞定)
JPA 实战经验
jpajava
这个博客会持续更新...JSON数据无法进行更新背景:数据库字段是json格式,代码Entity中字段使用了@Converter进行类型转换,对象本身是个List,产生的效果是查询生效,插入生效,更新不生效。怀疑方向:List对象实例ID发生变更了导致未识别@Converter转换器类型有问题尝试以上操作之后,问题依旧。最后,发现自己搞错概念了,把字段与关联表概念搞混了,它本质是一个字段,JPA对
前后端的身份认证
咖啡の猫
node.js 后端 express
在现代Web开发中,确保用户数据的安全性和隐私保护至关重要。身份认证是其中的核心环节之一,它用于验证用户的身份,并控制对资源的访问权限。本文将介绍几种常见的身份认证方法,并详细讲解如何在Node.js项目中实现这些方法。一、什么是身份认证?身份认证(Authentication)是确认用户身份的过程,通常通过用户名和密码组合或其他凭证来完成。一旦用户被认证,系统就可以基于其身份授予相应的访问权限(
内核arp_rcv函数到ip_local_deliver_finish的具体调用流程
源远流长jerry
tcp/ip 网络 网络协议 linux
场景:主机A(IP:192.168.1.10,MAC:AA:BB:CC:DD:EE:FF)首次向主机B(IP:192.168.1.20,MAC:11:22:33:44:55:66)发送数据,发送ARP请求获取主机B的MAC地址。流程:主机B收到主机A的ARP请求报文后,内核调用arp_rcv处理。arp_rcv解析报文,发现是ARP请求且目标IP是本机(192.168.1.20)。函数生成ARP应
这么分析大文件日志,以后就不用加班卷了!
编辑器
有没有熟悉这样的场景:时间已过十一点,空荡荡的办公室只剩自己孤身一人。陪你伏案忙碌的只有电脑风扇被迫营业的“嗡嗡”声,窗外的夜正黑得带劲,仿佛巨兽的口吞噬自己的无奈。天性善良不善言辞的你,容易被人颐指气使,加班对你来说是家常便饭。作为一名码农,“我到底哪里错了,我需要怎么解决?”是我的座右铭。但是,解决问题的过程需要耐心和细心,需要在大文件日志中寻找问题线索,耗费巨量的时间和精力。因此,加班分析并
牛掰黑客师傅就是不一样,讲的内容可能外面的80%师傅都不知道
文盲嘿客
文盲嘿客的黑客成长史 网络安全 web安全 系统安全 安全 网络攻击模型 数据挖掘 深度学习
今天是师傅给我上的第一课,学习的内容归纳总结有以下几点:一、先学做人,再学做事坚定爱国信念:热爱祖国,拥护共产党严守法律红线:要遵纪守法,不得用技术攻击国内传承道德风尚:尊老爱幼,朋友之间应相互支持、携手共进,努力成就彼此。二、认识黑客黑客主要分为以下三类:骇客:这类人专门从事破坏活动,通过恶意手段对网络系统、数据等进行攻击和破坏。白帽黑客:他们专注于为企业或单位进行网络维护工作,防止骇客的攻击。
数据库的基本概念
咖啡の猫
数据库
在当今数字化的世界中,数据已成为企业和组织最宝贵的资产之一。有效地管理和利用这些数据对于决策制定、服务优化和业务增长至关重要。数据库作为存储、管理及检索数据的核心工具,在现代信息系统中扮演着至关重要的角色。本文将介绍数据库的一些基本概念,包括其定义、类型、结构以及一些基本操作。一、什么是数据库?数据库(Database)是指按照一定的结构来组织、存储和管理数据的仓库。它允许用户方便地进行数据的添加
127.HarmonyOS NEXT 数字滚动示例详解(二):下拉刷新实现
harmonyos-next
温馨提示:本篇博客的详细代码已发布到git:https://gitcode.com/nutpi/HarmonyosNext可以下载运行哦!HarmonyOSNEXT数字滚动示例详解(二):下拉刷新实现效果演示1.下拉刷新概述下拉刷新功能通过Refresh组件实现,提供了良好的用户交互体验。2.刷新组件实现2.1基本结构Refresh({refreshing:$this.isRefresh}){th
MATLAB 控制系统设计与仿真 - 28
东雁西飞
MATLAB 控制系统设计与仿真 matlab 算法 开发语言 机器人 自动控制 AI算法
MATLAB状态空间控制系统分析-极点配置就受控系统的控制律的设计而言,由状态反馈极点配置和输出反馈极点配置。状态反馈极点配置问题就是:通过状态反馈矩阵K的选取,使闭环系统的极点,即(A-BK)的特征值恰好处于所希望的一组给定闭环极点的位置。另外,线性定常系统可以用状态反馈任意配置极点的充分必要条件是:该系统必须是完全能控的。所以,在实现极点的任意配置前,必须判别受控系统的能控性。下面结合例子介绍
122.HarmonyOS NEXT 数字滚动动画详解(二):动画实现机制
harmonyos-next
温馨提示:本篇博客的详细代码已发布到git:https://gitcode.com/nutpi/HarmonyosNext可以下载运行哦!HarmonyOSNEXT数字滚动动画详解(二):动画实现机制效果演示1.动画实现概述数字滚动动画通过控制每个数字的Y轴偏移量来实现滚动效果,使用animateTo方法来创建平滑的过渡动画。2.数据刷新机制2.1刷新触发@Watch('onDataRefresh
近期docker镜像加速器被封杀,需要的请看此内容 点赞加关注
加油干sit!
docker docker
{“registry-mirrors”:[“https://docker.m.daocloud.io”],“insecure-registries”:[“harbor.sunya.com”],“exec-opts”:[“native.cgroupdriver=systemd”],“data-root”:“/data/docker”,“log-driver”:“json-file”,“log-opt
Nginx的编译安装
加油干sit!
LINUX基础
1公司:我们线上业务已经有Nginx了,现在要新上一个业务,你给我把Nginx安装一下,按照之前的安装方式进行,怎么办?1.先使用nginx-V获取所有的编译参数2.按照所有的参数,在新的服务器上进行编译安装你给我们的Nginx安装一个第三方模块?1.先使用nginx-V获取所有的编译参数2.给nginx的源码导入第三方模块的补丁包(就是三方模块重写的一些c语言程序,替换了官方源码中的一些c语言程
《A++ 敏捷开发》- 19 协作改进整个系统
EdmondSung
敏捷流程
“专注用户,从顾客的角度生产产品。”某次现场培训,我分享了丰田汽车故事后,请学员分组讨论,写出对工作最有帮助的3条。以上是某组的第一条,我请他们解释说明。“我是做开发的,反思时发现其实不清楚我的工作对客户有什么作用。”一位年轻的编码人员说。因为编码工作大部分都是由产品经理或项目经理过滤后分配,所以如果你随便问身边的编码人员,70-80%的可能不知道用户为什么要这样做,要开发的功能有什么价值。这位年
【数据结构之树】
武帝为此
数据结构 数据结构
文章目录一、前言二、树的基本概念1.什么是树?2.树的常见分类(1)普通树(2)二叉树(BinaryTree)(3)满二叉树(FullBinaryTree)(4)完全二叉树(CompleteBinaryTree)(5)二叉搜索树(BinarySearchTree,BST)(6)平衡二叉树(AVL树)(7)红黑树(Red-BlackTree)三、树的基本操作及代码示例1.二叉树的基本实现(C++)运
Android Fresco 框架扩展模块源码深度剖析(四)
&有梦想的咸鱼&
Anddroid Fresco原理分析 Android开发大全 android
一、引言在Android开发领域,图片处理一直是一个重要且具有挑战性的任务。Fresco作为Facebook开源的强大图片加载框架,在图片的加载、缓存和显示等方面已经提供了非常完善的功能。然而,为了满足不同开发者多样化的需求,Fresco设计了丰富的扩展模块,这些扩展模块允许开发者根据自身项目的特点对框架进行定制和扩展。本文将深入剖析Fresco框架的扩展模块,从源码级别进行详细分析,帮助开发者更
python中的scatter()函数用法
品易HTTP
python javascript css js 人工智能
若是现在已经对数据化有了解的话,那就一定要来参与看看本章要学习的函数,在样式以及排版上效果还是很好的,经常被用于测试数据上的大小更改以及设置不同颜色,还有时候,对于线条的宽度的更改也都需要利用到这个函数,以上基本就是本章函数的基本用法了,下面进行详细讲述。制作如图所示图片:需要准备:X、Y轴包括数值以及大小和颜色调用语法:plt.scatter()实现代码:importmatplotlibasmp
Angular 17开发中的SCSS编译问题解决方案
t0_54coder
编程问题解决手册 angular.js scss 前端 个人开发
在Angular的开发过程中,我们常常会遇到一些难以预料的编译问题。特别是当我们从Angular16升级到Angular17时,可能会遇到一些新的挑战。今天,我们来探讨一下如何解决在使用ngserve进行开发时,.scss文件的编译错误问题。问题描述当使用ngserve命令进行开发时,如果在编辑.scss文件时出现了编译错误,即使你已经修复了语法错误,AngularCLI也不会自动重新编译。结果是
分块查找算法
1haooo
算法 java 算法 开发语言 数据结构
分块的原则前一块的最大数据,小于后一窥啊中所有的数据(块内无序,块间有序)块数数量一般等于数字的个数开根号。比如:16个数字一般分为4块左右。publicclassblockSearch{publicstaticvoidmain(String[]args){int[]arr={16,5,9,12,21,18,32,23,37,26,45,34,50,48,61,52,73,66};//共18个元素
C语言:哈希表
%KT%
C/C++算法 数据结构 c语言 散列表 开发语言
1、文章声明:本文是基于链地址法建立的哈希表。文章中若存在错误,欢迎各路大佬指正。本文涉及二级指针,链表等内容。该方面的知识点,可以参考文章:数据结构:单链表的相关操作-CSDN博客C语言:利用二级指针动态创建二维矩阵-CSDN博客2、哈希表的介绍:哈希表其实可以理解成一种映射,通过映射关系来存储数据,有点类似于Python中的字典。常见的如数组,链表等存储结构,他们查询数据都有一个特点,往往需要
大模型工程师学习日记(五):基于LangServe的AI服务架构深度解析
MMMMMMMay Love Code
学习 架构 语言模型 深度学习 人工智能 git
1.概述LangServe️帮助开发者将LangChain可运行和链部署为RESTAPI。该库集成了FastAPI并使用pydantic进行数据验证。Pydantic是一个在Python中用于数据验证和解析的第三方库,现在是Python中使用广泛的数据验证库。它利用声明式的方式定义数据模型和Python类型提示的强大功能来执行数据验证和序列化,使您的代码更可靠、更可读、更简洁且更易于调试。。它还可
C/C++高效编译工具ccache
工头阿乐
C/C++ c语言 c++ java
C/C++文章目录C/C++前言一、引入ccache二、ccache基本原理三、安装前言在处理一些规模相对较大的工程时,编译花费的时间可能会很长。有时候我们会经常一遍一遍地编译相同的程序,此时,有了ccache情况就好多了。它将在第一遍编译时多花几秒钟,但接下来就会使编译成倍(5-10倍)的提速。ccache的基本原理是通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加
远程调试Python脚本之ptvsd
工头阿乐
PyTorch 深度学习 python 开发语言
深度学习文章目录深度学习前言前言有时候需要远程调试Python脚本,怎么办呢…以下这段代码用于远程调试Python脚本,特别是通过VisualStudioCode(VSCode)的远程调试功能。它会在指定的服务器IP和端口上等待调试器的连接。#检查是否提供了服务器IP和端口ifargs.server_ipandargs.server_port:#远程调试-参见https://code.visual
yolo模型coco数据集详解
工头阿乐
深度学习 YOLO
深度学习文章目录深度学习前言前言instances_train2017.json和instances_val2017.json文件均分为五大部分,这五部分对应的关键字分别为info、licenses、images、annotations、categories。{"info":info,"licenses":[license1,license2,license3,...],"images":[ima
react实现虚拟列表
束尘
react.js 前端 javascript
在前端开发中,当一次性渲染大量数据时,直接渲染所有DOM节点,会造成渲染过慢,浏览器卡顿的现象,导致用户体验不佳,为了改善这种情况,提出使用虚拟列表的方式进行渲染。虚拟列表的实现思路1.只渲染可见区域:计算当前可见区域的起始索引和结束索引。只渲染可见区域内的列表项,其他区域用空白占位。2.动态计算高度:如果列表项高度固定,可以直接计算。如果列表项高度不固定,需要动态计算每个列表项的高度。3.滚动时
【Jmeter】前置处理器实战:「BeanShell 预处理程序」参数化手机号码、身份证号
顾三殇
JMeter 从入门到软件测试实战 jmeter
一、实战场景业务场景:常见业务管理系统测试中,个人信息档案的自动化批量生成,需要贴近实际进行入参,在姓名、手机号码、身份证号、生日、性别中,这五者有着各自的行业规范格式,而生日、性别有时是由身份证号默认带出数据的信息,数据输入规范:·姓名:“姓”在百家姓中任意取一,“名”任意,均为对字符串的随机取值,字数为2~18字·手机号码:11位整数,“手机号码”规范格式,比如188、135等开头的号码为有效
前端大文件上传,分片方式上传
Sunsit
前端开发 vue 前端 javascript 开发语言
前端大文件分片上传文件上传超时:原因是前端请求框架限制最大请求时长,后端设置了接口访问的超时时间,或者是nginx(或其它代理/网关)限制了最大请求时长。文件大小超限:原因在于后端对单个请求大小做了限制,一般nginx和server都会做这个限制。上传时间过久(想想10个g的文件上传,这不得花个几个小时的时间)由于各种网络原因上传失败,且失败之后需要从头开始整体思路前端根据代码中设置好的分片大小将
2025年毕设ssm校园二手电瓶车交易网站论文+源码
SSM毕设程序源码JAVA
课程设计
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景关于校园二手交易平台的现有研究,多以综合类商品交易或书籍循环为主,而专门针对电瓶车这类高价值、强监管的校园二手交易研究较少。当前高校内电瓶车交易存在信息不对称、交易流程不规范、车牌管理脱节等问题,缺乏系统化的解决方案。部分高校虽尝试通过论坛或社群进行交易,但存在用户身份难核实、
【加密】常用加密算法
llzcxdb
java 开发语言
非对称加密非对称加密是一种加密技术,也称为公钥加密。它使用一对密钥:公钥和私钥。公钥可以向任何人公开,用于加密信息,而私钥则是保密的,用于解密信息。这种加密方法确保了数据的安全传输,因为只有拥有对应私钥的人才能解密通过公钥加密的信息。非对称加密的一个主要特点是,即使公钥被他人获取,他们也无法解密密文,因为缺乏与之配对的私钥。常见的非对称加密算法包括RSA、椭圆曲线加密(ECC)和数字签名算法(DS
【Python】爬取高校数据(名字,院校特色,所在地,性质)。可用于判断高校是否为双一流,本科/专科等分析
llzcxdb
Python python 开发语言 爬虫
源网站:http://college.gaokao.com/schlist/p1利用Python的lxml库进行html解析,源代码:importrequestsfromlxmlimportetreeimportpandasaspdimportcsv#请求URLurl='http://college.gaokao.com/schlist/p'#构建请求头headers={'User-Agent':
(PTA)数据结构(作业)6、队列
MapleInori
数据结构 数据结构 算法 c++
栈是后进先出的线性表(LastInFirstOut,LIFO),插入和删除的操作都在栈顶进行。队列是先进先出的线性表(FirstInFirstOut,FIFO),插入在队尾进行,删除在队头进行。循环队列的两种区别队满和队空的方式,1)少用一个元素,即当队列空间大小为m时,有m-1个元素就默认时队满。队空的条件:Q.front==Q.rear队满的条件:(Q.rear+1)%m==Q.front2)
机器学习之向量化
珠峰日记
AI理论与实践 机器学习 人工智能
文章目录向量化是什么为什么要向量化提升计算效率简化代码与增强可读性适配模型需求怎么做向量化数据预处理特征提取特征选择向量构建机器学习与深度学习中向量化的区别数据特征提取方式机器学习深度学习模型结构与复杂度机器学习深度学习计算资源需求机器学习深度学习数据规模适应性机器学习深度学习向量化是什么向量化是把数据转化为向量形式进行表示与处理的过程。在机器学习与深度学习的范畴内,现实中的各类数据,像文本、图像
java短路运算符和逻辑运算符的区别
3213213333332132
java基础
/*
* 逻辑运算符——不论是什么条件都要执行左右两边代码
* 短路运算符——我认为在底层就是利用物理电路的“并联”和“串联”实现的
* 原理很简单,并联电路代表短路或(||),串联电路代表短路与(&&)。
*
* 并联电路两个开关只要有一个开关闭合,电路就会通。
* 类似于短路或(||),只要有其中一个为true(开关闭合)是
Java异常那些不得不说的事
白糖_
java exception
一、在finally块中做数据回收操作
比如数据库连接都是很宝贵的,所以最好在finally中关闭连接。
JDBCAgent jdbc = new JDBCAgent();
try{
jdbc.excute("select * from ctp_log");
}catch(SQLException e){
...
}finally{
jdbc.close();
utf-8与utf-8(无BOM)的区别
dcj3sjt126com
PHP
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样如
JAVA Annotation之定义篇
周凡杨
java 注解 annotation 入门 注释
Annotation: 译为注释或注解
An annotation, in the Java computer programming language, is a form of syntactic metadata that can be added to Java source code. Classes, methods, variables, pa
tomcat的多域名、虚拟主机配置
g21121
tomcat
众所周知apache可以配置多域名和虚拟主机,而且配置起来比较简单,但是项目用到的是tomcat,配来配去总是不成功。查了些资料才总算可以,下面就跟大家分享下经验。
很多朋友搜索的内容基本是告诉我们这么配置:
在Engine标签下增面积Host标签,如下:
<Host name="www.site1.com" appBase="webapps"
Linux SSH 错误解析(Capistrano 的cap 访问错误 Permission )
510888780
linux capistrano
1.ssh -v
[email protected] 出现
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
错误
运行状况如下:
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuratio
log4j的用法
Harry642
java log4j
一、前言: log4j 是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现, 当时在log4j完成时,log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中
mysql、sqlserver、oracle分页,java分页统一接口实现
aijuans
oracle jave
定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量
oracle分页:
select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart
sqlServer分页:
 
Hessian 简单例子
antlove
java Web service hessian
hello.hessian.MyCar.java
package hessian.pojo;
import java.io.Serializable;
public class MyCar implements Serializable {
private static final long serialVersionUID = 473690540190845543
数据库对象的同义词和序列
百合不是茶
sql 序列 同义词 ORACLE权限
回顾简单的数据库权限等命令;
解锁用户和锁定用户
alter user scott account lock/unlock;
//system下查看系统中的用户
select * dba_users;
//创建用户名和密码
create user wj identified by wj;
identified by
//授予连接权和建表权
grant connect to
使用Powermock和mockito测试静态方法
bijian1013
持续集成 单元测试 mockito Powermock
实例:
package com.bijian.study;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import or
精通Oracle10编程SQL(6)访问ORACLE
bijian1013
oracle 数据库 plsql
/*
*访问ORACLE
*/
--检索单行数据
--使用标量变量接收数据
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
select ename,sal into v_ename,v_sal
from emp where empno=&no;
dbms_output.pu
【Nginx四】Nginx作为HTTP负载均衡服务器
bit1129
nginx
Nginx的另一个常用的功能是作为负载均衡服务器。一个典型的web应用系统,通过负载均衡服务器,可以使得应用有多台后端服务器来响应客户端的请求。一个应用配置多台后端服务器,可以带来很多好处:
负载均衡的好处
增加可用资源
增加吞吐量
加快响应速度,降低延时
出错的重试验机制
Nginx主要支持三种均衡算法:
round-robin
l
jquery-validation备忘
白糖_
jquery css F# Firebug
留点学习jquery validation总结的代码:
function checkForm(){
validator = $("#commentForm").validate({// #formId为需要进行验证的表单ID
errorElement :"span",// 使用"div"标签标记错误, 默认:&
solr限制admin界面访问(端口限制和http授权限制)
ronin47
限定Ip访问
solr的管理界面可以帮助我们做很多事情,但是把solr程序放到公网之后就要限制对admin的访问了。
可以通过tomcat的http基本授权来做限制,也可以通过iptables防火墙来限制。
我们先看如何通过tomcat配置http授权限制。
第一步: 在tomcat的conf/tomcat-users.xml文件中添加管理用户,比如:
<userusername="ad
多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
bylijinnan
java 多线程
public class IncDecThread {
private int j=10;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--内部类
*/
public static
买房历程
cfyme
2015-06-21: 万科未来城,看房子
2015-06-26: 办理贷款手续,贷款73万,贷款利率5.65=5.3675
2015-06-27: 房子首付,签完合同
2015-06-28,央行宣布降息 0.25,就2天的时间差啊,没赶上。
首付,老婆找他的小姐妹接了5万,另外几个朋友借了1-
[军事与科技]制造大型太空战舰的前奏
comsci
制造
天气热了........空调和电扇要准备好..........
最近,世界形势日趋复杂化,战争的阴影开始覆盖全世界..........
所以,我们不得不关
dateformat
dai_lm
DateFormat
"Symbol Meaning Presentation Ex."
"------ ------- ------------ ----"
"G era designator (Text) AD"
"y year
Hadoop如何实现关联计算
datamachine
mapreduce hadoop 关联计算
选择Hadoop,低成本和高扩展性是主要原因,但但它的开发效率实在无法让人满意。
以关联计算为例。
假设:HDFS上有2个文件,分别是客户信息和订单信息,customerID是它们之间的关联字段。如何进行关联计算,以便将客户名称添加到订单列表中?
&nbs
用户模型中修改用户信息时,密码是如何处理的
dcj3sjt126com
yii
当我添加或修改用户记录的时候对于处理确认密码我遇到了一些麻烦,所有我想分享一下我是怎么处理的。
场景是使用的基本的那些(系统自带),你需要有一个数据表(user)并且表中有一个密码字段(password),它使用 sha1、md5或其他加密方式加密用户密码。
面是它的工作流程: 当创建用户的时候密码需要加密并且保存,但当修改用户记录时如果使用同样的场景我们最终就会把用户加密过的密码再次加密,这
中文 iOS/Mac 开发博客列表
dcj3sjt126com
Blog
本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息。
本博客列表涉及的文章内容支持 定制化Google搜索,特别感谢 JeOam 提供并帮助更新。
本博客列表也提供同步更新的OPML文件(下载OPML文件),可供导入到例如feedly等第三方定阅工具中,特别感谢 lcepy 提供自动转换脚本。这里有导入教程。
js去除空格,去除左右两端的空格
蕃薯耀
去除左右两端的空格 js去掉所有空格 js去除空格
js去除空格,去除左右两端的空格
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g
SpringMVC4零配置--web.xml
hanqunfeng
springmvc4
servlet3.0+规范后,允许servlet,filter,listener不必声明在web.xml中,而是以硬编码的方式存在,实现容器的零配置。
ServletContainerInitializer:启动容器时负责加载相关配置
package javax.servlet;
import java.util.Set;
public interface ServletContainer
《开源框架那些事儿21》:巧借力与借巧力
j2eetop
框架 UI
同样做前端UI,为什么有人花了一点力气,就可以做好?而有的人费尽全力,仍然错误百出?我们可以先看看几个故事。
故事1:巧借力,乌鸦也可以吃核桃
有一个盛产核桃的村子,每年秋末冬初,成群的乌鸦总会来到这里,到果园里捡拾那些被果农们遗落的核桃。
核桃仁虽然美味,但是外壳那么坚硬,乌鸦怎么才能吃到呢?原来乌鸦先把核桃叼起,然后飞到高高的树枝上,再将核桃摔下去,核桃落到坚硬的地面上,被撞破了,于是,
JQuery EasyUI 验证扩展
可怜的猫
jquery easyui 验证
最近项目中用到了前端框架-- EasyUI,在做校验的时候会涉及到很多需要自定义的内容,现把常用的验证方式总结出来,留待后用。
以下内容只需要在公用js中添加即可。
使用类似于如下:
<input class="easyui-textbox" name="mobile" id="mobile&
架构师之httpurlconnection----------读取和发送(流读取效率通用类)
nannan408
1.前言.
如题.
2.代码.
/*
* Copyright (c) 2015, S.F. Express Inc. All rights reserved.
*/
package com.test.test.test.send;
import java.io.IOException;
import java.io.InputStream
Jquery性能优化
r361251
JavaScript jquery
一、注意定义jQuery变量的时候添加var关键字
这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:
$loading = $('#loading'); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的
二、请使用一个var来定义变量
如果你使用多个变量的话,请如下方式定义:
. 代码如下:
var page
在eclipse项目中使用maven管理依赖
tjj006
eclipse maven
概览:
如何导入maven项目至eclipse中
建立自有Maven Java类库服务器
建立符合maven代码库标准的自定义类库
Maven在管理Java类库方面有巨大的优势,像白衣所说就是非常“环保”。
我们平时用IDE开发都是把所需要的类库一股脑的全丢到项目目录下,然后全部添加到ide的构建路径中,如果用了SVN/CVS,这样会很容易就 把
中国天气网省市级联页面
x125858805
级联
1、页面及级联js
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&l