【发布时间】:2014-08-27 21:55:40
【问题描述】:
这是交易。在我的 android 应用程序中,我正在使用 Jsoup 进行一些网络抓取。现在它工作正常,但它太慢了。我在代码中所做的是:
- 在Jsoup中通过POST方式登录页面;
- 获取 cookie;
- 通过重用 cookie,我浏览了 6 页(POST 和 GET)并抓取了它们(主要是表格和很多行。我的意思是很多......所以,真的有很多 foreach 循环);
- 将所有需要的数据写入 SQLiteDatabase;
现在的问题是速度太慢了。我的意思是,在按下登录按钮后,在应用程序的登录屏幕中,用户必须在 3G 中等待长达 10 秒,在 WiFi 中等待约 8-10 秒(取决于 WiFi 速度)。当他尝试检查数据更新时,它会执行相同的算法 + 比较 SQLiteDatabase 表数据。
那么,有没有其他方法可以在 android 中进行这种 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 秒。
【问题讨论】:
-
Writing all required data to SQLiteDatabaseI do NOT have access to the database???? -
我正在将下载的数据写入我自己的 SQLiteDatabase。无权访问是指我无权访问该网站的数据库,因此我必须抓取该网站。非常清楚,我正在抓取大学信息系统网站,他们尚未授予访问其数据库的权限。
-
如果您的代码速度较慢,那么您应该在此处发布您的代码并在互联网上的某个地方放置一个页面,这样我们就不必登录但可以进行一些测试。
标签: android performance web-scraping jsoup