有个任务。需要做一个类似网页采集的东西。我在网上找了点资料。(类似于火车头的东西)
现在能做的是:可以把给定的一个静态网页中的源代码给抓取下来。
(刚上手,别嫌弃做得丑啊)
但是对于想抓取的东西不能进行提取。求大神们给个思路。
比如:我想在新浪新闻网页中,把所有的新闻标题给抓取下来。
还有对于新闻标题所对应的的链接。这个新闻的正文网页中的内容也抓取出来。
也就是这个节点下的所有网页全都能抓取下来。最好别弄些太高级的东西。还是新手阶段。

解决方案 »

  1.   

    使用httpclient工具包,非常方便,包括可以登录需要登录的网站,比如论坛,什么的。
    1,使用httpclient连接网页,包括登录获得session。
    2,获取要抓取页面的页面源码。
    3,从页面源码中获取需要的信息。这个可以自己手动写个方法,比如需要的xxxx 在一堆html标记中,反过来根据这些标记定位说要的内容。
      

  2.   

    貌似bing有个爬虫的框架可以用还有其他很多,可以搜一下
      

  3.   


    实例原来写过类似的程序,不过很久以前的手上也没实例,建议去百度上搜索httpclient吧,我当时也是刚开始学java的时候,用这个工具包前面几步都很简单,关键是后面的如何提取自己要的数据。页面节点下的所有文件,那么这个页面应该有个列表什么的,在源码中是有体现的,举个例子,很多列表或者文章上都有“下一页”,要获取下一页的信息,只要定位到这个地方,截取下一页的地址,然后重复上面的工作就行了。怎么定位,楼上说了,用正则去找。正则没你想的那么难,去网上搜一下,有个叫 正则表达式30分钟教程的文本教程,半个小时就能学会。
      

  4.   


    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.regex.*;
    import java.io.*;
    import java.net.URL;
    import java.sql.*;
    class GroupMethod{
    public String regularGroup(String pattern,String matcher){
    Pattern p=Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
    Matcher m=p.matcher(matcher);
    if(m.find()){
    return m.group(1);
    }
    else{
    return "";
    }
    }

    }public class TestCatchWeb extends JFrame{
    JButton 
    b1=new JButton("确定"),
    b2=new JButton("导入到数据库"),
    b3=new JButton("查看数据库");
    JTextField
    t1=new JTextField(30);
    TextArea
    t2=new TextArea(20,80);
    JLabel
    l1=new JLabel("您所查找的网页信息"),
    l2=new JLabel("输入您要查找的网页");
    String strUrl="http://news.sina.com.cn";
    String title;
    String urls;
    int number;
    TestCatchWeb(){
    setTitle("网页抓取");
    JPanel p=new JPanel();
    t1.setText(strUrl);
    b1.addActionListener(new B1());
    t2.setEditable(false);
    //t2.setLineWrap(true);
    p.setLayout(new FlowLayout());
    p.add(t2);p.add(l1);
    p.add(t1);p.add(l2);
    p.add(b1);
    p.add(b2);
    p.add(b3);
    add(p);

    }
    static class WL extends WindowAdapter{
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    }
    class B1 implements ActionListener{

    public void actionPerformed(ActionEvent e){
    catches();
    t2.append("标题是:"+title+"\n");
    t2.append("url地址是:"+urls+"\n");
    t2.append("共收集到"+number+"条信息");
    }
    }

    public void catches(){
    strUrl=t1.getText();
    BufferedReader br;

    try{
    URL url=new URL(strUrl);
    InputStreamReader isr=new InputStreamReader(url.openStream());
    br=new BufferedReader(isr);
    String strRead="";
    String regularTitle="target=._blank.>([\u4E00-\u9FA5].+)</a>";
    String regularUrl="<a href=.(\\w.+). target=._blank.>";
    GroupMethod gMethod=new GroupMethod();
    int i=0;
    while((strRead=br.readLine())!=null){
    String strGet=gMethod.regularGroup(regularTitle,strRead);
    if(!strGet.equals("")){
    title+=strGet+"\n";
    }
    strGet=gMethod.regularGroup(regularUrl, strRead);
    if(!strGet.equals("")){
    urls+=strGet+"\n";
    i++;
    }
    }
                br.close();
                number=i;


    }
    catch(IOException e){
    e.printStackTrace();
    }
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    TestCatchWeb news=new TestCatchWeb();
    news.addWindowListener(new WL());
    news.setSize(300,200);
    news.setVisible(true);
    }}
    简单得用正则写了个代码。但是由于不同标题的格式不一样,所以不能完美提取。还有一些是源代码。大神们指导下。
      

  5.   


    实例原来写过类似的程序,不过很久以前的手上也没实例,建议去百度上搜索httpclient吧,我当时也是刚开始学java的时候,用这个工具包前面几步都很简单,关键是后面的如何提取自己要的数据。页面节点下的所有文件,那么这个页面应该有个列表什么的,在源码中是有体现的,举个例子,很多列表或者文章上都有“下一页”,要获取下一页的信息,只要定位到这个地方,截取下一页的地址,然后重复上面的工作就行了。怎么定位,楼上说了,用正则去找。正则没你想的那么难,去网上搜一下,有个叫 正则表达式30分钟教程的文本教程,半个小时就能学会。大神,我是这样打算的,先将这个网页的所有链接保存到一个数组,然后通过数组的读取,再重复一遍网页抓取的过程,这样合适么。
      

  6.   

    有个小问题,<p data-client="important audit">[<a href="http://news.sina.com.cn/z/2013storm/" target="_blank">抚顺将明日定为哀悼日悼念遇难者</a> <a href="http://news.sina.com.cn/c/2013-08-23/085028026971.shtml" target="_blank">多名网民散布洪灾谣言被拘</a>]</p>
    这一句用我的正则String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>"。会将 <a href="http://news.sina.com.cn/c/2013-08-23/085028026971.shtml" target="_blank">多名网民散布洪灾谣言被拘</a>]</p>后面的也读进来。如果吧正则改成String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>";这样则会把后面的遗漏。因为这是在同一行的。有没有什么好的解决方案
      

  7.   

    jsoup吧 很好用,可通过DOM 取得节点下的所有内容,还有CSS以及类似于jQuery的操作方法来取出和操作数据
    jsoup比httpclient操作要简单的多,只要懂点jquery,很快就上手了。
      

  8.   

    有个小问题,<p data-client="important audit">[<a href="http://news.sina.com.cn/z/2013storm/" target="_blank">抚顺将明日定为哀悼日悼念遇难者</a> <a href="http://news.sina.com.cn/c/2013-08-23/085028026971.shtml" target="_blank">多名网民散布洪灾谣言被拘</a>]</p>
    这一句用我的正则String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>"。会将 <a href="http://news.sina.com.cn/c/2013-08-23/085028026971.shtml" target="_blank">多名网民散布洪灾谣言被拘</a>]</p>后面的也读进来。如果吧正则改成String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>";这样则会把后面的遗漏。因为这是在同一行的。有没有什么好的解决方案
      

  9.   

    您说的一个都不懂。刚上手java。Javascript都还没接触。不过谢谢你的建议。我会去找资料看看的。
      

  10.   

    恩,有时间看看吧,类似于你现在所说的问题,jsoup一句代码就解决了。document.element.select("选取节点");
      

  11.   

    我们公司也提取网页的一些标签,我们老大建议我看这两个htmlclient,htmlparser可能对你有帮助。
      

  12.   

    我博客有HTMLParser的小例子,楼主可以参考参考
    http://blog.csdn.net/jadyer/article/category/1157727
      

  13.   

    说穿了还是匹配问题!还是用正则表达式吧,别怕难,不懂就对照api。
      

  14.   

    楼主无非就是想把一个url地址里面的a标签的文字拿出来并且带上href里面的url地址而已
    请问你去查看jsoup了吗? 他完全不需要你写正则进行匹配获取a标签文字和href链接.
    里面有提供方法.并且也能找到指定的div块内的内容.你所要做的就是分析你要爬取网页源代码的相同和不同点.
      

  15.   

    http://www.open-open.com/jsoup/
    中文api地址
      

  16.   

    楼主无非就是想把一个url地址里面的a标签的文字拿出来并且带上href里面的url地址而已
    请问你去查看jsoup了吗? 他完全不需要你写正则进行匹配获取a标签文字和href链接.
    里面有提供方法.并且也能找到指定的div块内的内容.你所要做的就是分析你要爬取网页源代码的相同和不同点.大师,还没去看呢。现在正则用了一半了,想先用正则把整个的做出来,然后再用您说的jsoup做个改良版的。
      

  17.   

    http://ftp139883.host235.web522.com/index.htm先使用一下这个程序把,随时QQ帮助。