周乐:使用Nutch能抓取针对性的内容吗
马士兵的回答:
可以,修改一下nutch的插件就行了。由于好久没你那个nutch了,那时候还是1.0,不过nutch在spider这块的插件应该没什么变动。 首先你要知道你要抓取的新闻的div 修改parse-html插件,HtmlParser.java这个文件。因为我这边没有环境,刚从官网上下了个1.7的源码,对着里面的和你说。我们要修改的方法是private DocumentFragment parse(InputSource input) 这个方法,你可以debug一下,input里面,就是抓取的页面里的内容,(如果不是,你再从其他的方法里找找) 然后创建一个分析input的方法。在里面用htmlparser把你要的结构拿出来。不过htmlarser有BUG,而且很久都没有更新了,建议你用Jsoup。我的日志里面用的是htmlparser,所以你改改就可以。 public InputSource getinput(InputSource input){ String str=""; try { BufferedReader isr = new BufferedReader(newInputStreamReader(input.getByteStream(),"utf-8")); while(isr.ready()){ str+=(char)isr.read(); } } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Parser p = new Parser(str); p.setEncoding("utf-8"); NodeFilter filter=new AndFilter(newTagNameFilter("div"),new HasAttributeFilter("class","mconleft")); NodeList nodelist=p.parse(filter); NodeIterator it=nodelist.elements(); if(!it.hasMoreNodes()){ input.setByteStream(newByteArrayInputStream(str.getBytes("utf-8"))); return input; } while(it.hasMoreNodes()){ Node node=(Node)it.nextNode(); input.setByteStream(newByteArrayInputStream(node.toHtml().getBytes("UTF-8"))); } } catch (ParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return input; } 从代码上你能看到,我这里只抓取 DIV的class叫mconleft的。把你要抓取的新闻的div替换这块就可以了,然后将方法应用的parse(InputSource input)里面,然后从新ant一下nutch,把war包放到tomat下面试试。 基本上就是这样了,可能还有其他的更简单的方法。当时急着用nutch,就没具体的研究,现在也不弄了,呵呵 纯手打,希望能帮到你
孙焱的回答:
可以,修改一下nutch的插件就行了。由于好久没你那个nutch了,那时候还是1.0,不过nutch在spider这块的插件应该没什么变动。 首先你要知道你要抓取的新闻的div 修改parse-html插件,HtmlParser.java这个文件。因为我这边没有环境,刚从官网上下了个1.7的源码,对着里面的和你说。我们要修改的方法是private DocumentFragment parse(InputSource input) 这个方法,你可以debug一下,input里面,就是抓取的页面里的内容,(如果不是,你再从其他的方法里找找) 然后创建一个分析input的方法。在里面用htmlparser把你要的结构拿出来。不过htmlarser有BUG,而且很久都没有更新了,建议你用Jsoup。我的日志里面用的是htmlparser,所以你改改就可以。 public InputSource getinput(InputSource input){ String str=""; try { BufferedReader isr = new BufferedReader(newInputStreamReader(input.getByteStream(),"utf-8")); while(isr.ready()){ str+=(char)isr.read(); } } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Parser p = new Parser(str); p.setEncoding("utf-8"); NodeFilter filter=new AndFilter(newTagNameFilter("div"),new HasAttributeFilter("class","mconleft")); NodeList nodelist=p.parse(filter); NodeIterator it=nodelist.elements(); if(!it.hasMoreNodes()){ input.setByteStream(newByteArrayInputStream(str.getBytes("utf-8"))); return input; } while(it.hasMoreNodes()){ Node node=(Node)it.nextNode(); input.setByteStream(newByteArrayInputStream(node.toHtml().getBytes("UTF-8"))); } } catch (ParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return input; } 从代码上你能看到,我这里只抓取 DIV的class叫mconleft的。把你要抓取的新闻的div替换这块就可以了,然后将方法应用的parse(InputSource input)里面,然后从新ant一下nutch,把war包放到tomat下面试试。 基本上就是这样了,可能还有其他的更简单的方法。当时急着用nutch,就没具体的研究,现在也不弄了,呵呵 纯手打,希望能帮到你
他会腻,我何必的回答:
1、nutch适合于漫爬型的爬虫,对内容没有精准或块的挑选,如果想要精准的内容模块的话,往往还是定制爬虫的合适。 2、像楼主的需求,更应该是爬到页面后,在分析阶段去解析和过滤之后,得到最后想要的东西。 比较简洁,不知能解决问题否。 再看看别人怎么说的。