`
flysnowxf
  • 浏览: 578694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jsoup的源码修改-支持Cookie等头信息的设置

    博客分类:
  • Java
阅读更多
Jsoup是一个开源的html解析工具,使用css子选择器的语法解析元素,比古老的HtmlParser好用很多。在最新版本中,不支持设置Cookie等头信息来访问url,这样一些需要设置Cookie的网页就无法抓取了。为方便使用,我稍微修改了源码。

版本1.2.3中,访问url的api为:
String url = "";
Document doc = Jsoup.parse(new URL(url), 3000);

不能设置Cookie等头信息。

下面我们进行源码的修改。先浏览源码:
Jsoup.parse的源码为:
   public static Document parse(URL url, int timeoutMillis) throws IOException {
        return DataUtil.load(url, timeoutMillis);
    }

DataUtil.load的源码为:
    static Document load(URL url, int timeoutMillis) throws IOException {
        String protocol = url.getProtocol();
        Validate.isTrue(protocol.equals("http") || protocol.equals("https"), "Only http & https protocols supported");

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setInstanceFollowRedirects(true);
        conn.setConnectTimeout(timeoutMillis);
        conn.setReadTimeout(timeoutMillis);
        conn.connect();

很明显,调用HttpURLConnection.setRequestProperty来设置头信息即可。

我在DataUtil.java中重载了load函数,并抽取了一个公用方法,如下:
    static Document load(URL url, Map<String, String> requestMap, int timeoutMillis) throws IOException {
        String protocol = url.getProtocol();
        Validate.isTrue(protocol.equals("http") || protocol.equals("https"), "Only http & https protocols supported");

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setInstanceFollowRedirects(true);
        conn.setConnectTimeout(timeoutMillis);
        conn.setReadTimeout(timeoutMillis);
        // set request prop
        for (String key : requestMap.keySet()) {
			conn.setRequestProperty(key, requestMap.get(key));
		}
        conn.connect();
        
        return load(url, conn);
    }

    static Document load(URL url, int timeoutMillis) throws IOException {
        String protocol = url.getProtocol();
        Validate.isTrue(protocol.equals("http") || protocol.equals("https"), "Only http & https protocols supported");

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setInstanceFollowRedirects(true);
        conn.setConnectTimeout(timeoutMillis);
        conn.setReadTimeout(timeoutMillis);
        conn.connect();

        return load(url, conn);
    }
    
    private static Document load(URL url, HttpURLConnection conn) throws IOException {
        int res = conn.getResponseCode();
        if (res != HttpURLConnection.HTTP_OK)
            throw new IOException(res + " error loading URL " + url.toString());
        
        String contentType = conn.getContentType();
        if (contentType == null || !contentType.startsWith("text/"))
            throw new IOException(String.format("Unhandled content type \"%s\" on URL %s. Must be text/*", 
                    contentType, url.toString()));
        
        InputStream inStream = new BufferedInputStream(conn.getInputStream());
        String charSet = getCharsetFromContentType(contentType); // may be null, readInputStream deals with it

        Document doc = readInputStream(inStream, charSet, url.toExternalForm());
        inStream.close();
        return doc;
    }

我在Jsoup.java中重载了parse函数:
    public static Document parse(URL url, Map<String, String> requestMap, int timeoutMillis) throws IOException {
        return DataUtil.load(url, requestMap, timeoutMillis);
    }

完成以上修改了,编写ant脚本打jar包即可。

调用例子:
		String url = "";
		Map<String, String> requestMap = new HashMap<String, String>();
		requestMap.put("Cookie", "");
		Document doc = Jsoup.parse(new URL(url), requestMap, 3000);

这样就可以设置Cookie信息了,可解决需要登录验证的页面爬取问题。
分享到:
评论

相关推荐

    httpClient采集jsoup解析

    HttpClient可以设置Cookie和User-Agent来模拟浏览器行为,而Jsoup则可以通过执行JavaScript来处理动态加载的内容。同时,为了避免被目标网站封禁,应合理控制请求频率,并可能需要使用代理IP。 总的来说,...

    jsoup step to step 模拟登陆

    4. 错误处理和异常管理,确保代码能够应对网络异常、登录失败等常见问题。 对于想通过Android应用访问网页数据的开发者,该文档提供了很有价值的教程和例子。文章作者Brent Ward希望通过分享他们的经验,帮助其他...

    HttpClient + Jsoup 模拟登陆,解析HTML,信息筛选(广工图书馆)

    Jsoup能帮助我们提取和操作数据,如查找特定标签、提取文本、修改DOM结构等,是网页数据抓取和信息筛选的理想选择。 以下是一个简单的使用HttpClient和Jsoup模拟登录广工图书馆网站的步骤: 1. **获取登录页面**:...

    搜索链接Java网络爬虫(蜘蛛)源码-zhizhu.rar

    它提供了丰富的功能,如设置请求头、处理Cookie、处理重定向等,使得网络爬虫能更灵活地应对复杂的网站结构。 【HtmlUnit库】 HtmlUnit是一个无头浏览器,它模拟了Web浏览器的许多行为,包括JavaScript执行。在...

    搜索链接Java网络爬虫(蜘蛛)源码-zhizhu.zip

    使用HttpURLConnection或者Apache HttpClient库,可以发送GET和POST请求,处理响应头和响应体,实现登录、表单提交等复杂操作。 4. **HTML解析**:HTML解析是爬虫的关键步骤,通常使用DOM、SAX或JSoup等解析库。...

    java模拟淘宝登录源码

    - **设置Cookie策略**:淘宝登录可能涉及到Cookie管理,HTTPClient需要正确处理服务器返回的Cookie,因此需要设置合适的Cookie策略。 - **执行POST请求**:发送POST请求到登录接口,模拟提交表单。 - **处理响应*...

    jsoup 实现浏览器网页另存为

    - 如果遇到编码问题,可以设置`Jsoup.connect(url).charset("UTF-8")`来指定字符集。 - JSoup默认使用GET方法,若需POST或其他HTTP方法,可使用`method()`方法。 ### 七、拓展应用 除了实现“网页另存为”,JSoup...

    毕业设计 计算机专业-Java 搜索链接Java网络爬虫(蜘蛛)源码-zhizhu

    8. **反爬机制与IP代理**:很多网站会设置反爬机制,如验证码、User-Agent限制等。Java爬虫可能需要模拟浏览器行为,使用代理IP来应对这些挑战。 9. **数据存储**:抓取的数据通常需要存储,可以选择数据库(如...

    ajax调用java实例源码-java-curl:纯JavaCURL实现

    线程中的cookie-store可以序列化保存,方便设置cookie池。 支持HTTPS; 支持自签名证书(JKS/BKS); 支持忽略证书安全检查。 支持按连接代理; 支持 HTTP/HTTPS 代理授权。 可以控制重定向行为,可以获取每个重定向...

    爬虫crawler4j源码+实例

    - **Cookie支持**: `crawler4j` 支持处理网页的Cookie,这对于某些需要登录或依赖会话状态的网站来说很有用。 - **User-Agent和HTTP头部**: 可以自定义User-Agent和其他HTTP头部,以模拟不同浏览器或设备。 - **...

    QQ加群好友源码

    在IT行业中,这种源码通常是由程序员编写,用于批量处理QQ账号的社交操作,例如网络营销、数据分析或者社群管理等场景。以下是这个源码可能涉及的关键知识点: 1. **网络编程**:源码会涉及到HTTP或TCP/IP协议,...

    Java网络爬虫源码

    Java爬虫需要模拟浏览器行为,例如设置User-Agent,使用Cookie管理,甚至处理JavaScript动态加载的内容。 8. **异常处理与日志记录(Exception Handling & Logging)**:良好的错误处理和日志记录机制是爬虫稳定...

    java爬虫模拟登陆源码

    成功登录通常意味着服务器返回了登录后的页面,或者设置了特定的Session或Cookie。 4. **保存Session和Cookie**:登录成功后,爬虫需要保存服务器返回的Session ID或Cookie,以便在后续的网页抓取中保持登录状态。 ...

    发帖器源码

    9. **开源许可**:【风烈1开源说明.txt】中的内容可能会介绍该项目使用的开源许可证,如MIT、Apache 2.0、GPL等,这些许可证规定了源码的使用、修改和分发规则。 10. **版本控制**:源码的管理通常会使用Git等版本...

    android 爬虫程序源码

    - **反爬虫策略**:处理验证码、IP限制等问题,可能需要模拟浏览器行为,如设置User-Agent,延时请求等。 6. **异常处理与错误恢复**: - **网络异常**:处理网络中断、超时等问题,确保程序的健壮性。 - **解析...

    爬虫代码实例源码大全(纯源码不带视频的实例)

    - 如何处理动态加载的内容,可能需要结合Selenium或Jsoup等工具。 - 如何利用requests库进行HTTP请求,处理响应数据。 - 如何实现分布式爬虫,提高抓取速度和稳定性。 通过深入研究这些源码,你将能够逐步掌握爬虫...

    Java爬虫详细完整源码实例

    这些库提供了发送GET、POST请求,设置请求头,处理cookies等功能。 2. **HTML解析**:抓取到的网页内容是HTML格式,需要解析成DOM树以便提取所需信息。Java中常用的HTML解析库有Jsoup,它提供了一种简洁的API来解析...

    Java爬虫实例完整源码

    如果目标网站需要登录,可以使用HttpURLConnection设置Cookie或者使用模拟登录的方式。 此外,爬虫的效率和并发控制也很重要。Java提供了多线程机制,可以利用`java.util.concurrent`包中的工具类,如`...

    最简单的爬虫-WebMagic 0.73 源码

    webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),支持多线程抓取,分布式抓取,并支持自动重试、自定义UA/cookie等功能。作为爬虫框架,它使用httpclient作为...

    Java网络蜘蛛(爬c)源码.zip

    这可能涉及到处理请求头、设置代理、处理Cookie等操作。 3. 内容获取:爬虫接收到HTTP响应后,获取响应的内容,通常是HTML、XML或JSON等格式的文档。 4. 内容解析:使用HTML解析器(如Jsoup)解析网页内容,提取需要...

Global site tag (gtag.js) - Google Analytics