我正在使用Apache HttpComponents来获取一些网页以获取一些抓取的 URL。其中许多 URL 实际上重定向到不同的 URL(例如,因为它们已经使用 URL 缩短器进行了处理)。除了下载内容之外,我还想解析最终的 URL(即提供下载内容的 URL),甚至更好的是,重定向链中的所有 URL。
我一直在查看 API 文档,但不知道在哪里可以挂钩。任何提示将不胜感激。
我正在使用Apache HttpComponents来获取一些网页以获取一些抓取的 URL。其中许多 URL 实际上重定向到不同的 URL(例如,因为它们已经使用 URL 缩短器进行了处理)。除了下载内容之外,我还想解析最终的 URL(即提供下载内容的 URL),甚至更好的是,重定向链中的所有 URL。
我一直在查看 API 文档,但不知道在哪里可以挂钩。任何提示将不胜感激。
一种方法是通过设置相关参数来关闭自动重定向处理,并通过检查 3xx 响应并手动从响应“Location”标头中提取重定向位置来自行处理。
这是如何使用 Apache HttpComponents 进行操作的完整演示。
您需要DefaultRedirectStrategy
像这样扩展:
class SpyStrategy extends DefaultRedirectStrategy {
public final Deque<URI> history = new LinkedList<>();
public SpyStrategy(URI uri) {
history.push(uri);
}
@Override
public HttpUriRequest getRedirect(
HttpRequest request,
HttpResponse response,
HttpContext context) throws ProtocolException {
HttpUriRequest redirect = super.getRedirect(request, response, context);
history.push(redirect.getURI());
return redirect;
}
}
expand
方法发送一个 HEAD 请求,该请求导致client
在spy.history
deque 中收集 URI,因为它自动遵循重定向:
public static Deque<URI> expand(String uri) {
try {
HttpHead head = new HttpHead(uri);
SpyStrategy spy = new SpyStrategy(head.getURI());
DefaultHttpClient client = new DefaultHttpClient();
client.setRedirectStrategy(spy);
// FIXME: the following completely ignores HTTP errors:
client.execute(head);
return spy.history;
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
您可能希望将最大重定向数设置为合理的值(而不是默认值 100),如下所示:
BasicHttpParams params = new BasicHttpParams();
params.setIntParameter(ClientPNames.MAX_REDIRECTS, 5);
DefaultHttpClient client = new DefaultHttpClient(params);