Wednesday, August 31, 2016

Apache Nutch Crawl Script : Web Crawling hanya dengan Satu Command

Pada artikel Kombinasi Apache Nutch, Elasticsearch, dan MongoDB untuk Menyerap Data dari Internet telah dibahas secara singkat tentang apa itu Apache Nutch, apa itu Elasticsearch, dan Apa itu MongoDB.

Kemudian, pada artikel Crawling Website dan Membangun Mesin Pencari Menggunakan Apache Nutch, Elasticsearch, dan MongoDB telah dijelaskan langkah-langkah website crawling menggunakan Apache Nutch yang meliputi 6 tahap dengan mengeksekusi 6 command Apache Nutch, yaitu: inject, generate, fetch, parse, updatedb, index. Telah disebutkan pula bahwa proses crawling yang meliputi 6 langkah ini tidak cukup hanya dilakukan satu kali untuk dapat meng-index seluruh isi website yang dijadikan target.

Beruntungnya, Apache Nutch juga dilengkapi dengan script yang dapat mempersingkat proses crawling dari 6 langkah menjadi satu langkah saja, yaitu dengan mengeksekusi perintah berikut:
hennywijaya$ runtime/local/bin/crawl urls/ webpage3 http://localhost:9300/nutch/ 3

Adapun arguments dari perintah diatas adalah:
1. urls adalah directory urls, yang berisi file seeds.txt.
2. webpage3 adalah crawling id, yang dapat berupa sembarang teks. Crawling id ini akan digunakan sebagai nama collection di database MongoDB yang memuat data hasil crawling.
3. http://localhost:9300/nutch/ adalah url yang menunjuk alamat server Elasticsearch dengan nomor port 9300 (BUKAN 9200), yang diikuti dengan nama index seperti yang tercantum pada file konfigurasi nutch-site.xml (dalam hal ini nama index-nya adalah nutch).
4. Angka 3 menunjukkan kedalaman crawling, yaitu berapa kali crawler tersebut harus mengulangi proses crawling terhadap website yang dijadikan target.

Jadi, syntax dari perintah/command untuk menjalankan scrpit crawling adalah:
bin/crawl <urls directory> <crawling id> <the url to the elasticsearch server with index name> <crawling depth>
Berikut adalah contoh eksekusi perintah crawling dengan menggunakan script crawl bawaan Apache Nutch:
Hennys-MacBook-Pro:apache-nutch-2.3.1 hennywijaya$ runtime/local/bin/crawl urls/ webpage7 http://localhost:9300/nutch/ 7

Injecting seed URLs
/Users/hennywijaya/nutch/apache-nutch-2.3.1/runtime/local/bin/nutch inject urls/ -crawlId webpage7
InjectorJob: starting at 2016-07-07 18:04:59
InjectorJob: Injecting urlDir: urls
InjectorJob: Using class org.apache.gora.mongodb.store.MongoStore as the Gora storage class.
InjectorJob: total number of urls rejected by filters: 1
InjectorJob: total number of urls injected after normalization and filtering: 2
Injector: finished at 2016-07-07 18:06:19, elapsed: 00:01:20
Thu Jul 7 18:06:19 JST 2016 : Iteration 1 of 7

Generating batchId
Generating a new fetchlist
/Users/hennywijaya/nutch/apache-nutch-2.3.1/runtime/local/bin/nutch generate -D mapred.reduce.tasks=2 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true -topN 50000 -noNorm -noFilter -adddays 0 -crawlId webpage7 -batchId 1467882379-31716
GeneratorJob: starting at 2016-07-07 18:06:21
GeneratorJob: Selecting best-scoring urls due for fetch.
GeneratorJob: starting
GeneratorJob: filtering: false
GeneratorJob: normalizing: false
GeneratorJob: topN: 50000
GeneratorJob: finished at 2016-07-07 18:06:31, time elapsed: 00:00:10
GeneratorJob: generated batch id: 1467882379-31716 containing 4272 URLs

