一種解決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("[
]", "");
}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
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("[
]", "");
}catch (Exception e){
LOGGER.error("獲取URL:" + url + "頁面出錯", e);
}
return html;
}
※Java集合-ArrayList
※懵懂oracle之存儲過程2
※Step by Step 用Azure Automation 來開虛機(ARM)
※easygen通用代碼生成框架
TAG:科技優家 |
※BIOS設置選項詳細解釋——CPU核心篇
※NVIDIA控制面板3D設置切換高性能顯卡出現拒絕訪問對話框的解決方法
※idea設置調用方法時提示方法注釋
※獲取沒有設置TTL的key
※iPhone升級系統之後變磚無法上網 這樣設置可以暫時解決
※蘋果新設置的時間限制可以克服警方的iPhone解鎖
※BIOS設置選項詳細解釋——電壓篇
※Nvidia顯示設置不可用,您當前未使用連接到NVIDIA GPU的顯示器的解決方法
※Word、PPT、EXCEL一鍵設置默認字體,再也不用尋找外掛插件啦
※iPhone需要設置的通用省電方法,一定要試一下,效果很明顯
※BIOS設置選項詳細解釋——內存篇
※BIOS設置選項詳細解釋——晶元組篇
※OPPO R17 Pro如何設置來電鈴聲?方法很簡單趕快試試吧!
※PPT製作前期基礎設置三步搞定
※顯卡如何設置成最高性能 NVIDIA和AMD顯卡設置最高性能的方法
※PPT默認字體設置
※TFBOYS演唱會將設置延伸台?粉絲推測公司會好好策劃,不留遺憾
※HTC發布Vive無線適配器設置說明
※了解BIOS設置:不同廠商不同的BIOS設計和引導方式
※HTC發布Vive無線適配器設置說明,需要額外的PCle插槽