Python — полезный язык. Однако это может пойти не так из-за отсутствия в языке сценариев строгой оценки типов и некоторых дорогостоящих операций. По моему личному опыту, меня часто беспокоили невоспроизводимые ошибки в Python в программах, где цель анализа становится большой и требуется параллелизм. Я случайно попробовал Kotlin и нашел его довольно простым в использовании, поэтому попробовал портировать Scraper, реализованный в Python3.
(Кстати, я никогда особо не касался Java)
Это новичок в Kotlin, но потоки Python и потоки Kotlin, похоже, ведут себя по-разному.
Хотя поток Kotlin не разделяет процесс, уровень использования ЦП превышает 100%, поэтому кажется, что эффективная обработка потоков выполняется с использованием нескольких ЦП. (Другими словами, после разделения на Multiprocess запускать под ним Thread вроде бы нет необходимости)
Вот как установить на Ubuntu.
$ curl -s https://get.sdkman.io | bash
$ sdk install kotlin
Похоже, что память JVM записана в переменную окружения JAVA_OPT, и если использовать ее нормально, то она вылетит из-за нехватки памяти, поэтому лучше будет исправить это по-современному. У меня такие настройки.
JAVA_OPTS= " -Xmx3000M -Xms3000M "
Я плохо разбираюсь в Java и подумывал о карьерном плане, который бы максимально избегал Java, но мне кажется, что будет сложно изучить сами инструменты, в основном Eclipse и IDE, потому что их было много. вещей.
Было бы удобно использовать Kotlin с IDE, но я думаю, что с CUI все в порядке, если нет проблем с компиляцией и запуском с CUI.
Существует много способов компиляции, но мы сочли более удобным скомпилировать его в jar-файл, включая среду выполнения.
$ kotlinc foo.kt -include-runtime -d foo.jar
Теперь вы можете скомпилировать.
Вы можете объединить несколько файлов в банку. (Вы можете обратиться к функциям и классам bar.kt в foo.kt)
$ kotlinc foo.kt bar.kt -include-runtime -d foo.jar
Его можно использовать, добавив в путь к классам файл jar, который можно скомпилировать с помощью Java Maven и т. д. (Предположим, вы используете файлы alice.jar и bob.jar)
Это очень полезно, поскольку позволяет нам повторно использовать многие ресурсы Java.
$ kotlinc foo.kt bar.kt -cp alice.jar:bob.jar -include-runtime foo.jar
Например, при выполнении jar-файла kotlin с использованием внешнего jar-файла команда будет такой.
$ kotlin -cp alice.jar:bob.jar:foo.jar FooKt
Похоже, что это имя FooKt используется для указания файла foo.kt, содержащего основную функцию.
Когда происходит асинхронная загрузка данных с использованием JavaScript, если вы просто извлекаете их и анализируете с помощью jsoup и т. д., вы не сможете получить контент. Вам нужно запустить JavaScript, чтобы создать состояние, похожее на то, что увидит человек. запустите phamtomjs через selenium, чтобы заставить работать JavaScript. Например, поиск изображений Microsoft Bing обрабатывается с помощью Ajax и не может работать в среде, где не работает JavaScript. (Это сделано в экспериментальных целях, поэтому при извлечении изображений делайте это через 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 будет содержать отображаемый HTML-код после запуска JavaScript. Поместив это в jsoup, вы можете найти URL-адреса различных изображений. На основе URL-адреса найденного изображения используйте команду wget, чтобы сохранить его в папке в любом каталоге.
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 необходимо скачать с этого сайта и поместить в PATH.
Кажется, есть несколько способов написать это, но это самая простая реализация.
Вся логика, подлежащая очистке, заключенная в {}, становится экземпляром потока, и вы можете запустить этот поток или присоединиться к нему, чтобы запустить его параллельно.
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
}
Похоже, что модуль сериализации под названием jackson можно будет использовать ограниченное время.
Похоже, одна Java-библиотека не работает, и модуль для Kotlin нужно загружать отдельно.
По ограничению я попробовал сериализовать и десериализовать MutableMap<String, DataClass>, но это не сработало.
MutableMap<String, String> работает нормально, поэтому я не уверен, плоха ли вложенная структура или она не поддерживает класс данных.
Пример сериализации
val mapper = ObjectMapper ().registerKotlinModule()
val serialzied = mapper.writeValueAsString(url_details)
Пример десериализации
val mapper = ObjectMapper ().registerKotlinModule()
val url_details = mapper.readValue< MutableMap < String , String >>(json)
Сначала git clone
$ git clone https://github.com/GINK03/kotlin-phantomjs-selenium-jsoup-parser.git
На данный момент реализовано два типа очистки: простое сканирование до глубины 100 с использованием поиска в ширину без оценки JavaScript.
(Поскольку я использовал его для очистки своего собственного сайта, я не устанавливал каких-либо конкретных ограничений, но по умолчанию установлено 50 или более параллельных доступов, поэтому, пожалуйста, внесите соответствующие изменения.)
$ sh run.scraper.sh widthSearch ${yourOwnSite}
Используйте Microsoft Bing для поиска на экране поиска изображений. Это экспериментальный код, позволяющий проверить, можно ли получить контент, нарисованный с помощью Ajax, без использования API, поэтому я не думаю, что к нему следует обращаться в больших количествах и вызывать проблемы.
Список поиска см. в файле kancolle.txt на github.
sh run.scraper.sh image ${検索クエリリスト} ${出力ディレクトリ}