这是交易.在我的Android应用程序中,我正在使用Jsoup进行一些网络抓取.现在它工作正常,但它太慢了.我在我的代码中做的是:
在Jsoup中通过POST方法登录页面;
获取cookie;
通过重用cookie我将经历6个页面(POST和GET)并抓取它们(主要是表格和许多行.我的意思是很多......所以,真的很多foreach循环);
将所有必需的数据写入SQLiteDatabase;
现在问题是它速度很快.我的意思是,在按下登录按钮后,在应用程序的登录界面中,用户必须在3G中等待10秒,在WiFi中等待8-10秒(取决于WiFi速度).当他试图检查数据更新时,它会执行相同的算法+比较SQLiteDatabase表数据.
那么,有没有其他方法来做这个HTML解析 - 在android中刮掉东西以使其更快?PS我遗憾地无法访问数据库.
编辑:
既然你问过我正在抓取的内容,这里是你可以在不登录的情况下访问的几个页面的一个例子(与其他人相比,这不是一个很大的表):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秒.