昨天分别用python和java对同一批网页进行内容抓取时发现的问题。以下是场景描述
-
页面较大,总共70kb.
-
python 的requests库能较快(1s内)获得完整数据返回,30%几率在1-5s内完整返回。
-
java的jsoup的get方法,httpClient和httpUrlConnection的对应get请求方法,首先返回一部分文本(约16K),然后卡住,约10s后完整打印page内容。
-
麻烦的问题来了,代码的执行顺序让我现在比较迷惑,先记录一下,以后找到原因再补充。代码简写如下
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版本的包。
现在问题是当执行到 "***a"处时,pageContent并没有完全获取到page的源文件,只是部分,导致下面doc.select处的eles始终size为0,因此无法保存页面body的article部分内容。然而更诡异的是,a、b、三处的System.out.println()居然是顺序执行的,但是实际运行时是先输出a的一部分,程序显示执行完毕,然后程序运行到b到c之前的代码段,执行完毕后,大约卡顿5-10s,程序完整输出a的内容,然后输出b最后是c。
网友评论