这是我的安卓应用中使用Jsoup进行网页抓取的情况。现在它能正常工作,但速度太慢了。我在代码中所做的是:
那么,在安卓中是否有任何替代方法来加快HTML解析-抓取速度?附:遗憾的是,我没有访问数据库的权限。
编辑:由于您询问我正在抓取的内容,请参考以下无需登录即可访问的几个页面示例(与其他页面相比,这不是一个特别大的表):https://medeine.vgtu.lt/programos/programa.jsp?sid=F&fak=5&prog=87&rus=U&klb=en。
现在,关于代码...我确实无法给您完整的代码,但这是我如何获取表格中每个单元格的示例:
当我考虑这个问题时...可能不是解析慢,而是登录和通过6页重定向,如果是这种情况,我无能为力?现在我注意到,在Connection.Response中通过.execute()向服务器发送POST请求并获取cookie需要大约2.5秒钟。
- 通过Jsoup中的POST方法登录页面;
- 获取cookies;
- 重复使用cookies浏览6个页面(POST和GET),并对它们进行抓取(主要是表格和大量行。我的意思是很多...所以真的需要很多foreach循环);
- 将所有所需数据写入SQLiteDatabase中;
那么,在安卓中是否有任何替代方法来加快HTML解析-抓取速度?附:遗憾的是,我没有访问数据库的权限。
编辑:由于您询问我正在抓取的内容,请参考以下无需登录即可访问的几个页面示例(与其他页面相比,这不是一个特别大的表):https://medeine.vgtu.lt/programos/programa.jsp?sid=F&fak=5&prog=87&rus=U&klb=en。
现在,关于代码...我确实无法给您完整的代码,但这是我如何获取表格中每个单元格的示例:
document = Jsoup.connect(getContext().getString(R.string.url))
.cookie("JSESSIONID", cookie)
.get();
Element table = document.select("table.duomenys").first();
if (table != null) {
databaseHandler.openDatabase();
databaseHandler.getDatabase().beginTransaction();
try {
for (Element row : table.select("tr.n, tr.l") {
Elements columns = row.select("td");
addItem(columns, DatabaseHandler.getTableName());
}
databaseHandler.getDatabase().setTransactionSuccessful();
} finally {
databaseHandler.getDatabase().endTransaction();
}
databaseHandler.closeDatabase();
}
以下是addItem()方法示例:
private void addItem(Elements columns, String tableName) {
databaseHandler.addItem(new Item(
columns.get(0).text(),
columns.get(1).text(),
columns.get(3).text(),
columns.get(4).text()
), tableName);
}
这只是一个页面,总共有6个页面,其中一些页面非常大。当然,这是在AsyncTaskLoader的loadInBackground()方法中完成的。
编辑2:
Connection.Response response = Jsoup.connect("https://medeine.vgtu.lt/studentams/submit.jsp")
.data("studKnNr", id, "asmKodas", password)
.timeout(3000)
.method(Connection.Method.POST)
.execute();
String cookie = response.cookie("JSESSIONID");
Document document = Jsoup.connect(modules_url)
.cookie(cookie_id, cookie)
.get();
当我考虑这个问题时...可能不是解析慢,而是登录和通过6页重定向,如果是这种情况,我无能为力?现在我注意到,在Connection.Response中通过.execute()向服务器发送POST请求并获取cookie需要大约2.5秒钟。