Python adalah bahasa yang berguna. Namun, ini bisa menjadi salah karena bahasa skrip tidak memiliki evaluasi tipe yang ketat dan beberapa operasi yang mahal. Berdasarkan pengalaman pribadi saya, saya sering diganggu oleh kesalahan yang tidak dapat direproduksi dalam Python dalam program yang target analisisnya besar dan diperlukan paralelisme. Saya dengan santai mencoba Kotlin dan ternyata cukup mudah digunakan, jadi saya mencoba mem-porting Scraper yang diterapkan di Python3.
(Ngomong-ngomong, saya belum pernah menyentuh Java)
Ini adalah pemula Kotlin, tetapi thread Python dan thread Kotlin tampaknya berperilaku berbeda.
Meskipun Thread Kotlin tidak membagi proses, tingkat penggunaan CPU melebihi 100%, sehingga tampaknya threading yang efisien dilakukan menggunakan beberapa CPU. (Dengan kata lain, setelah membagi dengan Multiproses, sepertinya tidak perlu menjalankan Thread di bawahnya)
Ini adalah cara menginstal di Ubuntu.
$ curl -s https://get.sdkman.io | bash
$ sdk install kotlin
Tampaknya memori JVM ditulis dalam variabel lingkungan JAVA_OPT, dan jika digunakan secara normal, akan crash karena kekurangan memori, jadi akan lebih baik untuk memperbaikinya dengan cara modern. Saya memiliki pengaturan seperti ini.
JAVA_OPTS= " -Xmx3000M -Xms3000M "
Saya tidak pandai Java, dan saya berpikir untuk mengejar rencana karir yang sebisa mungkin menghindarinya, tetapi saya merasa akan sulit untuk mempelajari alat itu sendiri, terutama Eclipse dan IDE. Karena ada banyak hal.
Akan lebih mudah menggunakan Kotlin dengan IDE, tapi menurut saya CUI baik-baik saja selama tidak ada masalah saat mengompilasi dan menjalankan CUI.
Ada banyak cara untuk mengkompilasi, tetapi lebih mudah untuk mengkompilasinya menjadi file jar, termasuk runtime, untuk kegunaan yang lebih baik.
$ kotlinc foo.kt -include-runtime -d foo.jar
Sekarang Anda dapat mengkompilasi.
Anda dapat menggabungkan beberapa file ke dalam satu toples. (Anda dapat merujuk ke fungsi dan Kelas bar.kt di foo.kt)
$ kotlinc foo.kt bar.kt -include-runtime -d foo.jar
Ini dapat digunakan dengan menambahkan file jar yang dapat dikompilasi menggunakan Java Maven dll ke classpath. (Misalkan Anda menggunakan file alice.jar dan bob.jar)
Ini sangat membantu karena memungkinkan kita menggunakan kembali banyak aset Java.
$ kotlinc foo.kt bar.kt -cp alice.jar:bob.jar -include-runtime foo.jar
Misalnya, saat menjalankan jar kotlin menggunakan file jar eksternal, perintahnya akan seperti ini.
$ kotlin -cp alice.jar:bob.jar:foo.jar FooKt
Nama FooKt ini sepertinya digunakan untuk menentukan file foo.kt yang berisi fungsi utama.
Ketika ada pemuatan data asinkron menggunakan JavaScript, jika Anda mengambilnya dan menganalisisnya dengan jsoup dll., Anda tidak akan bisa mendapatkan kontennya. Anda perlu menjalankan JavaScript untuk membuat keadaan yang mirip dengan apa yang dilihat manusia. , jalankan phamtomjs melalui Selenium untuk membuat JavaScript berfungsi Misalnya, pencarian gambar Microsoft Bing dirender dengan Ajax dan tidak dapat berfungsi di lingkungan di mana JavaScript tidak berfungsi. (Ini untuk tujuan percobaan, jadi ketika benar-benar menggores gambar, lakukan melalui API.)
val driver = PhantomJSDriver ()
driver.manage().window().setSize( Dimension ( 4096 , 2160 ))
driver.get( " https://www.bing.com/images/search?q= ${encoded} " )
//すべての画像が描画されるのを待つ
Thread .sleep( 3001 )
val html = driver.getPageSource()
Html yang dirender setelah JavaScript dijalankan disimpan dalam variabel html. Dengan meletakkan ini di jsoup, Anda dapat menemukan URL src dari berbagai gambar. Berdasarkan URL gambar yang Anda temukan, gunakan perintah wget untuk menyimpannya di folder di bawah direktori mana pun.
val doc = Jsoup .parse(html.toString(), " UTF-8 " )
println (doc.title())
doc.select( " img " ).filter { x ->
x.attr( " class " ) == " mimg "
}.map { x ->
val data_bm = x.attr( " data-bm " )
val src = x.attr( " src " )
Runtime .getRuntime().exec( " wget ${src} -O imgs/ ${name} / ${data_bm} .png " )
}
PhantomJS perlu diunduh dari situs ini dan ditempatkan di PATH.
Tampaknya ada beberapa cara untuk menulisnya, tapi ini adalah implementasi yang paling mudah.
Seluruh logika yang akan di-scrap yang disertakan dalam {} menjadi instance thread, dan Anda bisa memulai atau bergabung dengan thread tersebut untuk menjalankannya secara paralel.
val threads = url_details.keys.map { url ->
val th = Thread {
if (url_details[url] !! == "まだ" ) {
_parser (url).map { next ->
urls.add(next)
}
println ( "終わりに更新 : $url " )
url_details[url] = "終わり"
// save urls
_save_conf ( mapper.writeValueAsString(url_details) )
}
}
th
}
Tampaknya modul serialisasi bernama jackson dapat digunakan untuk waktu terbatas.
Tampaknya perpustakaan Java saja tidak berfungsi, dan Anda perlu memuat modul untuk Kotlin secara terpisah.
Secara terbatas, saya mencoba membuat serialisasi dan deserialisasi MutableMap<String, DataClass> dan tidak berhasil.
MutableMap<String, String> berfungsi dengan baik, jadi saya tidak yakin apakah struktur bersarangnya salah atau tidak mendukung Kelas Data.
Contoh serialisasi
val mapper = ObjectMapper ().registerKotlinModule()
val serialzied = mapper.writeValueAsString(url_details)
Contoh deserialisasi
val mapper = ObjectMapper ().registerKotlinModule()
val url_details = mapper.readValue< MutableMap < String , String >>(json)
Pertama, git klon
$ git clone https://github.com/GINK03/kotlin-phantomjs-selenium-jsoup-parser.git
Sejauh ini, dua jenis pengikisan telah diterapkan: pengikisan sederhana hingga kedalaman 100 menggunakan penelusuran luas pertama tanpa mengevaluasi JavaScript.
(Karena saya menggunakannya untuk menyalin situs saya sendiri, saya tidak menetapkan batasan tertentu, tetapi defaultnya adalah 50 atau lebih akses paralel, jadi harap sesuaikan.)
$ sh run.scraper.sh widthSearch ${yourOwnSite}
Gunakan Microsoft Bing untuk mencari di layar pencarian gambar. Ini adalah kode eksperimental untuk melihat apakah mungkin membuat konten digambar dengan Ajax tanpa menggunakan API, jadi menurut saya kode tersebut tidak boleh diakses dalam jumlah besar dan menimbulkan masalah.
Silakan merujuk ke file kancolle.txt di github untuk daftar pencarian.
sh run.scraper.sh image ${検索クエリリスト} ${出力ディレクトリ}