java正则表达式求匹配url

求一个java正则表达式,匹配url
要求:http://www.baidu.com https://www.baidu.com //www.baidu.com
这3中情况都能匹配。
谢谢了

2个回答

function IsURL(str_url){
var strRegex = "^((https|http|ftp|rtsp|mms)?:?//)"
+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
+ "(([0-9]{1,3}.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
+ "|" // 允许IP和DOMAIN(域名)
+ "([0-9a-z_!~*'()-]+.)*" // 域名- www.
+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]." // 二级域名
+ "[a-z]{2,6})" // first level domain- .com or .museum
+ "(:[0-9]{1,4})?" // 端口- :80
+ "((/?)|" // a slash isn't required if there is no file name
+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
var re=new RegExp(strRegex);
//re.test()
if (re.test(str_url)){
return (true);
}else{
return (false);
}
}
![图片说明](https://img-ask.csdn.net/upload/201611/08/1478595373_202767.png)图片说明

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
正则表达式匹配URL中的访问资源
java语言编写,匹配URL中的访问资源,不匹配后面的参数,正则表达式怎么写? "GET /SchoolClubManage/jsp/common/applyjoinclub.html?name=../../../../../../../../../../etc/passwd%00.jpg HTTP/1.1" 200 5953 这条记录只匹配/SchoolClubManage/jsp/common/applyjoinclub.html? "GET /SchoolClubManage/font/ HTTP/1.1" 200 3216 这条记录只匹配 /SchoolClubManage/font 多谢,急急急
关于java正则表达式匹配url
Pattern pattern=Pattern.compile(正则表达式); Matcher m=pattern.matcher("http://www.123.com/234/333.html"); //除中文不用外,其他的都要 if(m.find()){ System.out.println(m.find()); System.out.println(m.start()); System.out.println(m.end()); System.out.println(m.group()); }
java爬虫webMagic用正则表达式匹配a标签的onclick里面的值
java爬虫webMagic用正则表达式匹配a标签的onclick里面queryArticleByCondition方法里的this后面的值,就是一个URL地址 ``` <a style="cursor:pointer" onclick="queryArticleByCondition(this,'/liuyanggov/dwzt/ggzyjyzx/jyxx96/fjsz34/zbgg97/2a7bc3f8-3.html')" tagname="/liuyanggov/dwzt/ggzyjyzx/jyxx96/fjsz34/zbgg97/2a7bc3f8-3.html">下一页</a> ```
正则大神们求助,小弟在Java代码中获取到了一串数据,想要用正则表达式匹配所需要文字,还望大佬们施加援手
大神们我的代码如下: ``` String fileName ="F:\\py1\\wxprint.txt"; FileReader fileReader = new FileReader(fileName); BufferedReader bufferedReader = new BufferedReader(fileReader); System.out.println("字符集:"+fileReader.getEncoding()); String line =bufferedReader.readLine(); while (line!=null) { System.out.println(line); // List lines = new ArrayList(); System.out.println("=========="); s.setThistime(theTime); //compile("")实在不知道怎末填了 Matcher matcher = Pattern.compile("").matcher(line); ``` //compile("") 里面写过: Pattern.compile("(?<=,'Text':')[\\S]+?(?=',)").matcher(line);匹配不到 打印结果如下: ![图片说明](https://img-ask.csdn.net/upload/201908/22/1566480331_899442.png) 要匹配的记事本中的部分内容如下: ![图片说明](https://img-ask.csdn.net/upload/201908/22/1566480434_818069.jpg) (注:记事本处显示的内容目前不是完全的json,不好解析,所以想用正则试试) 小弟想要匹配到如红框处所有'Text':后面的文字,还望正则大神们教教小弟,感激不尽。 ![图片说明](https://img-ask.csdn.net/upload/201908/23/1566528985_195526.jpg) (此为按照qiangchen1990大佬教的结果,还望大佬再交一下) 部分文本如下: {'StatusNotifyCode': 0, 'ActualNickName': '多多', 'MsgId': '4750673808156304087', 'Type': 'Text', 'AppMsgType': 0, 'FileSize': '', 'SubMsgType': 0, 'HasProductId': 0, 'ToUserName': '@@bff166403f4a632e8315351ca040ce77f413deee515ebe7c37aed744a1413b5e', 'ActualUserName': '@a595384fe0c1c6c3aea42fe54aef15c1', 'IsAt': False, 'AppInfo': {'Type': 0, 'AppID': ''}, 'EncryFileName': '', 'User': <Chatroom: {'EncryChatRoomId': '', 'VerifyFlag': 0, 'NickName': '远,索,多多', 'Uin': 0, 'HideInputBarFlag': 0, 'ChatRoomId': 0, 'IsAdmin': None, 'RemarkName': '', 'DisplayName': '', 'UserName': '@@bff166403f4a632e8315351ca040ce77f413deee515ebe7c37aed744a1413b5e', 'Alias': '', 'AppAccountFlag': 0, 'KeyWord': '', 'RemarkPYInitial': '', 'ContactType': 0, 'ContactFlag': 2, 'PYQuanPin': '', 'OwnerUin': 0, 'Province': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=0&username=@@bff166403f4a632e8315351ca040ce77f413deee515ebe7c37aed744a1413b5e&skey=@crypt_c2ee04a5_8042d20368543cf94c9c08a2afbb3336', 'PYInitial': '', 'StarFriend': 0, 'SnsFlag': 0, 'MemberCount': 2, 'ChatRoomOwner': '@2ddf0afbd6813708701fa7ea3d6a0460b15e1095a877c029075e8e4d4db74eb0', 'UniFriend': 0, 'Statues': 1, 'RemarkPYQuanPin': '', 'IsOwner': 0, 'Self': <ChatroomMember: {'PYInitial': '', 'NickName': '多多', 'Uin': 0, 'AttrStatus': 13311, 'MemberStatus': 0, 'DisplayName': '', 'UserName': '@a595384fe0c1c6c3aea42fe54aef15c1', 'KeyWord': '', 'RemarkPYQuanPin': '', 'RemarkPYInitial': '', 'MemberList': <ContactList: []>, 'PYQuanPin': ''}>, 'Sex': 0, 'MemberList': <ContactList: [<ChatroomMember: {'PYInitial': '', 'NickName': '远,索', 'Uin': 0, 'AttrStatus': 4133, 'MemberStatus': 0, 'DisplayName': '', 'UserName': '@2ddf0afbd6813708701fa7ea3d6a0460b15e1095a877c029075e8e4d4db74eb0', 'KeyWord': '', 'RemarkPYQuanPin': '', 'RemarkPYInitial': '', 'MemberList': <ContactList: []>, 'PYQuanPin': ''}>, <ChatroomMember: {'PYInitial': '', 'NickName': '多多', 'Uin': 0, 'AttrStatus': 13311, 'MemberStatus': 0, 'DisplayName': '', 'UserName': '@a595384fe0c1c6c3aea42fe54aef15c1', 'KeyWord': '', 'RemarkPYQuanPin': '', 'RemarkPYInitial': '', 'MemberList': <ContactList: []>, 'PYQuanPin': ''}>]>, 'City': '', 'Signature': '', 'HeadImgUpdateFlag': 1, 'AttrStatus': 0}>, 'ForwardFlag': 0, 'ImgHeight': 0, 'Url': '', 'FromUserName': '@a595384fe0c1c6c3aea42fe54aef15c1', 'FileName': '', 'MsgType': 1, 'VoiceLength': 0, 'Content': '问问', 'RecommendInfo': {'OpCode': 0, 'Province': '', 'VerifyFlag': 0, 'NickName': '', 'AttrStatus': 0, 'Content': '', 'UserName': '', 'Alias': '', 'Sex': 0, 'Scene': 0, 'City': '', 'Signature': '', 'Ticket': '', 'QQNum': 0}, 'Status': 3, 'MediaId': '', 'Text': '问问', 'ImgStatus': 1, 'ImgWidth': 0, 'PlayLength': 0, 'CreateTime': 1566271903, 'NewMsgId': 4750673808156304087, 'Ticket': '', 'StatusNotifyUserName': '', 'OriContent': ''}
JAVA 正则表达匹配 <a href="XXX">xxx</a>
利用java.net.URL已经获取网页代码,想从其中的“<a href="URL">指定内容</a>”获取“URL”地址,我查看了些正则教程还是未能解答出,麻烦请问大侠们这个正则表达式应该如何写,谢谢! [b]问题补充:[/b] TO:pwg17 如果自己解析,应该如何解析,我确实想不出高效的方法。希望指教。
麻烦看一下这一段正则表达式,有一点问题
``` \b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/% =~_|]/i 这段正则的功能是匹配URL 这里的\b是为了什么 -a a前面的- 是什么 -a-z0-9+ 后面的一堆&@#\/%?=~_|!:,.; 这些是什么啊。。。。如果是符号匹配的话,不需要加\吗? * 后的[ ] 又是为了什么,不是已经有*了吗? 最后的 [ ] 后面的 /i 又是什么? ```
正则表达式在JSP中的使用
``` <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>京东商城新用户注册</title> <style type="text/css"> .label{ position:absolute; right:70%; } .fi{ position:relative; left:30%; } .clr{ height:20px; color:AAAAAA; font-size:12px; visibility:hidden; } .s{ font-weight:lighter; color:red; } .text{ font-family:宋体; width:200px; } .v{ color:cccccc; font-size:12px; } a{ font-size:12px; } .btn-img{ position:relative; left:30%; } .ok{ background:url("image\gou_meitu_1.jpg"); width:17px; height:16px; visibility:hidden; display:none; } #strength{ color:AAAAAA; font-size:12px; display:none; } .showStren{ width:135px; display:inline; color:white; font-size:12px; } .ceil{ border:0.5px solid #FFFFFF; background-color:DDDDDD; } </style> <script type="text/javascript"> function inUser(){ username_mess.style.visibility="visible"; } function outUser(){ u=f1.username.value; f1.username.style.border="1px solid AAAAAA"; if(u==""){ username_mess.style.visibility="hidden"; return; } reg= /.{4,20}/; //代表着允许4到20位字符,用两个/表示定义表达式,这样reg就有test方法了,返回值是true和false,另外还有exec方法,返回值是null,意味着不匹配,以及字符串,意味着匹配上了什么字符串 if(!reg.test(u)){ username_mess.innerHTML="用户名长度只能在4-20位字符之间"; username_mess.style.color="red"; f1.username.style.color="red"; f1.username.style.border="1px solid red" username_ok.style.visibility="hidden"; return; } reg= /^[\u4e00-\u9fa5 \w-]{4,20}$/; //代表着中文字符和\w(\w能够代替[a-zA-Z0-9_])还有- if(reg.test(u)){ username_ok.style.visibility="visible"; username_mess.innerHTML=""; f1.username.style.color="black"; }else{ username_mess.innerHTML="用户名只能由中文、英文、数字及"_"、"-"组成"; username_mess.style.color="red"; f1.username.style.color="red"; f1.username.style.border="1px solid red"; username_ok.style.visibility="hidden"; } } function inPass(){ pass_mess.style.visibility="visible"; f1.pwd.style.border="1px solid gold"; } function outPass(){ p=f1.pwd.value; f1.pwd.style.border="1px solid AAAAAA"; if(p==""){ pass_mess.style.visibility="hidden"; return; } } function inRPass(){ rpass_mess.style.visibility="visible"; f1.pwd2.style.border="1px solid gold"; } function outRPass(){ p=f1.pwd2.value; f1.pwd2.style.border="1px solid AAAAAA"; if(p==""){ rpass_mess.style.visibility="hidden"; return; } if(!(f1.pwd.value==f1.pwd2.value)){ rpass_mess.innerHTML="两次输入的密码不一致"; rpass_mess.style.color="red"; f1.pwd2.style.color="red"; f1.pwd2.style.border="1px solid red"; repass_ok.style.visibility="hidden"; return; } } function visibe(){ if(f1.visi.checked){ //通过checked属性,能够得到这个复选框是否被选中的Boolean值 pass.style.backgroundColor="FFEEEE"; v=f1.pwd.value; v2=f1.pwd2.value; chang.innerHTML= "<input type='text' name='pwd' class='text' tabindex='2' value='"+v+"' onFocus='inPass()' onBlur='outPass()'/>"; chang2.innerHTML="<input type='text' name='pwd2' class='text' tabindex='2' value='"+v2+"' onFocus='inRPass()' onBlur='outRPass()'/>"; }else{ pass.style.backgroundColor="FFFFFF"; v=f1.pwd.value; v2=f1.pwd2.value; chang.innerHTML="<input type='password' name='pwd' class='text' tabindex='2' value='"+v+"' onFocus='inPass()' onBlur='outPass()'/>"; chang2.innerHTML= "<input type='password' name='pwd2' class='text' tabindex='2' value='"+v2+"' onFocus='inRPass()' onBlur='outRPass()'/>"; } } function keyPass(){ if(f1.pwd.value.length>=6){ pass_mess.style.display="none"; strength.style.display="inline"; sum=checkStrong(f1.pwd.value); if(sum==1){ l.style.backgroundColor="orange"; } if(sum==2){ l.style.backgroundColor="orange"; m.style.backgroundColor="orange"; } if(sum==3){ l.style.backgroundColor="orange"; m.style.backgroundColor="orange"; h.style.backgroundColor="orange"; } } } function checkStrong(Str){ sum=0; reg= /[a-zA-Z]/; if(reg.test(Str)){ sum++; } reg= /\d/; if(reg.test(Str)){ sum++; } reg= /[_-]/; if(reg.test(Str)){ sum++; } return sum; } function inMail(){ mail_mess.style.visibility="visible"; f1.mail.style.border="1px solid gold"; } function outMail(){ mm=f1.mail.value; f1.mail.style.border="1px solid AAAAAA"; if(mm==""){ mail_mess.style.visibility="hidden"; return; } reg=/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; if(reg.test(mm)){ mail_ok.style.visibility="visible"; mail_mess.innerHTML=""; f1.mail.style.color="black"; }else{ mail_mess.innerHTML="邮箱格式不正确"; f1.mail.style.color="red"; f1.mail.style.color="red"; f1.mail.style.border="1px solid red"; mail_ok.style.visibility="hidden"; } } </script> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <!--我们用div显示提示信息的时候,有两种常用的方法,一是事先写好预设的信息到div,将其设置为隐藏,当事件发生的时候,将相应的信息设置成可见。 --> <!--第二种方式使直接用innerHTML写信息到div中 --> <body> <form id="f1"> <div class="label"><b class="s">*</b>用户名:</div> <div class="fi"> <input type="text" name="username" class="text" tabindex="1" onFocus="inUser()" onBlur="outUser()"/> <!--动作:光标进入输入框的事件是onFocus,离开输入框的事件是onBlur --> &nbsp;&nbsp;<label id="username_ok" class="ok"></label><br/> <!--label标签不会再新的一行显示 --> <div id="username_mess" class="clr">4-20位字符,可由中文、英文、数字及"_"、"-"组成</div> <!--事先写好预设的信息到div --> </div> <div id="pass"> <div class="label"><b class="s">*</b>设置密码:</div> <div class="fi"> <div id="chang" style="display:inline"> <input type="password" name="pwd" class="text" tabindex="2" onFocus="inPass()" onBlur="outPass()" onKeyup="keyPass()"/> </div> &nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="visi" id="viewpwd" onClick="visibe()"/> <label id="pass_ok" class="ok"></label> <label class="v">显示密码字符</label><br/> <div id="strength">安全强度: <table class="showStren" align="center"> <tr align="center"> <td id="l" class="ceil">弱</td> <td id="m" class="ceil">中</td> <td id="h" class="ceil">强</td> </tr> </table> </div> <div id="pass_mess" class="clr">6-16位字符,可由英文、数字及"_"、"-"组成</div> </div> <div class="label"><b class="s">*</b>确认密码:</div> <div class="fi"> <div id="chang2"> <input type="password" name="pwd2" class="text" tabindex="3" onFocus="inRPass()" onBlur="outRPass()"/> </div> <label id="rpass_ok" class="ok"></label><br/> <div id="rpass_mess" class="clr">请再次输入密码</div> </div> </div> <div class="label"><b class="s">*</b>邮箱:</div> <div class="fi"> <input type="text" name="mail" class="text" tabindex="4" onFocus="inMail()" onBlur="outMail()"/> <label id="mail_ok" class="ok"></label> &nbsp;&nbsp;&nbsp;&nbsp;<label class="v">免费邮箱:</label> <a href="">搜狐</a> <a href="">网易</a><br/> <div id="mail_mess" class="clr">请输入常用的邮箱,将用来找回密码、接收订单通知等</div> </div> <div class="label"><b class="s">*</b>推荐人用户名:</div> <div class="fi"> <input type="text" name="referrer" class="text" value="可不填" tabindex="5"/><br/><div class="clr"></div> </div> <input type="button" name="pwd2" class="btn-img" id="registsubmit" value="同意一下协议,提交" tabindex="8"/> </form> </body> </html> ```
为什么这个正则表达式一执行,就会非常的卡?
目标 ``` <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@include file="/WEB-INF/base/include.jsp"%> <%@ page import="net.bjqfy.civairdef.web.common.constant.CommonConstant" %> <%String path = request.getContextPath(); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <title><%=CommonConstant.TEST_TITLE_CN%></title> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> <link rel="stylesheet" type="text/css" href="../public/css/style.css"> <link rel="stylesheet" type="text/css" href="../public/jquery-easyui-1.4/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="../public/jquery-easyui-1.4/themes/icon.css"> <link rel="stylesheet" href="../public/css/zTreeStyle/zTreeStyle.css" type="text/css"></link> <script type="text/javascript" src="../public/js/jquery-1.8.0.min.js"></script> <script type="text/javascript" src="../public/js/upload2.js"></script> <script type="text/javascript" src="../public/js/jquery.form.js"></script> <script type="text/javascript" src="../public/jquery-easyui-1.4/jquery.easyui.min.js"></script> <script type="text/javascript" src="../public/jquery-easyui-1.4/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript" src="../public/js/jquery.ztree.core-3.5.js"></script> <script type="text/javascript" src="../public/js/jquery.ztree.excheck-3.5.js"></script> <script type="text/javascript" src="../public/js/jquery.ztree.exedit-3.5.js"></script> <script type="text/javascript" src="../public/js/My97DatePicker/WdatePicker.js"></script> <script type="text/javascript" src="../public/echarts/echarts.min.js"></script> </head> <body leftmargin="0px" topmargin="0" rightmargin="0"> <div id="mainListLayout" style="width: 100%; height: 100%;"> <div data-options="region:'west',title:'日常安全检查'" style="width: 15%;padding-top: 8px;"> <ul id="leftTree"></ul> </div> <div id="ctnMain" data-options="region:'center'" style="border:0px; "> </div> </div> </body> <script type="text/javascript"> $(function(){ initLayout(); initTree(); }); function initLayout(){ $('#mainListLayout').layout(); } function initTree(){ $('#leftTree').tree({ url:'../every/findTree.do', onClick:function(node){ showMain(node); } }); } function showMain(node){ if('安全检查信息管理'==node.text){ changMainContext(node,'../every/findInfoMan.do'); } else if('检查进度图'==node.text){ changMainContext(node,'../every/findProgressMap.do'); } } function changMainContext(node,action){ $('#ctnMain').panel({ href:action }); } function now(){ var date = new Date(); var year = date.getFullYear(); var month = date.getMonth()+1; var day = date.getDate(); var hour = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); return year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second; } </script> </html> ``` 正则 ``` (\s*<head>\s*)(.*\s*)*(</head>) ``` 期望结果 ``` <head> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <title><%=CommonConstant.TEST_TITLE_CN%></title> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> <link rel="stylesheet" type="text/css" href="../public/css/style.css"> <link rel="stylesheet" type="text/css" href="../public/jquery-easyui-1.4/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="../public/jquery-easyui-1.4/themes/icon.css"> <link rel="stylesheet" href="../public/css/zTreeStyle/zTreeStyle.css" type="text/css"></link> <script type="text/javascript" src="../public/js/jquery-1.8.0.min.js"></script> <script type="text/javascript" src="../public/js/upload2.js"></script> <script type="text/javascript" src="../public/js/jquery.form.js"></script> <script type="text/javascript" src="../public/jquery-easyui-1.4/jquery.easyui.min.js"></script> <script type="text/javascript" src="../public/jquery-easyui-1.4/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript" src="../public/js/jquery.ztree.core-3.5.js"></script> <script type="text/javascript" src="../public/js/jquery.ztree.excheck-3.5.js"></script> <script type="text/javascript" src="../public/js/jquery.ztree.exedit-3.5.js"></script> <script type="text/javascript" src="../public/js/My97DatePicker/WdatePicker.js"></script> <script type="text/javascript" src="../public/echarts/echarts.min.js"></script> </head> ``` ![图片说明](https://img-ask.csdn.net/upload/201703/01/1488335689_154452.png) 在客户端的测试工具中可以匹配 但是在Eclipse和正则在线匹配工具中,一执行就会卡死
特殊字符-正则表达式高手请进!
[code="java"]String str1 = "<td height=\"50\" colspan=\"3\" class=\"font_title_16\" style=\"background:url(themes/ssgw/images/daseline.gif) repeat-x bottom;\">"; String str = "<td height=\"50\" colspan=\"3\" class=\"font_title_16\" style=\"background:url(themes/ssgw/images/daseline.gif) repeat-x bottom;\">(.*?)</td>"; System.out.println(str + "\n" + content.indexOf(str1)); Pattern pattern=Pattern.compile(str, Pattern.DOTALL); Matcher matcher = pattern.matcher(content); while(matcher.find()){ System.out.println(matcher.group()); }[/code] 得到的结果为: <td height="50" colspan="3" class="font_title_16" style="background:url(themes/ssgw/images/daseline.gif) repeat-x bottom;">(.*?)</td> 88947 content中实际上是存在这个内容的,但是匹配不到,我判断为标签里面的()之类字符干扰,不知道该如何解决这个问题,还望赐教。。。。
nutch自定义要抓取内容
刚接触nutch,环境是VirtualBox虚拟机安装centos6.5 64位 ,在CentOS下使用svn从官网检出nutch 2.3 。初步的需求就是,根据我自定义的url,通过输入某些关键词(或html标签、或者正则表达式),来把匹配的网页内容抓取下来。后续再进行分析(后话) 我还在学习中,发现nutch2.3版本中,已经用bin/crawl命令取代了老版本的 bin/nutch crawl ,参数列表几乎完全都变了. 我尝试了如下操作: 这是2.3版本的命令参数: bin/crawl Usage: crawl <seedDir> <crawlID> [<solrUrl>] <numberOfRounds> 然后我使用:bin/crawl urls/ MyFirstCrawl http://localhost:8080/solr 6 其中: urls:是我建立的抓取文件所在的上级目录(结构:urls/urls.txt,urls.txt中存了要抓取的页面url) MyFirstCrawl:自定义的crawl名称 solrUrl:这个地址是随便填写的 然后如下错误: /home/release-2.3/runtime/local/bin/nutch generate -D mapred.reduce.tasks=2 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true -topN 50000 -noNorm -noFilter -adddays 0 -crawlId MyFirstCrawl -batchId 1455677914-18990 GeneratorJob: starting at 2016-02-17 10:58:35 GeneratorJob: Selecting best-scoring urls due for fetch. GeneratorJob: starting GeneratorJob: filtering: false GeneratorJob: normalizing: false GeneratorJob: topN: 50000 java.util.NoSuchElementException at java.util.TreeMap.key(TreeMap.java:1221) at java.util.TreeMap.firstKey(TreeMap.java:285) at org.apache.gora.memory.store.MemStore.execute(MemStore.java:125) at org.apache.gora.query.impl.QueryBase.execute(QueryBase.java:73) at org.apache.gora.mapreduce.GoraRecordReader.executeQuery(GoraRecordReader.java:68) at org.apache.gora.mapreduce.GoraRecordReader.nextKeyValue(GoraRecordReader.java:110) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:531) at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:223) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) GeneratorJob: finished at 2016-02-17 10:58:38, time elapsed: 00:00:02 GeneratorJob: generated batch id: 1455677914-18990 containing 0 URLs Generate returned 1 (no new segments created) Escaping loop: no more URLs to fetch now 请问这个错误代表什么?我该怎么样调整。 另外,如果想要完成我开头说的抓取需求 我该做怎样的配置才能实现?
请教一个JVM内存优化的问题
<p>自己写的一个WEB爬虫程序,程序方面的优化我自己感觉做的不错了,各种对象的使用都想办法不让内存浪费。 <br />但还是吃内存吃的很厉害 <br />我想主要的消耗在于,对于每一个爬下来的网页,都要变成String在内存中分析超链接,这个估计很大。 <br />另外对于每一个分析到的URL,都需要保存起来。 <br /><br /><br />我当前使用的内存优化参数如下 <br />-Xms1024M -Xmx1024M -Xmn512M -Xss128K -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxPermSize=128M -XX:NewSize=128M -XX:MaxNewSize=128M -XX:SurvivorRatio=8 <br /><br />机器内存是1G。。上面那堆参数,除了最大最小堆内存我也是不求甚解,不是非常明白我设置了什么。网上搜答案也是五花八门,希望大家能推荐一个内存优化参数的文章 <br />另外我上面设置的参数有哪些方面可以优化,或者哪些地方写的不对。 <br /><br />核心的代码我都贴到下面:(我是刚入门的菜鸟,大家别笑话我写的差哦) <br /><br />这个是主类,负责控制,那个monitor大家就当做System.out.println,其实就是</p> <pre name="code" class="java">package com.wood.core; import java.util.concurrent.*; import java.util.*; import com.wood.core.monitor.*; public class CrawlerController implements Runnable { //一个类,用来管理URL,由各抓取线程共享 private URLMap urlmap; //已成功处理URL总数 private int count; //目标完成任务总数 private int total; //管理所有的抓取线程,必要时进行关闭,由于抓取线程存在I/O读取,而I/0读取中的线程是不可中断的,需调用线程的cancel函数 private Crawler[] crawlers; //线程工厂,可以监视产生的线程工作状态 private CrawlerFactory factory; //线程数目 private int threadMax; //当前活动线程 private int threadActive; //线程执行器 private ExecutorService exec; //当系统关闭时取消 private boolean canceled; public CrawlerController(String seed) { this(seed,20,10000); } public CrawlerController(List&lt;string&gt; seeds) { this(seeds,20,10000); } public CrawlerController(String seed,int threadNum) { this(seed,threadNum,10000); } public CrawlerController(List&lt;string&gt; seeds,int threadNum) { this(seeds,threadNum,10000); } public CrawlerController(String seed,int threadNum,int total) { //初始化URLMap,保存抓取启始位置 urlmap=new URLMap(seed); init(threadNum, total); } public CrawlerController(List&lt;string&gt; seeds,int threadNum,int total) { urlmap=new URLMap(seeds); init(threadNum, total); } //构造 private void init(int threadNum,int total) { //初始完成URL总数为0 count=0; //设置目标完成总数 this.total=total; threadMax=threadNum; threadActive=threadNum; //初始化工作线程 crawlers=new Crawler[threadMax]; String id="Crawler "; for(int i=0;i&lt;threadmax;i++) crawlers[i]="new" crawler(id+(i+1),this,urlmap);="" factory="new" crawlerfactory();="" exec="Executors.newCachedThreadPool(factory);" canceled="false;" }="" 检查当前工作线程状态,并打印系统状态="" private="" boolean="" check()="" {="" if(canceled)="" return="" false;="" int="" count="getCount();" if(count=""&gt;total) { MonitorHolder.getMonitor().print("已抓取"+COUNT+"页面,完成目标任务"+total+"页面\n"); cancel(); return false; } threadActive=factory.getActive(); /*if(threadActive&lt;=0) { MonitorHolder.getMonitor().print("无活动工作线程,抓取任务提前结束\n"); cancel(); return false; }*/ MonitorHolder.getMonitor().print_status("统计信息:成功抓取"+COUNT+"页面,当前活动线程为"+threadActive+"个\n"); return true; } //结束抓取 public void cancel() { //调用每个抓取线程的离开方法 for(Crawler cw:crawlers) cw.cancel(); //销毁工厂 factory.destory(); exec.shutdownNow(); MonitorHolder.getMonitor().print("成功结束抓取工作,共抓取"+getCount()+"页面\n"); this.canceled=true; } public synchronized void count() { count++; } public synchronized int getCount() { return count; } public int getTotal() { return total; } public URLMap getMap() { return urlmap; } @Override public void run() { while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled) { try { MonitorHolder.getMonitor().print("初始化完毕\n"); MonitorHolder.getMonitor().print("开始抓取工作\n"); for(Crawler cw:crawlers) exec.execute(cw); int check_count=0; while (check()){ TimeUnit.SECONDS.sleep(5); check_count++; if(check_count==24) { //每2分钟把待处理URL队列打乱一次 urlmap.shuffle(); MonitorHolder.getMonitor().print("控制信息!!!待抓取URL顺序将打乱\n"); check_count=0; System.gc(); } } } catch (InterruptedException e) { MonitorHolder.getMonitor().print("抓取工作被中断\n"); cancel(); } } } public static void main(String[] args) { List&lt;string&gt; seeds=new ArrayList&lt;string&gt;(15); //问问的各个分类 seeds.add("http://wenwen.soso.com/"); seeds.add("http://wenwen.soso.com/z/c1879048192.htm"); seeds.add("http://wenwen.soso.com/z/c1090519040.htm"); seeds.add("http://wenwen.soso.com/z/c1627389952.htm"); seeds.add("http://wenwen.soso.com/z/c855638016.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c620756992.htm"); seeds.add("http://wenwen.soso.com/z/c553648128.htm"); seeds.add("http://wenwen.soso.com/z/c385875968.htm"); seeds.add("http://wenwen.soso.com/z/c687865856.htm"); seeds.add("http://wenwen.soso.com/z/c16777216.htm"); seeds.add("http://wenwen.soso.com/z/c318767104.htm"); seeds.add("http://wenwen.soso.com/z/c150994944.htm"); seeds.add("http://wenwen.soso.com/z/c922746880.htm"); seeds.add("http://wenwen.soso.com/z/c83886080.htm"); CrawlerController controller=new CrawlerController(seeds,5,2000000); List&lt;string&gt; format=new ArrayList&lt;string&gt;(10); //问问回答问题的格式 format.add("http://wenwen.soso.com/z/q"); controller.getMap().addLimit(format); Thread thread=new Thread(controller); thread.start(); } } </pre> <p><br /></p> <pre name="code" class="java">package com.wood.core; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.*; import java.io.*; import java.net.*; import com.wood.core.monitor.*; public class Crawler implements Runnable { //抓取线程ID private String id; //控制器 private CrawlerController controller; //URL,供各线程共享 private URLMap urlmap; private boolean canceled; //保存抓取的网页内容,用于分析超链接 private String content; //字符集 private String charset; //匹配超链接的正则表达式 private String link_reg="&lt;a\\s+(.*?)href\\s*=\\s*\"?(.*?)[\"(\\s*?)](.*?)&gt;"; private Pattern link_pattern=Pattern.compile(link_reg,Pattern.CASE_INSENSITIVE); //匹配字符集的正则表达式 private String charset_reg="&lt;meta\\s+http-equiv=\"content-type\"\\s+content=\"text html;="" charset="(.*?)\&amp;quot;(.*?)"&gt; "; private Pattern charset_pattern=Pattern.compile(charset_reg, Pattern.CASE_INSENSITIVE); private Pattern dir_path_pattern=Pattern.compile("^\\w+$", Pattern.CASE_INSENSITIVE); //保存当前抓取的URL的主机 private String host; //生成待建立的文件夹名 private String host_path; //抓取网页的根目录 private String root_path="E:\\web"; private File root_dir=new File(root_path); //输入来自URL,输出到文件 private InputStreamReader in=null; private OutputStreamWriter out=null; //输入输出缓冲区 private char[] buf=new char[10240]; //网页内容缓冲区 private StringBuilder contentbuilder=new StringBuilder(1024*1024); //通过一个URL,下载网页内容 private void download(URL url) { in=null; out=null; //建立抓取文件 String urlfile=url.getFile(); if(urlfile.endsWith("/")) urlfile+="indexindex"; File file=new File(host_path,urlfile); File file_dir=new File(file.getParent()); if(!file_dir.exists()) file_dir.mkdirs(); MonitorHolder.getMonitor().print(id+"开始准备下载"+url.toString()+"\n"); try { //打开链接 URLConnection conn=url.openConnection(); //超时30秒 conn.setConnectTimeout(30000); conn.setDoOutput(true); //不是HTML不下载 /*String type=conn.getContentType(); if( (type==null)|| (!type.equals("text/html")) ) return;*/ //将网页内容的缓冲区清空 contentbuilder.setLength(0); in=new InputStreamReader(conn.getInputStream(),charset); out=new OutputStreamWriter(new FileOutputStream(file),charset); int len; //读取网页内容,并写入文件,保存到网页内容缓冲里面 while((len=in.read(buf, 0, 10240)) &gt;0) { out.write(buf, 0, len); //append可以减小系统损耗 contentbuilder.append(buf, 0, len); } out.flush(); //将网页内容缓冲区的内容读到content中,用于分析 content=null; content=contentbuilder.toString(); } catch (IOException e) { MonitorHolder.getMonitor().print("错误!!!"+id+"下载页面"+url.toString()+"错误\n"); } finally{ try { if(in!=null) in.close(); if(out!=null) out.close(); } catch (IOException e) { } in=null; out=null; } } public Crawler(String id,CrawlerController controller,URLMap urlmap) { this.id=id; this.controller=controller; this.urlmap=urlmap; this.charset="utf-8"; canceled=false; MonitorHolder.getMonitor().print(id+"就绪\n"); } //设置字符集,通过正则表达式获取字符集格式 //为了性能,该功能并未使用 private void setCharset() { Matcher matcher=charset_pattern.matcher(content); String CHARSET="GB2312"; if(matcher.find()) CHARSET=matcher.group(1).trim(); this.charset=CHARSET; try { content=new String(content.getBytes("GB2312"),CHARSET); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //从网页内容中分析超链接 private List&lt;string&gt; retrieveLinks(URL url) { List&lt;string&gt; urls=new LinkedList&lt;string&gt;(); if(content==null) return urls; Matcher matcher=link_pattern.matcher(content); String link; String host_reg="http://"+host; String host_nowww; if(host.contains("www")) host_nowww=host.substring(host.lastIndexOf("w")+2); else { host_nowww=host; } while(matcher.find()) { //通过抓取第1组的内容 link=matcher.group(2).trim().toLowerCase(); if (link.length() &lt; 1) { continue; } //网页内部链接,忽略 if (link.charAt(0) == '#') { continue; } //发送邮件链接,忽略 if (link.indexOf("mailto:") != -1) { continue; } if (link.toLowerCase().indexOf("javascript") != -1) { continue; } //分析绝对地址或相对地址 if (link.indexOf("://") == -1){ if (link.charAt(0) == '/') //处理绝对地址 link = "http://" + host+ link; else if(link.startsWith("./")) link="http://" + host+ link.substring(1); else { String file = url.getFile(); String file_path=file.substring(0, file.lastIndexOf('/')); while(link.startsWith("../")) { link=link.substring(link.indexOf("/")+1); file_path=file_path.substring(0, file_path.lastIndexOf("/")); } link="http://"+host+file_path+"/"+link; } } int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); } if(!urlmap.testHost(link)) continue; if(!urlmap.testLimit(link)) continue; urls.add(link); } return urls; } //设置主机并建立目录 private void setHost(String host) { this.host=host; this.host_path=root_path+"\\"+host; File host_dir=new File(host_path); if(!host_dir.exists()) host_dir.mkdirs(); } @Override public void run() { if(!root_dir.exists()) root_dir.mkdirs(); while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled &amp;&amp; (controller.getCount()&lt;controller.gettotal()) )="" {="" try="" {="" 获得一个待抓取的url,如果没有可用url,则进入阻塞状态,该方法调用是线程安全的="" string="" urlstring="urlmap.getURL();" monitorholder.getmonitor().print(id+"开始抓取"+urlstring+"\n");="" 建立url="" url="" url="new" url(urlstring);="" 设置主机="" sethost(url.gethost());="" 清空网页内容,并下贼="" content="null;" download(url);="" 未下载到内容="" if(content="=null)" {="" continue;="" }="" monitorholder.getmonitor().print(id+"抓取"+urlstring+"完毕,进行解析\n");="" setcharset();="" 分析超链接="" list&lt;string=""&gt; urls=retrieveLinks(url); //将分析到的超连接加入到待抓取的URL队列中,并将成功抓取数+1 urlmap.addAll(urls); controller.count(); MonitorHolder.getMonitor().print(id+"解析"+urlstring+"完毕,共计"+urls.size()+"个超链接,开始新任务\n"); content=null; TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { MonitorHolder.getMonitor().print(id+"被中断\n"); canceled=true; } catch (MalformedURLException e) { MonitorHolder.getMonitor().print(id+"报告:URL格式错误\n"); }catch (Exception e) { e.printStackTrace(); } } } //退出,由控制器调用,关闭所有底层I/O资源 public void cancel() { try { if(in!=null) in.close(); } catch (IOException e) { } try { if(out!=null) out.close(); } catch (IOException e) { e.printStackTrace(); } MonitorHolder.getMonitor().print(id+"停止工作\n"); canceled=true; } } </pre> <p> </p> <pre name="code" class="java">package com.wood.core; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.*; import java.util.*; public class URLMap { //待抓取的URL队列 private LinkedList&lt;string&gt; URLQueue; //缓存解析出来的URL,使用Hash方便快速查找,&lt;k,false&gt;表示未抓取,&lt;k,true&gt;表示抓取结束 private HashMap&lt;string,boolean&gt; cachedURL; private HashSet&lt;string&gt; hosts; private HashSet&lt;string&gt; format_limit; //默认构造器,初始化队列,集合 private URLMap() { URLQueue=new LinkedList&lt;string&gt;(); cachedURL=new HashMap&lt;string,boolean&gt;(50000); hosts=new HashSet&lt;string&gt;(20); format_limit=new HashSet&lt;string&gt;(20); } public URLMap(List&lt;string&gt; seeds) { this(); for(String s:seeds) cachedURL.put(s, false); URLQueue.addAll(seeds); for (String string : seeds) { try { URL test=new URL(string); String host=test.getHost(); hosts.add(host); } catch (MalformedURLException e) { e.printStackTrace(); } } } public URLMap(String seed) { this(); cachedURL.put(seed, false); URLQueue.add(seed); try { URL test=new URL(seed); hosts.add(test.getHost()); } catch (MalformedURLException e) { e.printStackTrace(); } } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是线程安全的 public synchronized void addURL(String url) throws InterruptedException { //如果该URL已存在,忽略该URL if(cachedURL.keySet().contains(url)) return; cachedURL.put(url, false); URLQueue.add(url); //有可用URL,唤醒所有阻塞线程 notifyAll(); } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是同步的 public synchronized void addAll(List&lt;string&gt; urls) throws InterruptedException { for (String url : urls) { if(cachedURL.keySet().contains(url)) continue; cachedURL.put(url,false); URLQueue.add(url); } notifyAll(); } //从当前URL队列中获取一个URL,如果当前队列无可用URL,则该线程进入阻塞状态 public synchronized String getURL() throws InterruptedException { //该处进入阻塞 while(URLQueue.size()==0) wait(); //将其从队列中删除 String url=URLQueue.remove(); cachedURL.put(url, true); return url; } public boolean testHost(String host) { for(String host_allow:hosts) { if(host.contains(host_allow)) return true; } return false; } public void addHost(List&lt;string&gt; l) { hosts.addAll(l); } public void addLimit(List&lt;string&gt; l) { format_limit.addAll(l); } public boolean testLimit(String url) { if(format_limit.size()==0) return true; else { for(String s:format_limit) if(url.contains(s)) return true; } return false; } //将待抓取队列打乱 private int swap_check=0; public synchronized void shuffle() { swap_check++; int size=URLQueue.size(); if(size&lt;1000) { java.util.Collections.shuffle(URLQueue); swap_check=0; } else { if(size&gt;=1000 &amp;&amp; size&lt;5000) { if(swap_check==5) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } else { if(swap_check==15) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } } } } </pre> <p><br /><br />附件里是内存使用情况<br /><strong>问题补充</strong><br />主要占用内存的是char[] <br />我的策略是所有分析到的有效URL都存储在HashMap中 <br />但是几万个URL不至于占用大多数内存吧? <br />我的工作线程只有5个,设置的多了,一会就崩了 <br /><br />哪位高人路过,帮我看眼吧 <br />祝你新年好运~</p> <p> </p> <p>附件里是内存占用,缓存的URL总数是20000个,一个大概占用80B,程序内存总数是150MB</p> <p>我不知道到底是什么东西不停的吃内存,回收不掉,程序运行的时间越长,线程数越多,内存吃的越快</p>
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱  极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件,   选择安装到U盘(按照操作无需更改) 三、重启进入pe系统   1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12)     选择需要启
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Nginx 软件层面加强Nginx性能优化的面试问答和解决方案
Nginx 软件层面加强Nginx性能优化的面试问答和解决方案 去年我去爱卡汽车面试PHP,一轮和二轮面的都不错,在三轮面到Nginx的时候很多问题当时不知道怎么回答,确实没有深入学习过,花了一段时间的学习,终于能解答Nginx高性能优化的问题了,10月24号为了获得程序员勋章,发布了半个优化笔记,浏览到了1000+,受到这个鼓舞,我抽时间在仔细整理下关于Nginx性能优化的问题,我们从软件说起。...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
11月19日科技资讯|华为明日发布鸿蒙整体战略;京东宣告全面向技术转型;Kotlin 1.3.60 发布
「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Style 的人工版音频哟。 一分钟速览新闻点! 6G 专家组成员:速率是 5G 的 10 至 100 倍,预计 2030 年商用 雷军:很多人多次劝我放弃WPS,能坚持下来并不是纯粹的商业决定 ...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
化繁为简 - 腾讯计费高一致TDXA的实践之路
导语:腾讯计费是孵化于支撑腾讯内部业务千亿级营收的互联网计费平台,在如此庞大的业务体量下,腾讯计费要支撑业务的快速增长,同时还要保证每笔交易不错账。采用最终一致性或离线补...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
Java学习笔记(七十二)—— Cookie
概述 会话技术: 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器发送资源请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie,把数据存储到客户端 服务器端会话技术:Session,把数据存储到服务器端 Cookie 概念:客户端会话技术,将数据存储到客户端 快速入门: 使用步骤: 创建C
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
@程序员,如何花式构建线程?
作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
强烈推荐10本程序员在家读的书
很遗憾,这个鼠年春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 显示当前目录 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mk
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库
在第2章节中,我们介绍了如何通过Spring Boot来实现HTTP接口,以及围绕HTTP接口相关的单元测试、文档生成等实用技能。但是,这些内容还不足以帮助我们构建一个动态应用的服务端程序。不论我们是要做App、小程序、还是传统的Web站点,对于用户的信息、相关业务的内容,通常都需要对其进行存储,而不是像第2章节中那样,把用户信息存储在内存中(重启就丢了!)。 对于信息的存储,现在已经有非常非常多...
基于Python的人脸自动戴口罩系统
目录 1、项目背景 2、页面设计 3、器官识别 4、退出系统 1、项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
jQuery实现高仿QQ音乐
几个实现的效果看视频吧: bandicam 2020-02-05 16-28-20-127 动图很是不清楚 github地址奉上:https://github.com/tangmusenLiu/Large-warehouse https://github.com/tangmu
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问