如何从 servlet 获取给定 URL 的来源?

Posted

技术标签:

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

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

查看jsoup 获取和解析 HTML。

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

【讨论】:

【参考方案2】:

您不需要 servlet 从远程服务器读取数据。您可以只使用java.net.URL 或java.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();
    

【讨论】:

以上是关于如何从 servlet 获取给定 URL 的来源?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet 获取数据到 EXTJS

如何从给定字符串中获取数组中所有源url的值

获取请求发送者的 URL

请教高手,servlet中如何获取URL中的这种参数

servlet如何获取url传递的参数

servlet如何获取url传递的参数