Python est un langage utile. Cependant, cela peut mal tourner en raison du manque d'évaluation de type stricte du langage de script et de certaines opérations coûteuses. D'après mon expérience personnelle, j'ai souvent été gêné par des erreurs irréproductibles en Python dans des programmes où la cible d'analyse devient grande et où le parallélisme est requis. J'ai essayé Kotlin avec désinvolture et je l'ai trouvé assez facile à utiliser, j'ai donc essayé de porter le Scraper qui a été implémenté dans Python3.
(D'ailleurs, je n'ai jamais vraiment touché à Java)
Il s'agit d'un débutant en Kotlin, mais les threads Python et les threads Kotlin semblent se comporter différemment.
Bien que Kotlin's Thread ne divise pas le processus, le taux d'utilisation du processeur dépasse 100 %, il semble donc qu'un threading efficace soit effectué à l'aide de plusieurs processeurs. (En d'autres termes, après la division avec Multiprocess, il ne semble pas nécessaire d'exécuter Thread en dessous)
Voici comment installer sur Ubuntu.
$ curl -s https://get.sdkman.io | bash
$ sdk install kotlin
Il semble que la mémoire JVM soit enregistrée dans la variable d'environnement JAVA_OPT, et si vous l'utilisez normalement, elle plantera en raison d'un manque de mémoire, il serait donc préférable de la réparer de manière moderne. J'ai les paramètres comme celui-ci.
JAVA_OPTS= " -Xmx3000M -Xms3000M "
Je ne suis pas bon en Java et je pensais poursuivre un plan de carrière qui éviterait Java autant que possible, mais j'ai l'impression qu'il serait difficile d'apprendre les outils eux-mêmes, principalement Eclipse et IDE, car il y en avait beaucoup. des choses.
Il serait pratique d'utiliser Kotlin avec un IDE, mais je pense que CUI convient tant qu'il n'y a aucun problème de compilation et d'exécution avec CUI.
Il existe de nombreuses façons de compiler, mais nous avons trouvé plus pratique de le compiler dans un fichier jar, y compris le runtime.
$ kotlinc foo.kt -include-runtime -d foo.jar
Vous pouvez maintenant compiler.
Vous pouvez combiner plusieurs fichiers dans un pot. (Vous pouvez vous référer aux fonctions et à la classe de bar.kt dans foo.kt)
$ kotlinc foo.kt bar.kt -include-runtime -d foo.jar
Il peut être utilisé en ajoutant un fichier jar qui peut être compilé à l'aide de Maven de Java, etc. au chemin de classe. (Supposons que vous utilisiez les fichiers alice.jar et bob.jar)
Ceci est très utile car cela nous permet de réutiliser de nombreux actifs Java.
$ kotlinc foo.kt bar.kt -cp alice.jar:bob.jar -include-runtime foo.jar
Par exemple, lors de l'exécution d'un pot kotlin à l'aide d'un fichier jar externe, la commande ressemblera à ceci.
$ kotlin -cp alice.jar:bob.jar:foo.jar FooKt
Ce nom FooKt semble être utilisé pour spécifier le fichier foo.kt qui contient la fonction principale.
Lorsqu'il y a un chargement de données asynchrone à l'aide de JavaScript, si vous les récupérez simplement et les analysez avec jsoup, etc., vous ne pourrez pas obtenir le contenu. Vous devez exécuter JavaScript pour créer un état similaire à ce qu'un humain verrait. exécutez phamtomjs via Selenium pour faire fonctionner JavaScript. Par exemple, la recherche d'images de Microsoft Bing est rendue avec Ajax et ne peut pas fonctionner dans un environnement où JavaScript ne fonctionne pas. (Ceci est à des fins expérimentales, donc lorsque vous récupérez des images, veuillez le faire via l'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()
La variable html contiendra le code HTML rendu après l'exécution de JavaScript. En mettant ceci dans jsoup, vous pouvez trouver l'URL src de diverses images. En fonction de l'URL de l'image que vous avez trouvée, utilisez la commande wget pour la stocker dans un dossier sous n'importe quel répertoire.
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 doit être téléchargé depuis ce site et placé dans le PATH.
Il semble y avoir plusieurs façons d’écrire ceci, mais celle-ci est la mise en œuvre la plus simple.
La logique entière à récupérer entourée de {} devient une instance de thread, et vous pouvez démarrer ou rejoindre ce thread pour l'exécuter en parallèle.
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
}
Il semble qu'un module de sérialisation appelé Jackson puisse être utilisé pendant une durée limitée.
Il semble que la bibliothèque Java seule ne fonctionne pas et que vous devez charger le module pour Kotlin séparément.
De manière limitée, j'ai essayé de sérialiser et de désérialiser MutableMap<String, DataClass> et cela n'a pas fonctionné.
MutableMap<String, String> fonctionne bien, donc je ne sais pas si la structure imbriquée est mauvaise ou si elle ne prend pas en charge la classe de données.
Exemple de sérialisation
val mapper = ObjectMapper ().registerKotlinModule()
val serialzied = mapper.writeValueAsString(url_details)
Exemple de désérialisation
val mapper = ObjectMapper ().registerKotlinModule()
val url_details = mapper.readValue< MutableMap < String , String >>(json)
Tout d'abord, git clone
$ git clone https://github.com/GINK03/kotlin-phantomjs-selenium-jsoup-parser.git
Jusqu'à présent, deux types de scraping ont été implémentés : un simple scraping jusqu'à une profondeur de 100 en utilisant une recherche en largeur sans évaluer JavaScript.
(Comme je l'utilisais pour scrapper mon propre site, je n'ai pas défini de limites particulières, mais la valeur par défaut est de 50 accès parallèles ou plus, veuillez donc ajuster en conséquence.)
$ sh run.scraper.sh widthSearch ${yourOwnSite}
Utilisez Microsoft Bing pour effectuer une recherche sur l'écran de recherche d'images. Il s'agit d'un code expérimental pour voir s'il est possible d'obtenir du contenu dessiné avec Ajax sans utiliser l'API, donc je ne pense pas qu'il devrait être accessible en grande quantité et causer des problèmes.
Veuillez vous référer au fichier kancolle.txt sur github pour la liste de recherche.
sh run.scraper.sh image ${検索クエリリスト} ${出力ディレクトリ}