ホームページ > ウェブフロントエンド > htmlチュートリアル > 手書きのクローラー プログラムは正常に実行できますが、効率が低すぎます。データをクロールするのに 10 秒以上かかります。Thank you_html/css_WEB-ITnose についてアドバイスをお願いします。

手書きのクローラー プログラムは正常に実行できますが、効率が低すぎます。データをクロールするのに 10 秒以上かかります。Thank you_html/css_WEB-ITnose についてアドバイスをお願いします。

WBOY
リリース: 2016-06-21 09:05:46
オリジナル
1078 人が閲覧しました

インポート....
/**
* **** データを取得します
*/
public class DoMain3 {
/**
* ウェブページの 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();
}
hs を返します。
}
public static void main(String rags[]){
Dao d = new Dao();
DoMain3 dm = 新しい DoMain3();
文字列タイトル="";
文字列セクション="";
文字列コンテンツ="";
文字列 contentTitle="";
int count=110;

文字列 url="http://*************************" ;
if(d.createTable()){
System.out.println("建表成功!!!!");
try {
//加下标题页面
Document doc = Jsoup.parse(dm.getHtmlString(url));
要素タイトル = doc.getElementById("メインコンテンツ");
Elements lis=titles.getElementsByTag("li");
//*********************标题************************ ***
for(int i=1;iElements 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+"*****************");
休憩;
}
カウント++;
続けてください。
}else{
title=a.get(0).text();
url="http://****************"+a.get(0).attr("href");
//追加章节页面
Document doc2=Jsoup.parse(dm.getHtmlString(url));
要素セクション=doc2.getElementById("maincontent");
Elements ls = sections.getElementsByTag("li");
//**********************节***********************
for(int j=0;jElements link = ls.get(j).getElementsByTag("a");
if(link.toString().equals("")){
section=ls.get(j).text();
contentTitle=タイトル+" "+セクション;
}else{
section = link.get(0).text();
url="http:*******************"+link.get(0).attr("href");
//追加コンテンツ页面
Document doc3=Jsoup.parse(dm.getHtmlString(url));
Element content=doc3.getElementById("maincontent");
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+"*****************");
休憩;
}
}//終了 for
}

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


}//終了 for

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

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

?


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

複数のスレッドを実行します

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

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

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

最初に使用したのはこれよりもさらに効率的ではありませんでした。 Document doc = Jsoup.parse(method.getResponseBodyAsString()); では、これは頭痛の種でした。 、しかし、sax は html の解析に使用されますか?

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

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


public Document getDoc(String url){
ドキュメント doc=null;
try {
doc=Jsoup.connect(url).get();
} catch (Exception e) {
e.printStackTrace ( );
ドキュメントを返す

public static void main(String rags[]){
DoMain5dm = new DoMain5(); content="";
int count=630

if(d. createTable()){
System.out.println("テーブルが正常に作成されました!!!");
ドキュメント doc = dm.getDoc(url)
要素タイトル= doc.getElementById("maincontent");
Elements lis=titles.getElementsByTag("li");
//**************** *****タイトル** **************************
for(int i=1;i要素 a = lis .get(i).getElementsByTag("a");
if(a.toString().equals("")){
contentTitle=title; String data[]={contentTitle,title,section,content,url};
if(d.pinsertData(data)){
System.out.println("th"+(i+ 1)+"質問データが挿入されました成功しました! ! ! ");
System.out.println("******************"+count+"***************** *" );
}else{
System.out.println("セクション "+(i+1)+" へのデータの挿入に失敗しました!!!");
System.out.println("***** ** **********"+count+"****************");
break;
}
count++;
Continue;
}else{
タイトル=a.get(0).text();

url="http:******************"+a.get(0).attr( "href") ;
要素セクション = doc2.getElementById("メインコンテンツ");
//***** **** *************セクション************************
for(int j=507; jElements link = ls.get(j).getElementsByTag("a");
if(link.toString().equals("")){
section=ls. get(j) .text();
contentTitle=title+" "+section;
section = link.get(0).text(); **** ****"+link.get(0).attr("href");
ドキュメント doc3=dm.getDoc(url);
要素コンテンツ=doc3.getElementById("maincontent");
コンテンツ=contents.text ();
//コンテンツ文字列を処理します
content=content.substring(content.indexOf("?")+"?".length()); ''" );
contentTitle=title+" "+section;
}
System.out.println("******************"+count+"**** ******** *********");
System.out.println("読書 "+(i+1)+"質問"+(j+1)+"セクション" );


文字列データ[]={contentTitle,title,section,content,url};

if(d.pinsertData(data)){
System.out.println("number"+(i+1) +"question"+( j+1)+" セクション データが正常に挿入されました。 ! ! ");
System.out.println("******************"+count+"***************** *" );
count++;
}else{
System.out.println("いいえ。 "+(i+1)+"質問"+(j+1)+"セクション データの挿入に失敗しました!!!");
システム.out.println("******************"+count+"******************") ;
break;
}
}//
の終了

System.out.println("質問 "+(i+1)+"収集が完了しました"); .out.println ("コレクションが完了しました!!");} catch (Exception e) {

e.printStackTrace();
}

皆さんの熱心な提案と修正により、このプログラムの効率は大幅に向上しましたが、実行時にいつでもどこでも次の 2 つの例外がスローされます。解決方法のヒント:
1.java.net.SocketTimeoutException: 読み取りタイムアウト
at java.net.SocketInputStream.socketRead0(Native Method)
at 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 。プロトコル.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: 接続がタイムアウトしました
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:1) 95 )
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)
at 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)

これを参照してご覧ください

https://www.baidu.com/s?wd=jsoup%20%E5%A4%AA%E6%85%A2&rsv_spt=1&rsv_iqid=0xa4c58e5b0001928e&issp=1&f=3&rsv_bp=1&rsv_idx =2&ie=utf-8&tn=baiduhome_pg&rsv_enter =1&oq =java%2520write%2520%255Ct%2520%25E6%25B2%25A1%25E7%2594%25A8&inputT=11038&rsv_t=64ecKnkhyG%2Bspt6MnEr2Ttfue0g E4iYduVY65jj1n6jePnM1gL%2FwO3G Vvk4XcSPt8z5R&rsv_pq=e14f800e00019f3d&sug=jsoup%E8%A7% A3%E6%9E%90html&rsv_sug3=27&rsv_sug1=19&rsv_n =1&rsv_sug2=0&prefixsug=jsoup%2520%25E5%25A4%25AA%25E6%2585%25A2&rsp=0&rsv_sug4=12115

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート