`

一种解决HTTP抓取网页超时设置无效的方法

阅读更多

今天发现superword在获取单词定义的时候,对于不常见单词,网页打开很慢,超过10秒,经检查,发现是利用Jsoup来抓取单词定义的时候,设置的超时3秒无效,_getContent方法的执行时间超过10秒,代码如下:

 

    public static String getContent(String url) {
        String html = _getContent(url);
        int times = 0;
        while(StringUtils.isNotBlank(html) && html.contains("非常抱歉,来自您ip的请求异常频繁")){
            //使用新的IP地址
            ProxyIp.toNewIp();
            html = _getContent(url);
            if(++times > 2){
                break;
            }
        }
        return html;
    }

    private static String _getContent(String url) {
        Connection conn = Jsoup.connect(url)
                .header("Accept", ACCEPT)
                .header("Accept-Encoding", ENCODING)
                .header("Accept-Language", LANGUAGE)
                .header("Connection", CONNECTION)
                .header("Referer", REFERER)
                .header("Host", HOST)
                .header("User-Agent", USER_AGENT)
                .timeout(3000)
                .ignoreContentType(true);
        String html = "";
        try {
            html = conn.post().html();
            html = html.replaceAll("[\n\r]", "");
        }catch (Exception e){
            LOGGER.error("获取URL:" + url + "页面出错", e);
        }
        return html;
    }

 

所以想了一个办法来解决这个问题,核心思想是主线程启动一个子线程来抓取单词定义,然后主线程休眠指定的超时时间,当超时时间过去后,从子线程获取抓取结果,这个时候如果子线程抓取还未完成,则主线程返回空的单词定义,代码如下:

 

    public static String getContent(String url) {
        long start = System.currentTimeMillis();
        String html = _getContent(url, 1000);
        LOGGER.info("获取拼音耗时: {}", TimeUtils.getTimeDes(System.currentTimeMillis()-start));
        int times = 0;
        while(StringUtils.isNotBlank(html) && html.contains("非常抱歉,来自您ip的请求异常频繁")){
            //使用新的IP地址
            ProxyIp.toNewIp();
            html = _getContent(url);
            if(++times > 2){
                break;
            }
        }
        return html;
    }

    private static String _getContent(String url, int timeout) {
        Future<String> future = ThreadPool.EXECUTOR_SERVICE.submit(()->_getContent(url));
        try {
            Thread.sleep(timeout);
            return future.get(1, TimeUnit.NANOSECONDS);
        } catch (Throwable e) {
            LOGGER.error("获取网页异常", e);
        }
        return "";
    }

    private static String _getContent(String url) {
        Connection conn = Jsoup.connect(url)
                .header("Accept", ACCEPT)
                .header("Accept-Encoding", ENCODING)
                .header("Accept-Language", LANGUAGE)
                .header("Connection", CONNECTION)
                .header("Referer", REFERER)
                .header("Host", HOST)
                .header("User-Agent", USER_AGENT)
                .timeout(1000)
                .ignoreContentType(true);
        String html = "";
        try {
            html = conn.post().html();
            html = html.replaceAll("[\n\r]", "");
        }catch (Exception e){
            LOGGER.error("获取URL:" + url + "页面出错", e);
        }
        return html;
    }

 

 

详细代码地址:

https://github.com/ysc/superword/commit/e4bc3c4197af95a8d7519856c89d592515a1c18f

 

 

 

 

 

 

1
1
分享到:
评论

相关推荐

    vc 抓取网页源码实例

    在这个“vc 抓取网页源码实例”中,我们将深入探讨如何使用VS2008进行Unicode工程的开发,解决Unicode与UTF-8编码的转换问题,以及如何避免内存泄露和正确抓取网页内容。 首先,我们要理解Unicode和UTF-8之间的关系...

    delphi网页邮件抓发系统.zip

    综上所述,《Delphi网页邮件抓发系统》是基于Delphi的网络爬虫和邮件发送集成解决方案,涉及到了Delphi的网络编程、HTML解析和SMTP邮件发送等多个核心技术点,为用户提供了一种自动化处理网页邮件的工具。

    c# 多线程网页信息抓取

    1. **C#语言基础**:C#是一种面向对象的编程语言,由微软开发,广泛应用于Windows平台的软件开发。它支持丰富的类型系统、异常处理、垃圾回收等特性,是编写多线程应用程序的理想选择。 2. **多线程**:在多线程...

    java_zhizhu.rar_java LinkFilter_抓取网页_蜘蛛_蜘蛛程序

    在IT领域,网络爬虫(Spider)是一种自动化程序,它按照预定的规则遍历互联网上的网页,抓取所需的信息。本项目"java_zhizhu.rar"提供的就是一个使用Java实现的LinkFilter蜘蛛程序,用于抓取和分析网页内容,并将其...

    python爬虫headers设置后无效的解决方法

    通过以上方法,大多数`headers`设置无效的问题都能得到解决。不过,需要注意的是,网络爬虫应遵守网站的Robots协议,尊重网站的版权,避免对目标服务器造成过大的负担。在进行爬虫开发时,合理、合法地使用`headers`...

    。net 网页新闻抓取

    正则表达式是一种强大的工具,可用于从文本中提取特定模式的数据。在给定的部分代码中,可以看到正则表达式的使用,例如: ```csharp Regex regex = new Regex("(?m)[^&gt;&lt;]+href=(\"|')?(?([^&gt;\"'\\s)])+)(\"|')?[^&gt;...

    C#简单实现网页爬取程序

    网页爬取是网络数据挖掘的一种常见技术,C#作为.NET框架下的主要编程语言,提供了丰富的库和工具来实现这一功能。在这个项目中,我们重点讨论如何利用C#进行简单的网页爬取。 首先,我们需要理解网页爬取的基本原理...

    易语言操作网页教程取图片源码

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的用户也能轻松学习编程。在这个"易语言操作网页教程取图片源码"中,我们将深入探讨如何使用易语言来与...

    MFC实现下载网页

    HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从Web服务器传输超文本文档到客户端。GET请求是最常见的HTTP请求类型,用于从服务器获取资源。在MFC中,通过`CHttpFile`发送GET请求,可以下载网页...

    Java抓取URL/Email实例源码

    Java的`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`接口可以用来创建和操作DOM树,这是一种将HTML转换为可遍历数据结构的方法。通过遍历DOM树,我们可以找到包含URL和Email的特定HTML标签,...

    网站网页地址爬虫(orion-tdc)保存地址到txt

    在IT领域,"爬虫"(Spider或Web Crawler)是一种自动化程序,用于浏览互联网并抓取网页内容。它们广泛用于数据挖掘、市场研究、搜索引擎优化等多个领域。网站爬虫通过模拟浏览器行为,遵循HTML链接,遍历整个网站或...

    计算机软件-商业源码-纯PB代码获取网页的源代码.zip

    4. **异常处理**:在处理网络请求时,可能会遇到各种问题,如连接失败、超时或无效的URL。因此,源码可能包含了错误处理机制,确保程序在遇到这些问题时能优雅地恢复或给出提示。 5. **数据抓取**:如果这个代码...

    网络爬虫第一章源码

    网络爬虫,也被称为网页抓取或数据抓取,是一种自动化程序,用于从互联网上搜集大量信息。在第一章的学习中,我们将重点探讨如何利用编程语言,如Python,来构建一个基础的网络爬虫。源码涉及到的核心技术是链表、...

    webbrows调用网页

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和服务器软件时。在您提供的描述中,提到的“webbrows调用网页”可能是指在C#应用程序中实现对网页的访问和交互功能。这通常涉及到Web客户端编程...

    使用HTMLPARSER和HTTPCLIENT制作网络爬虫,附赠相关技术文档。

    在IT领域,网络爬虫是一种自动化程序,用于从互联网上抓取信息,通常是网页内容。本教程将聚焦于如何使用HTMLPARSER和HTTPCLIENT库来构建一个基础的网络爬虫。这两个工具是Java开发者常用来处理HTTP请求和解析HTML...

    httpProxy-java

    HTTP代理(httpProxy)是一种网络服务,它充当客户端与服务器之间的中介,允许客户端通过代理服务器来访问其他Web资源。在Java开发中,实现HTTP代理功能可以帮助我们处理各种网络请求,提高性能,以及实现数据抓取、...

    htmlunit2.9

    总的来说,HTMLUnit 2.9提供了一种强大的工具,使得开发者能够对Web应用进行深入的测试和数据抓取,而无需依赖于真实的浏览器环境。然而,熟悉其工作原理和API,以及如何处理可能出现的问题,是充分利用这个库的关键...

    php 抓取图片------爬虫

    爬虫是自动化获取网页数据的一种工具,而图片爬虫则是专门针对图片数据的爬取。 首先,我们要了解爬虫的基本工作原理。爬虫通常由以下几个步骤组成: 1. **URL管理**:确定要爬取的网站或页面的初始URL列表。 2. *...

    php搜索引擎蜘蛛代码.zip

    PHP搜索引擎蜘蛛是一种基于PHP编写的程序,它的主要功能是模拟网络爬虫的行为,自动抓取互联网上的网页,并将抓取到的链接存储到数据库中。这种技术在网站数据分析、SEO优化、信息抓取等领域有着广泛的应用。 首先...

    20200727.rar

    7. 错误处理:在网页抓取过程中,可能遇到网络错误、超时、无效URL等问题。QT库提供了异常处理机制,通过捕获和处理QNetworkReply中的错误代码,可以确保程序在遇到问题时能优雅地处理。 8. 避免反爬策略:网页抓取...

Global site tag (gtag.js) - Google Analytics