java - 如何防止主线程执行下一行,直到最后一行完全执行
问题描述
首先,我是 Spring-boot 的新手。我想抓取一个新闻网站以制作一个休息 api。我所做的只是创建一条路线,负责在抓取新闻网站后为最新新闻创建 json 响应。这是路线
@GetMapping("/latest")
public ArrayList<Result> scrape() {
String title = "";
Document doc;
Element body ;
ArrayList<Element> elements = new ArrayList<>() ;
ArrayList<Result> results = new ArrayList<>();
ArrayList<Element>li;
try {
doc = Jsoup.connect("https://timesofindia.indiatimes.com").get(); //error take place here
title = doc.title();
body = doc.body();
elements = body.getElementsByAttributeValue("data-vr-zone","latest");
System.out.println("Size "+elements.size());
li = elements.get(0).select("li > a");
System.out.println("WHole Data "+li.toString());
System.out.println(li.size());
int id = 0;
for(Element text : li ) {
id++;
String link = "";
if( text.attr("href") != "" && text.attr("title") != "" ) {
link = "https://timesofindia.indiatimes.com/" + text.attr("href") ;
results.add(new Result(id,text.attr("title"),link));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return results;
}
请有人帮助如何在java中处理这种情况。
因为Jsoup.connect().get()
发出http
请求,所以主线程把它放在一个唯一的线程中并行执行,输出ArrayList = 0的大小。
[这里是输出][1] [1]:https://i.stack.imgur.com/HubJD.png
堆栈跟踪:
2020-03-04T12:18:34.410009+00:00 heroku[路由器]: at=info method=GET path="/latest" host=morning-waters-01018.herokuapp.com request_id=15a8fdba-e541-4aa2-a0df -34838b2e7e5f fwd="47.30.171.180" dyno=web.1 connect=0ms service=177ms status=500 bytes=473 protocol=https 2020-03-04T12:18:34.399950+00:00 app[web.1]:大小0 2020-03-04T12:18:34.402793+00:00 app[web.1]: 2020-03-04 12:18:34.402 错误 4 --- [io-17255-exec-5] occC[.[. [/].[dispatcherServlet] : Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0] 根本原因 2020-03-04T12:18:34.402794+00:00 app[web.1]: 2020-03-04T12:18:34.402795+ 00:00 app[web.1]:java.lang.IndexOutOfBoundsException:索引:0,大小:0 2020-03-04T12:18:34。
解决方案
我认为这Jsoup.connect("https://timesofindia.indiatimes.com").get()
是一个同步调用。
你只需要找到错误的原因。
最简单的方法
请更改catch (IOException e)
为catch (Exception e)
.
将main()
方法添加到同一源文件中,复制其中的主体并scrape()
在IDE 中main()
运行该方法。main()
您可以只打印results
(不退回)。
您可以尝试在main()
方法中调试代码。
原因,貌似
elements = body.getElementsByAttributeValue("data-vr-zone","latest")
elements
这里是空的
推荐阅读
- python - 当应用于像素值时,相同的数学和 numpy 函数不会给出相同的结果
- pyspark - 如何对 pyspark 数据框进行检查/尝试捕获?
- xamarin.forms - 如何在 Xamarin.Forms uwp 中设置 webview 的动态高度?
- java - 带有投影的休眠条件限制
- vuejs2 - 无法读取未定义服务工作者 Nuxt JS 的属性“注册”
- r - PCA - 绘制到主成分的个体距离
- python-3.x - 使用具有不同身份验证方法(Python、cx_Oracle)的 TNS 连接到两个 Oracle 数据库
- spring - MongoDb:如何在多个集合中搜索?
- javascript - 如何在不点击控制按钮的情况下定位用户?(地图框 API、JavaScript)
- html - HTML:编码特殊字符:名称与代码