パーサーは HTML クローラーを解析します
import ....実行中の複数のスレッドを開く
主にこの 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
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
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.
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)