比如我已通过url读取到了某个网站的主页(内有新闻模块),现在我想抓取这个新闻模块里的所有网页,程序应该怎么写?那位能举个简单例子?另外,如何做到实时抓取,也就是当对方网站更新时,我的抓取程序也自动抓取更新后的网页?解决问题者,给200分,决不食言!

解决方案 »

  1.   

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page import="java.io.*,java.net.URL"%>
    <% 
     URL url = new URL("http://www.itpub.net");//建立URL对象,并实例化为url,获得要抓取的网页地址
     BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"GB2312"));//建立BufferedReader对象,并实例化为reader,这里的GB2312是要抓取的网页编码格式
     while(reader.ready())
     {
      out.println(reader.readLine());
     }
     reader.close();
    %>URL url = new URL("http://www.itpub.net");//http://www.itpub.net就是你想抓的网页地址
    reader 对象就是读取到该网页的内容,下面是循环输出,你可以进行过滤找到你需要的内容,小偷程序其实就是远程读取文件 out.println(reader.readLine());
    这时你看到的网页内容实际上已经是你本机的代码了,而不是itpub上的主页了,图片显示不出来就是这个原因,现在就好办了,它的代码你都得到了,那么你想要什么东东就可以把它找出来了LZ说实时更新,那你加个定时器好了,比如一个小时检查一次,检查是否和上次检查时内容一样,如果不一样就抓取下来
      

  2.   

    2楼正解、
    当然,还有很多细节的东西,要你自己再写的啦。
    你在抓前要判断是那种方式请求,有HTTP、Get、Post等等啦。
    还需要检查提交的url地址格式是否正确,并将其为参数创建URL对象、组装socket提交的头部信息等。不是一个简单的程序啦。
    最好单独写个类封装起来,不要写在JSP上面。
      

  3.   

    转:interpb(曾曾胡,深怕情多累美人!) 
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLConnection;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class Thrief extends HttpServlet {/**
     * Constructor of the object.
     */
    public Thrief() {
    super();
    }/**
     * Destruction of the servlet. <br/>
     */
    public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
    }/**
     * The doGet method of the servlet. <br/>
     * 
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {String url = request.getParameter("url");
    System.out.println(url);
    URLConnection con = new URL(url).openConnection();
    PrintWriter out = response.getWriter();
    BufferedReader br = new BufferedReader(new InputStreamReader(con
    .getInputStream()));String content = br.readLine();while (content != null) {
    out.write(content);
    content = br.readLine();}
    out.flush();out.close();
    }/**
     * The doPost method of the servlet. <br/>
     * 
     * This method is called when a form has its tag value method equals to
     * post.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out
    .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println("  <BODY>");
    out.print("    This is ");
    out.print(this.getClass());
    out.println(", using the POST method");
    out.println("  </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
    }/**
     * Initialization of the servlet. <br/>
     * 
     * @throws ServletException
     *             if an error occure
     */
    public void init() throws ServletException {
    // Put your code here
    }}
    写另一个servlet传入参数就可以
      

  4.   

    liaohaiying(大菜) ( ) 信誉:100    
    --------
    能不能提供一个思路?或随便找一个网站为例,讲一下最简单的实现方法?
      

  5.   

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page import="java.io.*,java.net.URL"%>
    <%@ page import="java.util.regex.Pattern,java.util.regex.Matcher"%>
    <% 
     URL url = new URL("http://www.jslottery.com/showgg.asp?id=4692");//建立URL对象,并实例化为url,获得要抓取的网页地址
     BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"GB2312"));//建立BufferedReader对象,并实例化为reader,这里的GB2312是要抓取的网页编码格式
     String so="";
     while(reader.ready())
     {
         String regEx="<(.[^>]*)>"; //表示html标签
         Pattern p=Pattern.compile(regEx); 
         Matcher m=p.matcher(reader.readLine()); 
         String s=m.replaceAll(""); 
         //out.println(s);
         so=so+s;
     }
     Pattern p=Pattern.compile("::"); 
     Matcher m=p.matcher(so); 
     so=m.replaceAll(""); 
     
     p=Pattern.compile("中国福利彩票“双色球”开奖公告"); 
     m=p.matcher(so); 
     so=m.replaceAll("::"); 
     
     p=Pattern.compile("中奖情况:"); 
     m=p.matcher(so); 
     so=m.replaceAll("::"); 
     
     p=Pattern.compile("::"); 
     String[] r=p.split(so);
      
     out.println(r[1]);
     reader.close();
    %>
      

  6.   

    上述代码如果在对方网络不通的情况下也会导致你网页出现问题,最好通过try{}来处理,一旦异常就指向别的地方
      

  7.   

    看看这个 http://www.haolla.com/girls/index.asp
             http://haolla.com/wy
      

  8.   

    在抓到对方首页之后,
    提取所有指向本站超链接,
    再就是分析一下哪些超链接是属于新闻模块的,至于怎么分析,就很烦了,各网站的新闻模块肯定是不一样的,你可能要事先收集一大堆的网站的新闻模块的识别标记然后,就是对属于闻新模块这些超链接一个一个的抓,再一个一个的去提取属于新闻模块的URL
    没抓过的就再抓,己经抓过的就不再抓了
    重复再重复
    直到找不到己经没有抓过的链接为止如果对方网站的页面很多,那实时抓取的话,就不太现实了,太耗时间太耗性能
    10天半个月一次倒还差不多
    给楼主一个建议,如果对方网站提供了RSS,直接读RSS不更好吗
      

  9.   

    提取页面中的超链接
    ======String input = "从一个URL中读出来的网页内容";List<String> hrefs = new ArrayList<String>(); //保存提取出来的URL
    input = input.replaceAll("\\\"", "");
    input = input.replaceAll("\\'", "");
    int s = input.indexOf("href");
    while(s!=-1){
        input = input.substring(s+4);
        int e = input.indexOf(">");
        String temp = input.substring(0,e);
        temp = temp.replaceAll("\\=", "").trim();
        e = temp.indexOf(" ");
        if(e!=-1)
            temp = temp.substring(0,e);
        hrefs.add(temp);
        s = input.indexOf("href");
    }

    for(String ss: hrefs)
       System.out.println(ss);随便写了一下,楼主自己优化算法另外,还可以用正则表达式来提取判断是否新闻模块的超链,这就需要视具体情况而定,反正就是在这些URL上打主意
      

  10.   

    String regex="a\\s*href\\s*=\"\\s*([^\"]*)\\s*\"[^>]*>([^<]*)\\s*<\\/a>";
    Pattern p=Pattern.compile(regex);
    Matcher m=p.matcher(str);
    while(m.find())
    ...
    ...
    现写了一个,楼主测试一下试试
      

  11.   

    yesjsb()
    =========
    试了一下,有些链接能提取出来,有些不能,不过终于找到了思路,谢谢,揭帖!