use "std" use "java" def parsePage(page = 1) { doc = Jsoup.connect("https://android-arsenal.com/?page=" + page + "&sort=created") .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36") .get() if (indexOf(doc, "We could not find any project") != -1) return [] elements = doc.select(".project-info").toArray() pageLibs = [] for element : elements { aElement = element.select(".title a:first-child") title = trim(aElement.text()) // Пропускаем рекламу if (title == "") continue lib = {} lib.title = title lib.url = aElement.attr("href") lib.tag = trim(element.select(".tags").text()) lib.desc = trim(element.select(".desc").text()) // Добавляем в массив pageLibs += lib } return pageLibs } Jsoup = newClass("org.jsoup.Jsoup") libs = [] page = 1 while (true) { println "Page " + page pageLibs = parsePage(page) if (length(pageLibs) == 0) break libs <<= pageLibs page++ sleep(1000) } // Сохраняем в json use "json" use "files" f = fopen("android-libraries.json", "w") writeText(f, jsonencode(libs)) flush(f) fclose(f) // Сохраняем в БД sqlite use "jdbc" conn = getConnection("jdbc:sqlite:android-arsenal.db") // Создаём структуру таблиц st = conn.createStatement() st.executeUpdate("drop table if exists tags") st.executeUpdate( "create table tags ( id integer primary key, name string )") st.executeUpdate("drop table if exists libs") st.executeUpdate( "create table libs ( id integer primary key, title string, url string, desc string, tag integer )") st.execute("begin") st.close() // Создаём PreparedStatement для безопасного добавления данных stTags = conn.prepareStatement("insert into tags(id, name) values(?, ?)") stLibs = conn.prepareStatement("insert into libs(id, title, url, desc, tag) values(?, ?, ?, ?, ?)") tagids = {} tagsIndex = 0 libsIndex = 0 for lib : libs { libsIndex++ // Теги if !arrayKeyExists(lib.tag, tagids) { // Добавляем новый тег tagsIndex++ stTags.setInt(1, tagsIndex) stTags.setString(2, lib.tag) stTags.addBatch() tagids[lib.tag] = tagsIndex } // Добавляем библиотеку stLibs.setInt(1, libsIndex) stLibs.setString(2, lib.title) stLibs.setString(3, lib.url) stLibs.setString(4, lib.desc) stLibs.setString(5, tagids[lib.tag]) stLibs.addBatch() } // Выполняем множественное добавление и освобождаем ресурсы stTags.executeBatch() stLibs.executeBatch() stTags.close() stLibs.close() // Для проверки выведем количество добавленных библиотек st = conn.createStatement() st.execute("end") rs = st.executeQuery("select count(*) from libs") println "Libs: " + rs.getInt(1) conn.close()