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

时间:2011-08-21 12:35:53

标签: java html jsp servlets web-scraping

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

例如,URL为http://www.google.com,我的servlet需要读取HTML源代码。为什么我需要这个,我的网络应用程序将阅读其他网页并获取有用的内容并使用它做一些事情。

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

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

谢谢

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

查看jsoup以获取和解析HTML。

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

答案 2 :(得分:2)

您要做的是称为网络抓取。皮划艇和类似的网站做到了这一点。在网上搜索它;)在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内容。

答案 3 :(得分:1)

如上所述,您不需要为此目的使用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();
    }
}

答案 4 :(得分:0)

有几种解决方案。

最简单的是使用正则表达式。如果您只想从<a href="THE URL">用户正则表达式(如<a\s+href\s*=\s*["']?(.*?)["']\s*/>)等标记中提取链接。组(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 :(得分:0)

正如人们所说,您可以使用核心类java.net.URL和java.net.URLConnection来获取网页。 但是对于这个目的更有用的是Apache HttpClient。寻找文档&amp;示例:http://hc.apache.org/