HttpClient与HttpUrlConnection的使用问题

昨天分别用python和java对同一批网页进行内容抓取时发现的问题。以下是场景描述

  1. 页面较大,总共70kb.
  2. python 的requests库能较快(1s内)获得完整数据返回,30%几率在1-5s内完整返回。
  3. java的jsoup的get方法,httpClient和httpUrlConnection的对应get请求方法,首先返回一部分文本(约16K),然后卡住,约10s后完整打印page内容。
  4. 麻烦的问题来了,代码的执行顺序让我现在比较迷惑,先记录一下,以后找到原因再补充。代码简写如下
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"); }

【HttpClient与HttpUrlConnection的使用问题】其中用到了jsoup1.11.2版本和httpclient4.5.5版本的包。
现在问题是当执行到 "***a"处时,pageContent并没有完全获取到page的源文件,只是部分,导致下面doc.select处的eles始终size为0,因此无法保存页面body的article部分内容。然而更诡异的是,a、b、三处的System.out.println()居然是顺序执行的,但是实际运行时是先输出a的一部分,程序显示执行完毕,然后程序运行到b到c之前的代码段,执行完毕后,大约卡顿5-10s,程序完整输出a的内容,然后输出b最后是c。

    推荐阅读