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

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

WBOY
WBOYオリジナル
2016-06-24 12:25:31856ブラウズ

パーサーは 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 までご連絡ください。