今天发现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
相关推荐
电信设备-一种搜索引擎抓取网页开放式摘要信息的方法及装置.zip
C# 抓取网页内容帮助方法,能投通过标签自动匹配想要输出的内容
各种网卡抓取VLAN的设置方法 FAE必备
java抓取网页数据实现
电信设备-一种环保信息网格抓取方法.zip
VBA提取网页数据的四种方法,可以应用于excel中vba编程用于从网络自动提取数据。
用VBA抓取网页数据有不少方法,其中一种便是引用XMLHTTP对象。在这里尝试为大家介绍一下这个对象的一些基本属性和方法还有一些应用示例。
VBA代码,轻松抓取网页数据代码,比如网抓天气,网抓表格等。
本文实例讲述了Python实现抓取HTML网页并以PDF文件形式保存的方法。分享给大家供大家参考,具体如下: 一、前言 今天介绍将HTML网页抓取下来,然后以PDF保存,废话不多说直接进入教程。 今天的例子以廖雪峰老师的...
一把抓是一款可以帮助用户提取完整网站内容的工具。用户可以下载网站单个页面或多个页面,包括JS、CSS、图片、背景图片、音乐、Flash 一把抓 特点: 1、一键下载页面所有内容,并自动更换网络链接为本地链接 2、...
一个经典的网页爬虫工具,可以用来动态抓取网页!
本程序编写了一个从网页中抓取信息(如最新的头条新闻,新闻的来源,标题,内容等)的类,而且本程序文件夹中含有word文件,文件将介绍如何使用这个类来抓取网页中需要的信息。文件将以抓取博客园首页的博客标题和...
抓取网页中视频的工具
Java抓取网页内容三种方式
本文实例讲述了Python实现抓取网页生成Excel文件的方法。分享给大家供大家参考,具体如下: Python抓网页,主要用到了PyQuery,这个跟jQuery用法一样,超级给力 示例代码如下: #-*- encoding:utf-8 -*- import sys...
自动抓取网页内容自动抓取网页内容自动抓取网页内容自动抓取网页内容自动抓取网页内容自动抓取网页内容
在Jupyter环境利用Python核实现网页信息的抓取。
Java抓取网页数据的两种方法:(1)抓取原网页 (2)抓取网页JS返回数据
描述:由C#编写的多线程异步抓取网页的网络爬虫控制台程序 功能:目前只能提取网络链接,所用的两个记录文件并不需要很大。网页文本、图片、视频和html代码暂时不能抓取,请见谅。 但需要注意,网页的数目是非常...