0

我正在使用Apache HttpComponents来获取一些网页以获取一些抓取的 URL。其中许多 URL 实际上重定向到不同的 URL(例如,因为它们已经使用 URL 缩短器进行了处理)。除了下载内容之外,我还想解析最终的 URL(即提供下载内容的 URL),甚至更好的是,重定向链中的所有 URL。

我一直在查看 API 文档,但不知道在哪里可以挂钩。任何提示将不胜感激。

4

2 回答 2

2

一种方法是通过设置相关参数来关闭自动重定向处理,并通过检查 3xx 响应并手动从响应“Location”标头中提取重定向位置来自行处理。

于 2012-06-24T10:02:05.520 回答
1

这是如何使用 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 请求,该请求导致clientspy.historydeque 中收集 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);
于 2013-05-16T01:14:36.610 回答