當前位置:
首頁 > 知識 > 一種解決HTTP抓取網頁超時設置無效的方法

一種解決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 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("[

]", "");
}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插槽