今天发现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
相关推荐
在这个“vc 抓取网页源码实例”中,我们将深入探讨如何使用VS2008进行Unicode工程的开发,解决Unicode与UTF-8编码的转换问题,以及如何避免内存泄露和正确抓取网页内容。 首先,我们要理解Unicode和UTF-8之间的关系...
综上所述,《Delphi网页邮件抓发系统》是基于Delphi的网络爬虫和邮件发送集成解决方案,涉及到了Delphi的网络编程、HTML解析和SMTP邮件发送等多个核心技术点,为用户提供了一种自动化处理网页邮件的工具。
1. **C#语言基础**:C#是一种面向对象的编程语言,由微软开发,广泛应用于Windows平台的软件开发。它支持丰富的类型系统、异常处理、垃圾回收等特性,是编写多线程应用程序的理想选择。 2. **多线程**:在多线程...
在IT领域,网络爬虫(Spider)是一种自动化程序,它按照预定的规则遍历互联网上的网页,抓取所需的信息。本项目"java_zhizhu.rar"提供的就是一个使用Java实现的LinkFilter蜘蛛程序,用于抓取和分析网页内容,并将其...
通过以上方法,大多数`headers`设置无效的问题都能得到解决。不过,需要注意的是,网络爬虫应遵守网站的Robots协议,尊重网站的版权,避免对目标服务器造成过大的负担。在进行爬虫开发时,合理、合法地使用`headers`...
正则表达式是一种强大的工具,可用于从文本中提取特定模式的数据。在给定的部分代码中,可以看到正则表达式的使用,例如: ```csharp Regex regex = new Regex("(?m)[^><]+href=(\"|')?(?([^>\"'\\s)])+)(\"|')?[^>...
网页爬取是网络数据挖掘的一种常见技术,C#作为.NET框架下的主要编程语言,提供了丰富的库和工具来实现这一功能。在这个项目中,我们重点讨论如何利用C#进行简单的网页爬取。 首先,我们需要理解网页爬取的基本原理...
易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的用户也能轻松学习编程。在这个"易语言操作网页教程取图片源码"中,我们将深入探讨如何使用易语言来与...
HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从Web服务器传输超文本文档到客户端。GET请求是最常见的HTTP请求类型,用于从服务器获取资源。在MFC中,通过`CHttpFile`发送GET请求,可以下载网页...
Java的`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`接口可以用来创建和操作DOM树,这是一种将HTML转换为可遍历数据结构的方法。通过遍历DOM树,我们可以找到包含URL和Email的特定HTML标签,...
在IT领域,"爬虫"(Spider或Web Crawler)是一种自动化程序,用于浏览互联网并抓取网页内容。它们广泛用于数据挖掘、市场研究、搜索引擎优化等多个领域。网站爬虫通过模拟浏览器行为,遵循HTML链接,遍历整个网站或...
4. **异常处理**:在处理网络请求时,可能会遇到各种问题,如连接失败、超时或无效的URL。因此,源码可能包含了错误处理机制,确保程序在遇到这些问题时能优雅地恢复或给出提示。 5. **数据抓取**:如果这个代码...
网络爬虫,也被称为网页抓取或数据抓取,是一种自动化程序,用于从互联网上搜集大量信息。在第一章的学习中,我们将重点探讨如何利用编程语言,如Python,来构建一个基础的网络爬虫。源码涉及到的核心技术是链表、...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和服务器软件时。在您提供的描述中,提到的“webbrows调用网页”可能是指在C#应用程序中实现对网页的访问和交互功能。这通常涉及到Web客户端编程...
在IT领域,网络爬虫是一种自动化程序,用于从互联网上抓取信息,通常是网页内容。本教程将聚焦于如何使用HTMLPARSER和HTTPCLIENT库来构建一个基础的网络爬虫。这两个工具是Java开发者常用来处理HTTP请求和解析HTML...
HTTP代理(httpProxy)是一种网络服务,它充当客户端与服务器之间的中介,允许客户端通过代理服务器来访问其他Web资源。在Java开发中,实现HTTP代理功能可以帮助我们处理各种网络请求,提高性能,以及实现数据抓取、...
总的来说,HTMLUnit 2.9提供了一种强大的工具,使得开发者能够对Web应用进行深入的测试和数据抓取,而无需依赖于真实的浏览器环境。然而,熟悉其工作原理和API,以及如何处理可能出现的问题,是充分利用这个库的关键...
爬虫是自动化获取网页数据的一种工具,而图片爬虫则是专门针对图片数据的爬取。 首先,我们要了解爬虫的基本工作原理。爬虫通常由以下几个步骤组成: 1. **URL管理**:确定要爬取的网站或页面的初始URL列表。 2. *...
PHP搜索引擎蜘蛛是一种基于PHP编写的程序,它的主要功能是模拟网络爬虫的行为,自动抓取互联网上的网页,并将抓取到的链接存储到数据库中。这种技术在网站数据分析、SEO优化、信息抓取等领域有着广泛的应用。 首先...
7. 错误处理:在网页抓取过程中,可能遇到网络错误、超时、无效URL等问题。QT库提供了异常处理机制,通过捕获和处理QNetworkReply中的错误代码,可以确保程序在遇到问题时能优雅地处理。 8. 避免反爬策略:网页抓取...