如何从 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】:有几种解决方案。
最简单的一种是使用正则表达式。如果您只想从<a href="THE URL">
之类的标签中提取链接,用户正则表达式(例如<a\s+href\s*=\s*["']?(.*?)["']\s*/>
)。 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 的来源?的主要内容,如果未能解决你的问题,请参考以下文章