目次
ディスカッション (解決策) に返信
ホームページ ウェブフロントエンド htmlチュートリアル 手書きのクローラー プログラムは正常に実行できますが、データをクロールするのに 10 秒以上かかります。効率を向上させるためのアドバイスをお願いします。 ! _html/css_WEB-ITnose

手書きのクローラー プログラムは正常に実行できますが、データをクロールするのに 10 秒以上かかります。効率を向上させるためのアドバイスをお願いします。 ! _html/css_WEB-ITnose

Jun 24, 2016 pm 12:25 PM

パーサーは HTML クローラーを解析します

import ....
/**
***** データを取得する
*/
public class DoMain3 {
/**
* Web ページの URL に基づいてページのコンテンツを取得します
*/
public String getHtmlString(String url){
String hs="";
試してください{
URL u = 新しい URL(url);
HttpURLConnection conn = (HttpURLConnection)u.openConnection(); 
conn.setRequestProperty("ユーザーエージェント","MSIE 7.0");
StringBuffer HtmlString = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
文字列 line="";
while((line=br.readLine())!=null){
HtmlString.append(line+"n");
}
hs=HtmlString.toString();
System.out.println(url);
} catch (Exception e) {
System.out.println("URL地址加ダウンロード出错!!");
e.printStackTrace();
}
return hs;
}
public static void main(String rags[]){
Dao d = new Dao();
DoMain3 dm = 新しい DoMain3();
文字列 title="";
文字列セクション="";
文字列コンテンツ="";
文字列 contentTitle="";
int count=110;

文字列 url="http://*************************" ;
if(d.createTable()){
System.out.println("建表成功!!!!");
try {
//加下标题页面
Document doc = Jsoup.parse(dm.getHtmlString(url));
要素タイトル = doc.getElementById("maincontent");
要素 lis=titles.getElementsByTag("li");
//**********************标题************************ ***
for(int i=1;i要素a = lis.get(i).getElementsByTag("a");
if(a.toString().equals("")){
title=lis.get(i).text();
contentTitle=タイトル;
文字列データ[]={contentTitle,title,section,content,url};
if(d.pinsertData(data)){
System.out.println("第"+(i+1)+"题データベース插入成功!!!!");
System.out.println("*****************"+count+"*****************");
}else{
System.out.println("第"+(i+1)+"题节データベース插入失败!!!");
System.out.println("*****************"+count+"*****************");
休憩;
}
count++;
続けてください。
}else{
title=a.get(0).text();
url="http://****************"+a.get(0).attr("href");
//追加章节页面
Document doc2=Jsoup.parse(dm.getHtmlString(url));
要素セクション = doc2.getElementById("maincontent");
要素 ls = sections.getElementsByTag("li");
//**********************节***********************
for(int j=0;j 要素 link = ls.get(j).getElementsByTag("a");
if(link.toString().equals("")){
Section=ls.get(j).text();
contentTitle=タイトル+" "+セクション;
}else{
セクション = link.get(0).text();
url="http:*******************"+link.get(0).attr("href");
//コンテンツ页面を追加
Document doc3=Jsoup.parse(dm.getHtmlString(url));
要素コンテンツ=doc3.getElementById("メインコンテンツ");
content=contents.text();
//処理内容文字列
content=content.substring(content.indexOf("?")+"?".length());
content=content.replace(""", """);
contentTitle=タイトル+" "+セクション;
}
System.out.println("****************"+count+"******************") ;
System.out.println("正在读第"+(i+1)+"题"+(j+1)+"节");


//往数据库插受信データ
String data[]={contentTitle,title,section,content,url};
if(d.pinsertData(data)){
System.out.println("第"+(i+1)+"题"+(j+1)+"节データベース插入成功!!!!");
System.out.println("*****************"+count+"*****************");
カウント++;
}else{
System.out.println("第"+(i+1)+"题"+(j+1)+"节データベース插入失败!!!");
System.out.println("*****************"+count+"*****************");
休憩;
}
}//end for
}

System.out.println("質問 "+(i+1)+" を収集しました");


}//end for

System.out.println("収集完了! ");

} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

?


ディスカッション (解決策) に返信

実行中の複数のスレッドを開く

主にこの 2 つの文 デバッグするとき、いつもこの 2 つの文で止まります
1.BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"))

2.while ((line=br.readLine())!=null){
HtmlString.append(line+"n");
}

jsoup を使用すると、非常にシンプルで簡単にクロールできます

最初から使用すると効率的ですjsoup の値はこれよりもさらに低くなります。 Document = Jsoup.parse(method.getResponseBodyAsString()); では、このステップを実行することはできません。これは、sax を使用して解析することを提案する人もいます。 HTMLの解析に使用されますか?

マルチスレッド + 帯域幅の増加

**
* 获取************** のデータ
* @author wf
*
*/
public class DoMain5 {

public Document getDoc(String url){
文書doc=null; 
試してください {
doc=Jsoup.connect(url).get(); 
} catch (Exception e) {
System.out.println("文档解析失败!!"); 
e.printStackTrace(); 
}
ドキュメントを返します。 
}

public static void main(String rags[]){
Dao d = new Dao(); 
DoMain5 dm = 新しい DoMain5(); 

文字列 title=""; 
文字列セクション=""; 
文字列コンテンツ=""; 
文字列 contentTitle=""; 
int count=630; 

文字列 url="******************" ; 

if(d.createTable()){
System.out.println("建表成功!!!!"); 

試してください {
ドキュメント doc = dm.getDoc(url); 
System.out.println(doc); 
要素タイトル = doc.getElementById("maincontent"); 
要素 lis=titles.getElementsByTag("li"); 
//**********************标题************************ ***
for(int i=1;i 要素 a = lis.get(i).getElementsByTag("a"); 
if(a.toString().equals("")){
title=lis.get(i).text(); 
contentTitle=タイトル; 

文字列データ[]={contentTitle,title,section,content,url}; 
if(d.pinsertData(data)){
System.out.println("第"+(i+1)+"题データベース插入成功!!!!"); 
System.out.println("*****************"+count+"*****************"); 
}else{
System.out.println("第"+(i+1)+"题节データベース插入失败!!!"); 
System.out.println("*****************"+count+"*****************"); 
休憩; 
}
count++; 
続けてください。 
}else{
title=a.get(0).text(); 

url="http:***************"+a.get(0).attr("href"); 
ドキュメント doc2=dm.getDoc(url); 
要素セクション = doc2.getElementById("maincontent"); 
要素 ls = sections.getElementsByTag("li"); 
//**********************节***********************
for(int j=507;j 要素 link = ls.get(j).getElementsByTag("a"); 
if(link.toString().equals("")){
Section=ls.get(j).text(); 
contentTitle=タイトル+" "+セクション; 
}else{
セクション = link.get(0).text(); 
url="http:****************"+link.get(0).attr("href"); 
ドキュメント doc3=dm.getDoc(url); 
要素コンテンツ=doc3.getElementById("メインコンテンツ"); 
content=contents.text(); 
//处理内容字符串
content=content.substring(content.indexOf("?")+"?".length()); 
content=content.replace(""", """); 
contentTitle=タイトル+" "+セクション; 
}
System.out.println("****************"+count+"******************") ; 
System.out.println("正在读第"+(i+1)+"题"+(j+1)+"节"); 


String data[]={contentTitle,title,section,content,url}; 

if(d.pinsertData(data)){
System.out.println("第"+(i+1)+"题"+(j+1)+"节データベース插入成功!!!"); 
System.out.println("*****************"+count+"*****************"); 
カウント++; 
}else{
System.out.println("第"+(i+1)+"题"+(j+1)+"节データベース插入失败!!!"); 
System.out.println("*****************"+count+"*****************"); 
休憩; 
}
}//end for
}

System.out.println("第"+(i+1)+"题採集完毕"); 
休憩; 
}//終了

System.out.println("コレクションが完了しました!!");

} catch (Exception e) {

e.printStackTrace()
}

皆さんの熱心な提案と修正により、このプログラムの効率は大幅に向上しました。改善されましたが、現在は実行時にいつでもどこでも次の 2 つの例外がスローされます。解決方法についてアドバイスをお願いします:

1.java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0 (ネイティブメソッド)
java .net.SocketInputStream.read(SocketInputStream.java:129)
java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
java.io.BufferedInputStream.read1(BufferedInputStream.java: 258)
java.io .BufferedInputStream.read(BufferedInputStream.java:317)
sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
sun.net.www.http.HttpClient. parseHTTP(HttpClient.java:632 )
sun.net.www.protocol.http.HttpURLConnection.getInputStream
(HttpURLConnection.java:1064)
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373)
org .jsoup.helper.HttpConnection$ Response.execute(HttpConnection.java:429)
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:410)
org.jsoup.helper.HttpConnection.execute(HttpConnection) .java:164)
org.jsoup.helper.HttpConnection.get(HttpConnection.java:153) で
com.wanfang.dousact.DoMain5.getDoc(DoMain5.java:35) で
com.wanfang.dousact.DoMain5 で.main(DoMain5.java: 61)

2.java.net.SocketTimeoutException: 接続がタイムアウトしました
で java.net.PlainSocketImpl.socketConnect(Native Method)
で java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) )
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
java.net.Socket.connect(Socket.java:519)
sun.net.NetworkClient.doConnect(NetworkClient.java:158)
sun.net.www.http.HttpClient.openServer(HttpClient.java:394) )
sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
sun.net.www.http.HttpClient.(HttpClient.java:233)
sun.net. www.http.HttpClient.New (HttpClient.java:306)
sun.net.www.http.HttpClient.New(HttpClient.java:323)
sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient
(HttpURLConnection.java:852)
sun.net.www.protocol.http.HttpURLConnection.plainConnect
(HttpURLConnection.java:793)
sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java: 718)
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:425) で
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:410) で
org.jsoup.helper で。 HttpConnection.execute(HttpConnection.java :164)
org.jsoup.helper.HttpConnection.get(HttpConnection.java:153)
com.wanfang.dousact.DoMain5.getDoc(DoMain5.java:35)
com で。 wanfang.dousact.DoMain5.main (DoMain5.java:87)

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

< Progress>の目的は何ですか 要素? < Progress>の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML< Progress>について説明します。要素、その目的、スタイリング、および< meter>との違い要素。主な焦点は、< Progress>を使用することです。タスクの完了と< Meter> statiの場合

< datalist>の目的は何ですか 要素? < datalist>の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML< Datalist>について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

< meter>の目的は何ですか 要素? < meter>の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html< meter>について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化< Meter> < Progress>およびex

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

< iframe>の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? < iframe>の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、< iframe>外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

HTMLは初心者のために簡単に学ぶことができますか? HTMLは初心者のために簡単に学ぶことができますか? Apr 07, 2025 am 12:11 AM

HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用​​できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

HTML、CSS、およびJavaScriptの役割:コアの責任 HTML、CSS、およびJavaScriptの役割:コアの責任 Apr 08, 2025 pm 07:05 PM

HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

HTMLでの開始タグの例は何ですか? HTMLでの開始タグの例は何ですか? Apr 06, 2025 am 12:04 AM

Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

See all articles