背景:开发一个web版的爬虫系统,没用heritrix,nutch等开源框架,采用的是jsp+servlet。
目标:根据指定网址和关键词,爬出与关键词相关的链接还有内容,并将与关键词相关的那部分文本和url存到数据库当中(已使用jsoup除去html标记和js,css之类的,只存文本)。
用户jsp页面输入url,keywords提交post请求,服务器端servlet调用爬虫方法crawer()。
想达到的效果:
1.客户端可以实时观察查询结果,并能暂停或停止该任务。
2.客户端建立任务,这些任务可以定时运行或以排队运行。
开发中遇到的问题:
crawer()方法执行时间很长,而且有请求网址的操作。
如果把该方法放在doPost()中,会发生提交后无法进行其他的操作,
如果以线程的方式启动这个方法,又会发生线程不安全的状况,也就是说这期间有人进行
请求执行了crawer()方法,结果会比较混乱,而servlet本身并非线程安全的。
1.的效果很难达到,暂时的解决方案是craw()方法中想办法,限定爬行深度和爬行网页数目,让它爬完整个网站就停止,有这种网络操作的线程也根本无法被中断掉。
crawer()实际上使用的深度(纵向)爬取
2.排队这个更难理解,因为通常的java web应用都是请求响应式的,发现servlet和常见的ssh根本不适用眼下的情形。
----------------------------------------------------------------------------------
眼只有我一个人弄这个,精力实在有限。一个多线程就反复看了很多遍,越看越迷糊,结果是像这类带网络访问的没法暂停或停止,只能等它执行完后自己停掉。
想达到这样的一个效果,如果使用开源框架heritrix+lucene,就涉及到了radius和负载均衡之类的,如果想实现任务排队的,倒也有个rabbitMQ,技术多到眼花缭乱,也很不容易上手,而我的这个并不需要性能能有多高,这也是我为什么选用jsp+servlet来做的原因,只求能有点项目的模样。
只能寄希望各位开发大牛,只要能提供一点想法就非常感谢了。
如果你们有这样的一个需求,会考虑什么思路来做?
frameborder="0" src="http://tpc.googlesyndication.com/safeframe/1-0-2/html/container.html#xpc=sf-gdn-exp-1&p=http%3A//bbs.csdn.net" id="google_ads_iframe_/8456/IDG.CN_B2B_csdn.net_0" title="3rd party ad content" name="1-0-2;81628;
-
|
|
Sync Home & Office PCs In 1 Step. UI In 30 Languages. Download Now!
|
|
scrolling="no" frameborder=0 height=0 width=0 src="http://cm.g.doubleclick.net/push?client=ca-pub-7443704194229694" style="position:absolute">
我们将对此广告进行审核,以便改善您在今后的体验。
建议您更新
广告设置,以便我们为您展示更合适的广告。
我们会根据您的反馈审核此网站上的广告。
建议您更新
广告设置,以便我们为您展示更合适的广告。
即将关闭广告:%1$d 秒
{"uid":1,"hostPeerName":"http://bbs.csdn.net","initialGeometry":"{\"windowCoords_t\":0,\"windowCoords_r\":1349,\"windowCoords_b\":557,\"windowCoords_l\":0,\"frameCoords_t\":1357,\"frameCoords_r\":1128.5,\"frameCoords_b\":1447,\"frameCoords_l\":400.5,\"styleZIndex\":\"auto\",\"allowedExpansion_t\":0,\"allowedExpansion_r\":0,\"allowedExpansion_b\":0,\"allowedExpansion_l\":0,\"xInView\":0,\"yInView\":0}","permissions":"{\"expandByOverlay\":false,\"expandByPush\":false,\"readCookie\":false,\"writeCookie\":false}","metadata":"{\"shared\":{\"sf_ver\":\"1-0-2\",\"ck_on\":1,\"flash_ver\":\"18.0.0\"}}","reportCreativeGeometry":false}" scrolling="no" marginwidth="0" marginheight="0" width="728" height="90" data-is-safeframe="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom;">
-
id="iframeu1636200_0" src="http://pos.baidu.com/ecom?rdid=1636200&dc=2&exps=112102&di=u1636200&dri=0&dis=0&dai=2&ps=1463x744&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1458226791925&ti=%E5%BD%93JAVA%20WEB%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%9C%89%E4%B8%80%E4%B8%AA%E6%89%A7%E8%A1%8C%E6%97%B6%E9%97%B4%E9%95%BF%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x1493&cfv=0&cpl=42&chi=1&cce=true&cec=UTF-8&tlm=1458226792<u=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390660824<r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D8LNJ19vLevIOOgm82Q2kSqH_7g9jLsHT1zpe2rfF2Q2ip7jFHqJQd9KmZPgfTPzy%26wd%3D%26eqid%3Df0784cde000570bb0000000256eac65d&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=113&col=zh-CN&cdo=-1&tcn=1458226792&qn=fd328e1073dab2a6&tt=1458226791839.291.320.321" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;">
-
id="iframeu1636201_0" src="http://pos.baidu.com/ecom?rdid=1636201&dc=2&exps=112102&di=u1636201&dri=0&dis=0&dai=3&ps=1485x866&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1458226791925&ti=%E5%BD%93JAVA%20WEB%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%9C%89%E4%B8%80%E4%B8%AA%E6%89%A7%E8%A1%8C%E6%97%B6%E9%97%B4%E9%95%BF%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x1522&cfv=0&cpl=42&chi=1&cce=true&cec=UTF-8&tlm=1458226792<u=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390660824<r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D8LNJ19vLevIOOgm82Q2kSqH_7g9jLsHT1zpe2rfF2Q2ip7jFHqJQd9KmZPgfTPzy%26wd%3D%26eqid%3Df0784cde000570bb0000000256eac65d&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=113&col=zh-CN&cdo=-1&tcn=1458226792&qn=71f7eba60258632b&tt=1458226791839.381.479.479" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;">
-
id="iframeu1636204_0" src="http://pos.baidu.com/ecom?rdid=1636204&dc=2&exps=112102&di=u1636204&dri=0&dis=0&dai=4&ps=1485x888&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1458226791925&ti=%E5%BD%93JAVA%20WEB%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%9C%89%E4%B8%80%E4%B8%AA%E6%89%A7%E8%A1%8C%E6%97%B6%E9%97%B4%E9%95%BF%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=1&dbv=2&drs=1&pcs=1349x557&pss=1349x1522&cfv=0&cpl=42&chi=1&cce=true&cec=UTF-8&tlm=1458226792<u=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390660824<r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D8LNJ19vLevIOOgm82Q2kSqH_7g9jLsHT1zpe2rfF2Q2ip7jFHqJQd9KmZPgfTPzy%26wd%3D%26eqid%3Df0784cde000570bb0000000256eac65d&ecd=1&psr=1366x768&par=1366x706&pis=-1x-1&ccd=24&cja=true&cmi=113&col=zh-CN&cdo=-1&tcn=1458226792&qn=21ffb1cc71762463&tt=1458226791839.477.503.504" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;">