بايثون هي لغة مفيدة. ومع ذلك، يمكن أن تسوء الأمور بسبب افتقار لغة البرمجة النصية إلى تقييم صارم للنوع وبعض العمليات المكلفة. بناءً على تجربتي الشخصية، غالبًا ما كنت منزعجًا من الأخطاء غير القابلة للتكرار في Python في البرامج حيث يصبح هدف التحليل كبيرًا ويتطلب التوازي. لقد قمت بتجريب Kotlin بشكل عرضي ووجدت أنه سهل الاستخدام للغاية، لذلك حاولت نقل Scraper الذي تم تنفيذه في Python3.
(بالمناسبة، لم أتطرق إلى لغة جافا مطلقًا)
هذا مبتدئ في Kotlin، لكن يبدو أن سلاسل Python وسلاسل Kotlin تتصرف بشكل مختلف.
على الرغم من أن مؤشر ترابط Kotlin لا يقسم العملية، إلا أن معدل استخدام وحدة المعالجة المركزية يتجاوز 100%، لذلك يبدو أن الترابط الفعال يتم تنفيذه باستخدام وحدات معالجة مركزية متعددة. (وبعبارة أخرى، بعد التقسيم باستخدام Multiprocess، يبدو أنه ليست هناك حاجة لتشغيل مؤشر ترابط تحته)
هذه هي طريقة التثبيت على أوبونتو.
$ 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's Maven وما إلى ذلك إلى مسار الفصل. (لنفترض أنك تستخدم الملفات alice.jar وbob.jar)
وهذا مفيد جدًا لأنه يسمح لنا بإعادة استخدام العديد من أصول Java.
$ kotlinc foo.kt bar.kt -cp alice.jar:bob.jar -include-runtime foo.jar
على سبيل المثال، عند تنفيذ جرة kotlin باستخدام ملف جرة خارجي، سيكون الأمر هكذا.
$ kotlin -cp alice.jar:bob.jar:foo.jar FooKt
يبدو أن هذا الاسم FooKt يُستخدم لتحديد ملف foo.kt الذي يحتوي على الوظيفة الرئيسية.
عندما يكون هناك تحميل غير متزامن للبيانات باستخدام JavaScript، إذا قمت ببساطة باستعادتها وتحليلها باستخدام jsoup وما إلى ذلك، فلن تتمكن من الحصول على المحتوى. يجب عليك تشغيل JavaScript لإنشاء حالة مشابهة لما قد يراه الإنسان. قم بتشغيل phamtomjs عبر السيلينيوم لتشغيل JavaScript. على سبيل المثال، يتم عرض بحث الصور في Microsoft Bing باستخدام Ajax ولا يمكن أن يعمل في بيئة لا تعمل فيها JavaScript. (هذا لأغراض تجريبية، لذا عند نسخ الصور فعليًا، يرجى القيام بذلك عبر واجهة برمجة التطبيقات.)
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 الخاص بـ src لمختلف الصور، واستنادًا إلى عنوان 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 من هذا الموقع ووضعه في المسار.
يبدو أن هناك عدة طرق لكتابة هذا، ولكن هذا هو التنفيذ الأسهل.
يصبح المنطق بأكمله الذي سيتم كشطه والمحاط بـ {} مثيلًا لسلسلة رسائل، ويمكنك بدء هذا الموضوع أو الانضمام إليه لتشغيله بالتوازي.
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
}
يبدو أنه يمكن استخدام وحدة تسلسل تسمى جاكسون لفترة محدودة.
يبدو أن مكتبة 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 https://github.com/GINK03/kotlin-phantomjs-selenium-jsoup-parser.git
حتى الآن، تم تنفيذ نوعين من الاستخراج: ببساطة الاستخراج إلى عمق 100 باستخدام بحث العرض الأول دون تقييم JavaScript.
(نظرًا لأنني كنت أستخدمه في استخراج موقعي الخاص، لم أقم بتعيين أي حدود معينة، ولكن الإعداد الافتراضي هو 50 أو أكثر من عمليات الوصول المتوازية، لذا يرجى التعديل وفقًا لذلك.)
$ sh run.scraper.sh widthSearch ${yourOwnSite}
استخدم Microsoft Bing للبحث على شاشة البحث عن الصور. هذا كود تجريبي لمعرفة ما إذا كان من الممكن الحصول على محتوى مرسوم باستخدام Ajax دون استخدام واجهة برمجة التطبيقات، لذلك لا أعتقد أنه يجب الوصول إليه بكميات كبيرة والتسبب في مشاكل.
يرجى الرجوع إلى ملف kancolle.txt على جيثب للحصول على قائمة البحث.
sh run.scraper.sh image ${検索クエリリスト} ${出力ディレクトリ}