昨天分別用python和java對(duì)同一批網(wǎng)頁(yè)進(jìn)行內(nèi)容抓取時(shí)發(fā)現(xiàn)的問(wèn)題。以下是場(chǎng)景描述
頁(yè)面較大,總共70kb.
python 的requests庫(kù)能較快(1s內(nèi))獲得完整數(shù)據(jù)返回,30%幾率在1-5s內(nèi)完整返回。
java的jsoup的get方法,httpClient和httpUrlConnection的對(duì)應(yīng)get請(qǐng)求方法,首先返回一部分文本(約16K),然后卡住,約10s后完整打印page內(nèi)容。
麻煩的問(wèn)題來(lái)了,代碼的執(zhí)行順序讓我現(xiàn)在比較迷惑,先記錄一下,以后找到原因再補(bǔ)充。代碼簡(jiǎn)寫(xiě)如下
public static void main( String[] args ) throws IOException
{
String uri = "http://tech.sina.com.cn/i/2018-03-19/doc-ifyskynn9416417.shtml";
HttpClient client = HttpClients.createDefault();
URL url = new URL(uri.trim());
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(6000);
urlConnection.connect();
BufferedReader input = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
StringBuilder pageContent = new StringBuilder();
while ((line = input.readLine()) != null) {
pageContent.append(line);
pageContent.append("\n");
}
input.close();
System.out.println(pageContent.toString());
System.out.println("end of the program");
Document doc = Jsoup.parse(pageContent.toString(), "utf-8");
Elements eles = doc.select(".atricle");
for (Element element : eles) {
String text = element.text();
System.out.println(text);
}
System.out.println("end of cycle");
}
其中用到了jsoup1.11.2版本和httpclient4.5.5版本的包。
現(xiàn)在問(wèn)題是當(dāng)執(zhí)行到 "***a"處時(shí),pageContent并沒(méi)有完全獲取到page的源文件,只是部分,導(dǎo)致下面doc.select處的eles始終size為0,因此無(wú)法保存頁(yè)面body的article部分內(nèi)容。然而更詭異的是,a、b、三處的System.out.println()居然是順序執(zhí)行的,但是實(shí)際運(yùn)行時(shí)是先輸出a的一部分,程序顯示執(zhí)行完畢,然后程序運(yùn)行到b到c之前的代碼段,執(zhí)行完畢后,大約卡頓5-10s,程序完整輸出a的內(nèi)容,然后輸出b最后是c。