Fetching : 
/Users/hennywijaya/nutch/apache-nutch-2.3.1/runtime/local/bin/nutch fetch -D mapred.reduce.tasks=2 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true -D fetcher.timelimit.mins=180 1467882379-31716 -crawlId webpage7 -threads 50
FetcherJob: starting at 2016-07-07 18:06:32
FetcherJob: batchId: 1467882379-31716
FetcherJob: threads: 50
FetcherJob: parsing: false
FetcherJob: resuming: false
FetcherJob : timelimit set for : 1467893192722
Using queue mode : byHost
Fetcher: threads: 50
fetching http://images.detik.com/community/media/visual/2016/07/06/79502271-1ad6-4dca-8580-1093d1064e2d_43.jpg?w=350&q= (queue crawl delay=5000ms)
fetching http://food.detik.com/read/2016/07/06/122330/3248879/900/ini-trik-makan-enak-dan-sehat-saat-lebaran?mpfood (queue crawl delay=5000ms)
fetching http://sport.detik.com/sepakbola/ (queue crawl delay=5000ms)
fetching https://www.airbnb.com/s/Hawaii--United-States?type=villa (queue crawl delay=5000ms)
fetching http://oto.detik.com/indeks?otindeks (queue crawl delay=5000ms)
Fetcher: throughput threshold: -1
Fetcher: throughput threshold sequence: 5
fetching http://inet.detik.com/read/2016/07/06/123239/3248882/317/mau-jadi-premium-harga-xiaomi-tak-murah-lagi?mpinet (queue crawl delay=5000ms)
fetching http://apps.detik.com/ (queue crawl delay=5000ms)
fetching http://post.detik.com/formv1/js/actScript.php?id=298 (queue crawl delay=5000ms)
fetching http://wolipop.detik.com/mostpopular?utm_source=wp&utm_medium=nav%20more&utm_campaign=most%20popular/mostpopular (queue crawl delay=5000ms)
fetching http://detik.com/dapur/beriklan (queue crawl delay=5000ms)
fetching http://jalurmudik.detik.com/ (queue crawl delay=5000ms)
fetching http://finance.detik.com/read/2016/07/06/151555/3248942/1034/setelah-lebaran-pertamina-teken-kerja-sama-minyak-dengan-iran?mpfinance (queue crawl delay=5000ms)
fetching http://blog.detik.com/foto/38/mengoptimalkan-wisata-surabaya-melalui-sunday-sharing-surabaya-14 (queue crawl delay=5000ms)
...
...
...
Parsing http://wolipop.detik.com/thespotlight/busanalebaran
Parsing http://detik.com/dapur/beriklan
ParserJob: success
ParserJob: finished at 2016-07-07 21:10:02, time elapsed: 00:03:13

CrawlDB update for webpage7
/Users/hennywijaya/nutch/apache-nutch-2.3.1/runtime/local/bin/nutch updatedb -D mapred.reduce.tasks=2 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true 1467882379-31716 -crawlId webpage7
DbUpdaterJob: starting at 2016-07-07 21:10:16
DbUpdaterJob: batchId: 1467882379-31716
DbUpdaterJob: finished at 2016-07-07 21:12:22, time elapsed: 00:02:06

Indexing webpage7 on SOLR index -> http://localhost:9300/nutch/
/Users/hennywijaya/nutch/apache-nutch-2.3.1/runtime/local/bin/nutch index -D mapred.reduce.tasks=2 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true -D solr.server.url=http://localhost:9300/nutch/ -all -crawlId webpage7
IndexingJob: starting
Active IndexWriters :
ElasticIndexWriter
 elastic.cluster : elastic prefix cluster
 elastic.host : hostname
 elastic.port : port  (default 9300)
 elastic.index : elastic index command 
 elastic.max.bulk.docs : elastic bulk index doc counts. (default 250) 
 elastic.max.bulk.size : elastic bulk index length. (default 2500500 ~2.5MB)


IndexingJob: done.



Demikian, proses crawling yang sejatinya terdiri atas 6 langkah, harus mengeksekusi 6 perintah secara berurutan ( inject, generate, fetch, parse, updatedb, index ), kini dapat dilakukan hanya dengan mengeksekusi satu perintah dengan menggunakan crawl script bawaan Apache Nutch.

Setelah proses crawling selesai, yakni data hasil crawling telah disimpan dan di-index, selanjutnya data tersebut dapat divisualisasikan menggunakan Kibana. Langkah-langkahnya sama dengan yang telah dijelaskan pada artikel (Crawling Website dan Membangun Mesin Pencari Menggunakan Apache Nutch, Elasticsearch, dan MongoDB).

Ingat: apache-nutch-2.3.1 TIDAK kompatibel dengan elasticsearch-2.3.3 Kompatibilitas yang telah dikonfirmasi adalah apache-nutch-2.3.1 + elasticsearch-1.4.4 + kibana-4.1.8 + mongodb-3.2.1

Pada pengaturan default, links yang mengandung parameter query akan tidak dihiraukan atau disaring dan dibuang. Untuk dapat melakukan crawling terhadap urls yang mengandung parameter query, silakan lakukan pengaturan pada file conf/regex-urlfilter.txt dan tambahkan # pada permulaan setiap garis untuk menyatakan isi baris tersebut sebagai comment.
# skip URLs containing certain characters as probable queries, etc.
#-[?*!@=]

Selamat Mencoba!

No comments: