【问题标题】:How do I get the source of a given URL from a servlet?如何从 servlet 获取给定 URL 的来源?
【发布时间】:2011-10-31 14:01:57
【问题描述】:

我想从我的 servlet 中读取给定 URL 的源代码(HTML 标记)。

例如,URL 是http://www.google.com,我的 servlet 需要读取 HTML 源代码。为什么我需要它,我的 Web 应用程序将读取其他网页并获取有用的内容并对其进行处理。

比方说,我的应用程序显示了一个城市中一个类别的商店列表。该列表的生成方式是,我的 Web 应用程序(servlet)通过一个给定的网页,该网页显示各种商店和阅读内容。使用源代码,我的 servlet 过滤源并获取有用的详细信息。最后创建列表(因为我的 servlet 无法访问给定 URL 的 Web 应用程序数据库)。

有知道的解决方法吗? (特别是我需要在 servlet 中执行此操作)如果您认为还有另一种从其他站点获取详细信息的最佳方法,请告诉我。

谢谢

【问题讨论】:

    标签: java html jsp servlets web-scraping


    【解决方案1】:

    查看jsoup 获取和解析 HTML。

    Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
    Elements newsHeadlines = doc.select("#mp-itn b a");
    

    【讨论】:

      【解决方案2】:

      您不需要 servlet 从远程服务器读取数据。您可以只使用java.net.URLjava.net.URLConnection 类从HTTP 服务器读取远程内容。例如,

      InputStream input = (InputStream) new URL("http://www.google.com").getContent();
      

      【讨论】:

        【解决方案3】:

        您尝试执行的操作称为网络抓取。 Kayak 和类似的网站可以做到这一点。一定要在网上搜索它;)在java中你可以做到这一点。

        URL url = new URL(<your URL>);
        
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        
        while ((inputLine = in.readLine()) != null) {
          response.append(inputLine + "\n");
        }
        
        in.close();
        

        响应将为您提供该 URL 返回的完整 HTML 内容。

        【讨论】:

          【解决方案4】:

          有几种解决方案。

          最简单的一种是使用正则表达式。如果您只想从&lt;a href="THE URL"&gt; 之类的标签中提取链接,用户正则表达式(例如&lt;a\s+href\s*=\s*["']?(.*?)["']\s*/&gt;)。 group(1) 包含 URL。现在只需创建 Matcher 并在 matcher.find() 为真时迭代您的文档。

          下一个解决方案是使用 XML 解析器来解析 HTML。如果您的网站是使用格式良好的 HTML (XHTML) 编写的,这将正常工作。由于并非总是如此,因此此解决方案仅适用于选定的站点。

          下一个解决方案是使用 java 内置的 HTML 解析器:http://java.sun.com/products/jfc/tsc/articles/bookmarks/

          接下来,最灵活的方法是使用“真正的”html 解析器,甚至更好的基于 java 的 HTML 浏览器:Java HTML Parsing

          现在这取决于您的任务的详细信息。如果解析静态锚标签就足够了,用户正则表达式。如果没有,请选择以下方式之一。

          【讨论】:

            【解决方案5】:

            正如人们所说,您可以使用核心类 java.net.URL 和 java.net.URLConnection 来获取网页。 但更有用的是 Apache HttpClient。在此处查找文档和示例:http://hc.apache.org/

            【讨论】:

              【解决方案6】:

              如上所述,您不需要 servlet 来实现此目的。 Servlet API 用于响应请求,servlet 容器运行在服务器端。如果我理解你的话,你不需要任何服务器来达到这个目的。您只需要简单的 http 客户端模拟器。我希望以下示例对您有所帮助:

              import java.io.IOException;
              import java.io.InputStream;
              import java.io.UnsupportedEncodingException;
              
              import org.apache.http.HttpResponse;
              import org.apache.http.client.HttpClient;
              import org.apache.http.client.methods.HttpGet;
              import org.apache.http.impl.client.DefaultHttpClient;
              
              public class SimpleHttpClient {
              
              public String execute() {
              
                      HttpClient httpClient = new DefaultHttpClient();
                      HttpGet httpGet = new HttpGet("google.com");
                      StringBuilder content = new StringBuilder();
              
                      try {
                          HttpResponse response = httpClient.execute(httpGet);
              
                          int bufferLength = 1024;
                          byte[] buffer = new byte[bufferLength];
                          InputStream is = response.getEntity().getContent();
              
                          while (is.read(buffer) != -1) {
                              content.append(new String(buffer, "UTF-8"));
                          }
                      } catch (UnsupportedEncodingException e) {
                          e.printStackTrace();
                      } catch (IOException e) {
                          e.printStackTrace();
                      } 
                      return content.toString();
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-02
                • 2018-02-10
                • 2014-05-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多