Anda di halaman 1dari 38

Au

uto Gener
G rated Content
ngan XML-RPC
den C

W
WebScrapping
gdenganAPI+PembuatanAplikasiXM
MLRPC

Yoyon
n Sugion
no

1
KATA PENGANTAR

Assalamu'alaikum warahmatullahi wabarakatuh.

Terimakasih untuk rekan-rekan yang telah melakukan pre-order buku saya yang berjudul
"Panduan Membuat Plugin WordPress" yang akan diterbitkan oleh Elex Media Komputindo.

Materi pada ebook ini membahas cara penggunaan tools "Full Text RSS" dari FiveFilters.org
sebagai API untuk menyediakan konten secara otomatis (auto generated content), tools
tersebut bisa Anda beli melalui website mereka ataupun Anda bisa mencoba versi gratisnya
yang bisa didownload di github.com.

Dengan memanfaatkan Full Text RSS sebagai API, kita dapat melakukan scrapping atau
grabbing untuk sebagian besar website yang ada tanpa harus melakukan koding berulang-
ulang, tapi cukup dengan memasukkan pattern dari web yang menjadi targetnya. Dan data hasil
dari proses scrapping ini akan kita coba manfaatkan untuk mengisi konten web berbasis
WordPress dengan XML-RPC.

Terlepas dari pro dan kontra masalah web grabbing atau web scraping, ebook ini hanyalah
merupakan media untuk pembelajaran, semoga dapat dimanfaatkan dengan bijak.

Oya, bisa jadi persepsi saya dan rekan-rekan tentang AGC berbeda, sebab saya pribadi
menganggap autoblog yang kontentnya hasil scrapping juga termasuk dalam AGC, jadi tidak
melulu menggunakan virtual page atau yang datanya selalu scrapping setiap ada akses ke
halaman tertentu. Saya mohon maaf jika perbedaan persepsi ini mengecewakan Anda tentang
isi materi pada ebook ini yang tidak sesuai dengan harapan.

Adapun aplikasi yang saya sertakan hanya sebuah contoh, sehingga Anda tentu perlu
melakukan modifikasi atau pengembangan agar sesuai dengan kebutuhan masing-masing.

Happy scraping!

Yoyon Sugiono
http://yoyonsugiono.com

BAB 1
SETUP API DENGAN FULL TEXT RSS
1.1. Memanfaatkan Full Text RSS sebagai API

1. Siapkan web server di komputer masing-masing, saya pribadi memanfaatkan


DesktopServer dalam penyusunan materi ini. Download di https://serverpress.com

2. Download Full Text RSS di https://github.com/Dither/full-text-rss

3. Ekstrak file full-text-rss-master.zip hasil download tersebut ke dalam folder yang ingin Anda
inginkan. Sebagai contoh, saya meletakannya dalam folder grabit.dev/api.

4. Sekarang coba akses url folder tersebut

5. Anda bisa masukan sembarang url dari web target yang ingin Anda scrap ke dalam field
URL yang ada, untuk kali ini cobalah gunakan URL berikut:
http://www.decoist.com/contemporary-table-lamps

6. Centang Include excerpt dan JSON output, lalu klik Create Feed, lihat hasilnya

7. Tools Full Text RSS Feed ini hasil scrap-nya dapat berupa JSON, artinya tools ini dapat
kita menfaatkan sebagai API. Yes! Kita bisa punya API sendiri untuk scrap website apapun
nantinya.

1.2. Cara Membaca Data berformat JSON

Nah, sekarang saatnya kita membuat aplikasi dengan PHP untuk membaca data JSON dari API
tersebut.

Contoh URL untuk mengakses API Full Text RSS adalah:

http://namadomain.com/api/makefulltextfeed.php?url=url-target-
scraping&max=20&links=remove&exc=1&summary=1&format=json&submit=Create+Feed

Sebagai contoh, kita coba untuk lakukan scraping untuk URL berikut:
http://www.decoist.com/contemporary-table-lamps/

Sebelum mulai membuat script secara lengkap, kita bisa mencoba untuk membaca struktur
data yang dihasilkan oleh API tersebut, silahkan ketikan baris kode berikut dan kemudian
simpan dengan nama file test.php misalnya:

<?php

$target = 'http://www.decoist.com/contemporary-table-lamps/';
$target = str_replace(array('http://', 'https://'),'', $target);

$api = 'http://'.$_SERVER['HTTP_HOST'].'/api/makefulltextfeed.php?url='.$target.
'&max=20&links=remove&exc=1&summary=1&format=json&submit=Create+Feed';
$response = file_get_contents($api);
$data = json_decode($response);
var_dump($data);

?>

Silahkan jalankan script tersebut melalui browser yang Anda gunakan. Maka kita akan
mendapatkan hasil seperti screen shoot berikut:

Bisa kita lihat terdapat beberapa objek yang bersifat publik disana, sekarang kita coba untuk
melihat strukturnya lebih dalam lagi.

Ubahlah baris kode:

var_dump($data);

dengan

var_dump($data->rss->channel);

Simpan perubahan baris kode tersebut kemudian lakukan refresh pada halaman browser,
perhatikan hasilnya:

Di sana terlihat objek yang bersifat publik yang berisi tentang informasi detail dari halaman
website yang baru saja kita scrap!

Berikut cara mengakses data yang tersimpan pada field-field tersebut:

$data->rss->channel->item->nama-field

Struktur data di atas merupakan hasil dari scrapping single page dari sebuah website, sekarang
yuk kita coba lihat struktur data dari hasil scrapping sebuah RSS.

Sebagai contoh kita akan coba lakukan scrapping dari URL http://www.decoist.com/feed/

Cobalah ubah baris kode berikut pada file test.php yang sebelumnya Anda buat:

$target = 'http://www.decoist.com/contemporary-table-lamps/';

menjadi:

$target = 'http://www.decoist.com/feed/';

Lalu simpan perubahannya, kemudian lakukan refresh pada browser yang digunakan.

Perhatikan, hasil scarpping tersebut menghasilkan beberapa data detail artikel dari web target
kita:

Karena scrapping RSS data yang dihasilkan lebih dari satu, maka cara mengakses data detail
dari setiap artikel sedikit berbeda dengan cara akses data hasil scrapping single page:

$data->rss->channel->item[index]->title;

Oke, sampai di sini tentu Anda sudah mulai paham cara membaca data berformat JSON yang
dihasilkan dari sebuah API.

CATATAN :

Jika saat Anda menampilkan data dengan perintah var_dump terlihat objek stdClass, maka
Anda dapat mengakses field tersebut dengan pemberikan tanda

Jika saat Anda menampilkan data dengan perintah var_dump terlihat ada array, maka Anda
dapat mengakses field tersebut dengan menyebutkan nomor indexnya [index]

BAB 2
MEMBUAT WEB PATTERNS DAN MENYIMPAN
HASIL SCRAPPING
2.1. Membuat Aplikasi Pembaca Data JSON Hasil Scrapping

Karena kita sudah paham struktur data yang dihasilkan oleh API yang akan kita gunakan, maka
sekarang saatnya kita membuat aplikasi untuk membaca data hasil API yang berformat JSON
tersebut.

Gak usah buang waktu, silahkan ketikkan baris kode berikut, atau kalau malas dicopas juga
boleh kok hihihi...

<?php

function smart_grabber($url){
$TAGS_ALLOW =
'<h2><h3><ul><ol><li><p><img><br><blockquote><table><th><thead><tbody><tr><td>';

if(empty($url)){
return;
}

$get_url = trim($_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'],"index.php");
$fetch = $get_url.'api/makefulltextfeed.php?url='.$url.
'&max=20&links=remove&exc=1&summary=1&format=json&submit=Create+Feed';

$response = play_curl($fetch);
$web = json_decode($response);

if(!isset($web->rss->channel->item)){
return;
}

// Hasil scrapping bisa berupa item ARRAY ataupun tidak

$item = array();

if(is_array($web->rss->channel->item)){
foreach ($web->rss->channel->item as $i=>$ch){

if(isset($ch->title)){
$title = $ch->title;
} else {
$title = '';
}

if(isset($ch->description)){
$excerpt = $ch->description;
} else {
$excerpt = '';
}

if(isset($ch->content_encoded)){
$content = $ch->content_encoded;
} else {
$content = '';
}

if(isset($ch->pubDate)){
$date = $ch->pubDate;

} else {
$date = '';
}

if(isset($ch->dc_creator)){
$author = $ch->dc_creator;
} else {
$author = '';
}

if(isset($ch->dc_category)){
$category = $ch->dc_category;
} else {
$category = '';
}

if(isset($ch->dc_identifier)){
$source = $ch->dc_identifier;
} else {
$source = '';
}

preg_match_all( '|<img .*?src=[\'"](.*?)[\'"].*?>|i', $content, $images);


$images = $images[1];
$content = remove_attribute(strip_tags($content, $TAGS_ALLOW));

$item[] = array(
'title'=>$title,
'excerpt'=>$excerpt,
'content'=>minify($content),
'date'=>$date,
'author'=>$author,
'category'=>$category,
'source'=>$source,
'image'=>array_splice($images, 0, 1));
}
} else {

if(isset($web->rss->channel->item->title)){
$title = $web->rss->channel->item->title;
} else {
$title = '';
}

if(isset($web->rss->channel->item->description)){
$excerpt = $web->rss->channel->item->description;
} else {
$excerpt = '';
}

if(isset($web->rss->channel->item->content_encoded)){
$content = $web->rss->channel->item->content_encoded;
} else {
$content = '';
}

if(isset($web->rss->channel->item->pubDate)){
$date = $web->rss->channel->item->pubDate;
} else {
$date = '';
}

if(isset($web->rss->channel->item->dc_creator)){
$author = $web->rss->channel->item->dc_creator;
} else {
$author = '';
}

if(isset($web->rss->channel->item->dc_category)){
$category = $web->rss->channel->item->dc_category;
} else {
$category = '';
}

if(isset($web->rss->channel->item->dc_identifier)){
$source = $web->rss->channel->item->dc_identifier;

10

} else {
$source = '';
}

preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i', $content, $images);


$images = $images[1];
$content = remove_attribute(strip_tags($content, $TAGS_ALLOW));

$item[] = array(
'title'=>$title,
'excerpt'=>$excerpt,
'content'=>minify($content),
'date'=>$date,
'author'=>$author,
'category'=>$category,
'source'=>$source,
'image'=>array_splice($images, 0, 1));
}

return serialize($item);
}

function play_curl($url) {
$data = curl_init();
curl_setopt($data, CURLOPT_URL, $url );
curl_setopt($data, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($data, CURLOPT_RETURNTRANSFER, true);
curl_setopt($data, CURLOPT_REFERER, 'http://www.bing.com');
curl_setopt($data, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11");
$response = curl_exec($data);
curl_close($data);
return $response;
}

function remove_attribute($html){
$attribute_allow = 'src';
//return preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $html);
$html = preg_replace("/<([a-z][a-z0-
9]*)(?:[^>]*(\s(".$attribute_allow.")=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'<$1$2$3>', $html);
return str_replace("$attribute_allow>", '>', $html);
}

function minify($html) {
$r = preg_replace(array('/\r/', '/\n/', '//', '/\t/'),'', $html);
$r = preg_replace('/\s\s+/', ' ', $r);
$r = str_replace('> <', '><', $r);
return $r;
}

?>

Jika sudah selesai simpanlah dengan nama file functions.php diluar folder api.

Pemisahan fungsi-fungsi dalam file terpisah tujuannya untuk memudahkan kita jika suatu saat
ingin menggunakan fungsi-fungsi yang ada untuk keperluan aplikasi lainnya.

11

Saya tidak perlu menjelaskan secara mendetail kegunaan dari masing-masing fungsi yang ada,
sebab dari nama fungsinya juga seharusnya sudah dapat dipahami yah. Kalau belum paham ya
pura-pura paham aja yah hahaha...

Setelah kita membuat beberapa function di atas dan menyimpannya, sekarang buatlah
dokumen baru pada text editor yang digunakan, dan ketikan baris kode berikut:

<?php

include 'functions.php';

$url = '';
$title = '';
$author = '';
$source = '';
$content = '';

$save = FALSE;
$saveit = '';

if(!empty($_POST['save'])){
$save = TRUE;
$saveit = 'CHECKED';
}

if(!empty($_POST['url'])){
$url = trim($_POST['url']);
$urls = array_filter(explode(PHP_EOL, $url));
$url = array_shift($urls);
$data = unserialize(smart_grabber($url));
$url = implode(PHP_EOL, $urls);

if(!empty($data)){
foreach($data as $dt){
$title = $dt['title'];
$author = $dt['author'];
$source = $dt['source'];
$content = $dt['content'];

if($save){
$filename = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $title);
$filename = mb_ereg_replace("([\.]{2,})", '', $filename);

$current_dir = dirname(__FILE__);
$data_dir = "$current_dir/data";

$domain = parse_url($source, PHP_URL_HOST);

if(!file_exists($data_dir)){
if(!is_writable($current_dir)){
chmod($current_dir, 0755);
}
mkdir($data_dir, 0755);
}

if(!file_exists("$data_dir/$domain")){
if(!is_writable($data_dir)){
chmod($data_dir, 0755);
}
mkdir("$data_dir/$domain", 0755);
}

$document = array('title'=>$title, 'author'=>$author, 'source'=>$source,


'content'=>$content);
file_put_contents("$data_dir/$domain/$filename.txt", json_encode($document));
}
}
}
}

?>

<html>

12

<head>
<title>SMART GRABBER</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="//cdn.tinymce.com/4/tinymce.min.js"></script>
<script>tinymce.init({ mode : "specific_textareas", editor_selector : "document", plugins:
"image", media_live_embeds: true});</script>
<script src="toggle.js"></script>
<style type="text/css">
body {
font-family: Arial, Helvetica, sans-serif;
color: #333;
background-color:#D3D3D3;
margin: 0px;
padding: 0px; }
table {
font-family: Arial, Helvetica, sans-serif;
color: #333;
font-size: 15px;}
#document, #url, #title, #author {
border: 1px solid #D3D3D3;
font-family: Arial, Helvetica, sans-serif;
color: #333;
font-size: 15px;}
#container {
width: 1000px;
margin: auto auto;
background-color:#fff;
padding: 10px;}
</style>
</head>
<body>
<div id="container">
<form action="" method="post">
<table>
<tr><td cospan="2">
Daftar URL yang akan di grab:<br />
</td></tr>
<tr><td>
<textarea cols="120" rows="5" id="url" name="url"><?php echo $url; ?></textarea>
</td><td valign="top"><label for="save"><input type="checkbox" id="save" name="save"
value='yes' <?php echo $saveit?>> Simpan<label><br /><br />
<input type="submit" id="submit" value="GRAB IT!">
</td></tr>
<tr><td><br />Judul :<br />
<input type="text" size="100" id="title" name="title" value="<?php echo $title; ?>">
</td><td></td></tr>
<tr><td><br />Penulis :<br />
<input type="text" size="100" id="author" name="author" value="<?php echo $author; ?>">
</td><td></td></tr>
<tr><td colspan="2"><br />Artikel :<br />
<textarea cols="133" rows="25" id="document" name="document" class="document"><?php echo
$content; ?></textarea>
</td></tr>
</table>
</form>
</div>

<?php
if(!empty($urls)){
echo '<script>setInterval(function () {document.getElementById("submit").click();},
1000);</script>';
}?>

</body></html>

Jika sudah selesai simpan baris kode tersebut dengan nama file index.php pada lokasi yang
sama dengan file functions.php yang dibuat sebelumnya.

13

Sekarang, silahkan akses file index.php dari browser yang Anda gunakan (kalau saya
http://grabit.dev)

Pada form tersebut bisa Anda perhatikan ada beberapa file, diantaranya:

Field Wajib diisi :

Daftar URL Anda bisa memasukan satu atau beberapa URL yang menjadi target untuk
di scrap/grab datanya, bisa berupa single page atau rss

14

Field Terisi dengan Hasil Scrapping :

Judul Berfungsi untuk menampilkan judul artikel hasil scrapping

Artikel Berfungsi untuk menampilkan bagian artikel hasil scrapping

Field Bersifat Opstional, sesuaikan dengan keperluan :

CheckBox Simpan Pilihan apakah kita akan menyimpan data hasil scrapping atau tidak.

Coba masukan url misalnya: http://www.decoist.com/contemporary-table-lamps/ lalu klik


tombol GRAB!

Horeeee... Berhasil... Berhasil....

Ternyata gampang bener yah lakukan web scrapping, bahkan tanpa lihat struktur web target
saja kita sudah berhasil mendapatkan datanya!

Tapi tunggu dulu, kenapa data penulis tidak muncul?

15

Gak perlu panik, bisa jadi karena halaman web target yang kita scrape memang tidak ada nama
penulisnya. Gak percaya? Kalau gitu yuk kita lihat halaman tersebut melalui browser.

Silahkan buka URL http://www.decoist.com/contemporary-table-lamps/ melalui browser yang


Anda gunakan.

Perhatikan detail halaman tersebut, cari apakah benar di sana tidak ada nama penulis artikel
tersebut?

2.2. Membuat Patterns Web Target

Adakalanya suatu website dapat kita scrape secara baik tanpa membuat pattern-nya terlebih
dahulu, namun jika hasilnya tidak sesuai dengan yang diharapkan barulah nanti kita daftarkan
pattern-nya.

Contoh Pattern untuk decoist.com

Wow, ternyata data Author ada disana. Lalu kenapa tidak muncul? Hal ini bisa saja terjadi
karena pattern yang digunakan belum dikenali.

16

Kalau begitu yuk kita coba buat pattern untuk web target decoist.com tersebut.

1. Buka halaman admin melalui URL /api/admin


Masukan Username: admin0 dan Password: admin0 lalu klik tombol Log In

2. Anda akan masuk ke dalam halaman Admin

3. Karena API yang Anda gunakan belum memiliki daftar pattern, silahkan klik menu Update
Patterns, lalu klik tombol Update site config files.

4. Jika proses update pattern sudah selesai, sekarang klik menu Edit Patterns.

17

Lihat! Begitu banyak daftar pattern yang tersedia, Anda bisa membuka setiap pattern yang
ada untuk dipelajari isinya, sehingga Anda akan dapat membuat pattern baru untuk web
target yang belum terdaftar di sana.

Masukan URL http://www.decoist.com/contemporary-table-lamps/ ke dalam field yang


ada, lalu klik tombol Search or add.

Akan muncul form untuk lakukan editing pattern

5. Sekarang bukalah situs http://siteconfig.fivefilters.org di tab baru pada browser yang


sedang digunakan. Situs ini akan kita gunakan untuk melakukan pendeteksian pattern dari
web yang menjadi target untuk kita scrap nantinya.

Masukan URL http://www.decoist.com/contemporary-table-lamps/ yang akan dilihat


pattern-nya, kemudian klik tombol GO.

18

6. Arahkan pointer pada setiap bagian pada website yang akan di deteksi pattern-nya, jika
sudah dapat area yang diinginkan lalu klik area tersebut. Kali ini arahkan pada nama
penulisnya.

7. Copy kode XPath yang ada, lalu simpanlah dalam sebuah text editor untuk memudahkan
pada saat akan digunakan.

8. Kembali ke Edit site patterns, silahkan ubah pattern sesuai dengan kode XPath yang sudah
didapatkan. Jika sudah selesai klik tombol Save untuk menyimpan perubahan yang ada.

19

9. Kembali coba kita scrap ulang url http://www.decoist.com/contemporary-table-lamps/

Sekarang nama penulis sudah tertera disana. Namun Anda bisa perhatikan, ada kata "by"
sebelum nama penulisnya. Kita bisa membersihkannya dengan sedikit memodifikasi
pattern yang ada.

10. Silahkan Edit patterns untuk domain decoist.com dengan pattern berikut dan simpan.
author: substring-after(//p[contains(concat(' ',normalize-space(@class),' '),' post-author ')], 'by
')
test_url: http://www.decoist.com/contemporary-table-lamps

11. Cobalah untuk lakukan scrap kembali url http://www.decoist.com/contemporary-table-


lamps/

12. Sekarang perhatikan bagian bawah artikel hasil scrap-nya

20

13. Jika tulisan "Liked the story? Share it with friends." ingin kita hapus, maka kita dapat
menghapusnya dengan pattern.

Perhatikan halaman sumber artikel tersebut:

Silahkan edit kembali patterns untuk domain decoist.com tambahkan pattern berikut:

strip: //h3[contains(., 'Liked the story?')]

Lengkapnya bisa dilihat pada gambar berikut:

21

Jika sudah silahkan simpan hasil perubahan patterns yang ada dan cobalah untuk lakukan
scraping kembali. Gimana hasilnya?

Contoh Pattern untuk education.com

Sekarang yuk kita coba dengan situs education.com; kebetulan saya suka sekali baca-baca
artikel yang ada disitus ini, gmana kalau kita scrape aja sekalian? Hahaha...

Sok atuh, coba scrape dulu salah satu halamannya dan lihat apa yang kurang atau malah ada
info yang kelebihan tidak ingin kita tampilkan?

https://www.education.com/science-fair/article/arch-magic-unbreakable-eggs/

Perhatikan dengan seksama hasil dari scrapping dari web tersebut.

22

Jika diperhatikan, disana kita kehilangan beberapa detail informasi seperti gambar, objective
dan material and equipment.

Pada saat kondisi seperti inilah kita perlu mendaftarkan juga patterns yang ada pada web
target. Cara mendaftarkan patterns suatu website silahkan baca pada halaman-halaman
sebelumnya.

Berikut patterns untuk bagian artikel domain educations.com

body: ////div[contains(concat(' ',normalize-space(@class),' '),' sci-fair-article ')]


test_url: https://www.education.com/science-fair/article/arch-magic-unbreakable-eggs/

Simpan perubahan patterns yang ada dan kemudian coba lakukan scraping kembali untuk
halaman website:

https://www.education.com/science-fair/article/arch-magic-unbreakable-eggs/

Selalu perhatikan setiap hasil scrapping, apakah sudah sesuai dengan keinginan atau belum.

Disana kita sudah memiliki gambar dari artikel dan beberapa detail yang sebelumnya tidak kita
dapatkan.

23

Sekarang perhatikan, nama penulis seharusnya bukan terletak pada bagian artikel (tidak
tersimpan dalam satu variabel yang sama), sebab kita memiliki field khusus yang digunakan
untuk menampilkan nama penulis (seharusnya tersimpan dalam variabel lainnya). Ingat, artikel
tersimpan dalam variabel $content dan penulis tersimpan dalam variabel $author.

Agar nama penulis dapat tersimpan dalam field $author, maka kita perlu membuat pattern
untuk nama penulis tersebut.

tambahkan kode XPath tersebut ke dalam pattern pada domain education.com;

24

author: //h3[contains(concat(' ',normalize-space(@class),' '),' article-author ')]

Untuk lengkapnya bisa lihat pada gambar berikut:

Simpan perubahan patterns yang ada, dan kemudian cobalah lakukan scraping kembali untuk
URL yang sama.

Perhatikan hasilnya:

Pada field penulis sudah terisi nama penulisnya, namun ternyata mengandung kata "By". Untuk
menghilangkan kata by kita dapat menghapusnya dengan memodifikasi pattern-nya.

author: substring-after(//h3[contains(concat(' ',normalize-space(@class),' '),' article-author ')], 'By ')

Lengkapnya perhatikan gambar berikut:

Silahkan simpan perubahan pattern-nya dan lakukan scraping masih untuk URL yang sama.
Lihat hasilnya:

25

Untuk nama penulis pada field penulis sudah tidak ada masalah, lalu bagaimana cara
menghilangkan nama penulis pada artikel? Yupz, bisa kita hilangkan dengan menggunakan
pattern juga!

Tambahkan pattern berikut untuk menghilangkan nama penulis dan tanggal update pada
artikel:

strip_id_or_class: article-author
strip_id_or_class: article-updated

Untuk lengkapnya perhatikan gambar berikut:

Silahkan simpan perubahan pattern yang ada dan kemudian cobalah lakukan scraping kembali
dan perhatikan hasilnya. Seharusnya nama penulis dan tanggal update pada bagian artikel
sudah tidak ada lagi.

Bagaimana jika kita ingin menghilangkan bagian disclaimer yang muncul pada bagian bawah
artikel? Sama seperti proses penghapusan data-data yang tidak diinginkan sebelumnya, cukup
gunakan pattern!

26

Tambahkan pattern berikut:

strip_id_or_class: article-updated

Untuk lengkapnya perhatikan gambar berikut:

Silahkan lakukan scraping sekali lagi pada URL yang sama untuk melihat hasilnya:

Perhatikan dengan seksama, data sudah bersih dari informasi-informasi yang tidak diinginkan,
dan detail informasi yang seharusnya adapun sudah muncul disana.

27

2.3. Menyimpan Data Hasil Scrapping

Jika Anda ingin agar data hasil scraping disimpan ke dalam file, maka centanglah pilihan yang
terlihat pada tanda panah merah tersebut.

Semua data yang tersimpan akan dikelompokan dalam foldernya masing-masing

28

2.4. Mengumpulkan URL Target dalam Sebuah Website

Untuk menghemat waktu, kita bisa mengumpulkan daftar URL yang ingin discrap, saya
biasanya mencoba mencari sitemap dari website target, atau menggunakan add-ons firefox
yaitu Copy Urls Expert.

Jika daftar URL yang akan diambil tidak tersedia pada sitemap dan jumlahnya cukup banyak
sehingga jika menggunakan Copy Urls Expert akan memakan waktu cukup lama, maka langkah
terakhir yang diambil adalah membuat script crawler untuk mengambil daftar URL yang ada.

Jika daftar URL sudah didapatkan, kita bisa lakukan scraping untuk beberapa URL tersebut
secara bersamaan. Selagi proses scraping, kita tentu saja bisa mengerjakan pekerjaan lainnya.

29

Proses scraping akan berlangsung selama daftar URL masih tersedia.

30

BAB 3
AUTOPOST DENGAN XML-RPC

Pertama kali menggunakan XML-RPC ini disebabkan karena dulu pada saat membeli bots
(yang dibuat dengan ubot) untuk lakukan posting produk Amazon ternyata botnya gak jalan
karena spek komputer yang saya punya terlalu rendah dan juga karena koneksinya memang
tidak memadai juga. Beruntung sempat menggunakan VPS gratisan dari WindowsAzure, saat
itu saya coba setting VPS dengan spek maksimal yang bisa dibuat, dan saya jalankan 40 bots
pada saat yang bersamaan, sayang hanya bertahan 15 hari bandwidth sudah kehabisan dan
kalau mau melanjutkan pemakaian musti bayar $500, saya lebih milih mundur jadinya hahaha...

Karena mahalnya biaya VPS itulah, akhirnya saya memakai XML-RPC sebagai pengganti bots
yang saya beli, saya bisa jalankan script dari komputer dengan spek yang rendah dan koneksi
saya juga tetap bisa dipakai, atau bisa juga diletakan di vps dengan speknya yang biasa saja.

Untuk mengaktipkan fasilitas XML-RPC, dapat kita lakukan melalui Settings Writing, lalu beri
tanda centang pada field Enabled.

Beberapa hosting secara default menghilankan fasilitas ini, katanya sih untuk menjaga
keamaanan. Jika disana tidak tersedia cobalah untuk meninstall plugin "Control XML-RPC
publishing"

Setelah kita mengaktipkan fasilitas XML-RPC, saatnya kita membuat aplikasi XML-RPC untuk
lakukan posting secara remote dengan memanfaatkan artikel yang sudah kita simpan
sebelumnya.

Silahkan ketikan baris kode berikut:

<?php

error_reporting(1);

$folder = '';
$file = '';
$files = '';
$url = '';
$user = '';
$password = '';

31

if(isset($_POST['folder'])){
$folder = $_POST['folder'];
}

if(isset($_POST['files'])){
$files = $_POST['files'];
}

if(isset($_POST['url'])){
$url = $_POST['url'];
}

if(isset($_POST['user'])){
$user = $_POST['user'];
}

if(isset($_POST['password'])){
$password = $_POST['password'];
}

$dir = dirname(__FILE__)."/data/$folder/";

if(isset($_POST['submit'])){
if(empty($files) && !empty($folder) && (empty($url) || empty(user) || empty(password))){
$objects = scandir($dir);
foreach($objects as $object){
if(is_file($dir.$object)){
$files .= $object . PHP_EOL;
}
}
}
}

if(!empty($files) && !empty($folder) && (!empty($url) && !empty(user) && !empty(password))){


$list = explode(PHP_EOL, $files);
$list = array_filter($list);
$file = array_shift($list);
$files = implode(PHP_EOL, $list);
}

if(!empty($file) && !empty($folder) && (!empty($url) && !empty(user) && !empty(password))){


include ('vendors/xmlrpc_client.php');

$xmlrpc = 'http://'. $url . '/xmlrpc.php';


$client = new xmlrpc_client($xmlrpc, true);

$article = json_decode(file_get_contents("$dir$file"));
//var_dump($article);
//die;

$post_id = $client->call('wp.newPost', array(


0,
$user,
$password,
array(
'post_title' => $article->title,
'post_content' => $article->content,
'post_status' => 'draft',
'post_type' => 'post',
'terms_names' => array(
'post_tag' => array( 'test tag' ),
'category' => array( 'test category' )
),
),
));

}
?>

<html>
<head>
<title>XML-RPC</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body {
font-family: Arial, Helvetica, sans-serif;
color: #333;

32

background-color:#D3D3D3;
margin: 0px;
padding: 0px; }
#folder, #files,#url, #user, #password {
border: 1px solid #D3D3D3;
font-family: Arial, Helvetica, sans-serif;
color: #333;
font-size: 15px;}
#container {
width: 1000px;
margin: auto auto;
background-color:#fff;
padding: 10px;}
</style>
</head>
<body>
<div id="container">
<form action="" method="post">
<?php
if(!isset($_POST['submit'])){
echo 'Daftar Folder:<br /><select multiple style="width:990px; height:300px" id="folder"
name="folder">';
foreach(glob('data/*', GLOB_ONLYDIR) as $dir) {
echo '<option>'.basename($dir).'</option>';
}
echo '</select>';
} else { ?>
<strong>Blog WordPress</strong><br />
<table>
<tr><td>URL http://</td><td><input type="text" id="url" name="url" value="<?php echo
$url; ?>"></td></tr>
<tr><td>User Name</td><td><input type="text" id="user" name="user" value="<?php echo
$user; ?>"></td></tr>
<tr><td>Password</td><td><input type="password" id="password" name="password"
value="<?php echo $password; ?>"></td></tr>
<tr><td>Folder</td><td><select id="folder" name="folder"><option><?php echo
$folder;?></option></select></td></tr>
</table><br />
<strong>Daftar Artikel:</strong><br /><textarea id="files" name="files" cols="133"
rows="25"><?php echo $files; ?></textarea>
<?php } ?>
<br /><input type="submit" id="submit" name="submit" value="POST">
</form>
<?php
if(!empty($post_id)){
if(is_array($post_id)){
var_dump($post_id);
} else {
echo 'Posted successfuly. ID Post: ' . $post_id . '<br />';
}
}
?>
</div>

<?php
if(!empty($file) && !empty($folder) && (!empty($url) && !empty(user) && !empty(password))){
echo '<script>setInterval(function () {document.getElementById("submit").click();},
1000);</script>';
}?>

</body></html>

Simpanlah baris kode tersebut dengan nama post.php. Jika sudah, silahkan akses script
tersebut. (Kalau saya http://grabit.dev/post.php)

33

Disana akan muncul daftar folder tempat kita menyimpan data, kita bisa memilih folder yang
mana yang akan kita gunakan. Lalu klik tombol POST.

Sampai disini kita belum lakukan proses posting, karena baru menentukan foldernya saja.
Sehingga kita akan diminta untuk memasukan URL target web berbasis WordPress yang kita
inginkan, User Name dan Password-nya.

Daftar artikel yang muncul adalah nama-nama file yang tersimpan dalam folder yang terpilih.

Silahkan isi semua detail yang masih kosong (URL, User Name dan Password) dari web yang
akan menjadi target posting, lalu klik tombol POST.

Setelah Anda klik tombol posting sekali, maka proses selanjutkan akan berjalan secara
otomatis, karena saya akan membantu klik tombolnya darijarak jauh, hihihi.... Proses ini akan
berjalan sampai daftar artikel habis.

34

35

BAB 4
SEKILAS INFO
PLUGIN SCRAPES
Pada saat menyusun materi ebook ini, kemarin saya melihat sebuah produk berupa plugin.
Secara fungsi scrapping sama dengan Full Text RSS yang telah kita bahas, tapi karena
berbentuk plugin jadi lebih mudah pemakaiannya, proses pembuatan patterns, scraping dan
postingnya lebih simple.

Pada websitenya juga terdapat video cara scrapping beberapa website besar, hal ini tentu
sangat memudahkan dalam mempelajarinya.

Info detailnya bisa dibaca di http://yoyonsugiono.com/crawlerautopost

36

EZKEY
YWORD

a jamannya la
Sudah ga agi ngeblog pusing
p denga
an keyword, cukup denggan Ezkeywo
ord, keyword--
keyword easy makannan para marketer handall bisa kamu dapatkan.
d

Tools rise
et untuk menncari keyworrd ini dikemb
bangkan oleh
h mereka ya
ang memang sangat
berpengaalaman di bid
dangnya, kom
munitas Kam mpung Bloggeer.

Jika diaantara rekann-rekan adaa yang terttarik ingin membeli tools tersebbut, silahkaan
menggun nakan kode kupon "DIS SKON" untuuk mempero oleh potongaan harga saaat melakukaan
checkoutt di halaman penjualannyya http://ezk
keyword.com

3
37
BAB 5
PENUTUP
Demikian penjelasan tentang WebScrappingdenganAPI+PembuatanAplikasiXMLRPC,semoga
dapatdipahamidanbermanfaat.

Saya berharap Anda bisa mengimplementasikan dan mengembangkan isi materi pada ebook ini
sesuaidengankebutuhanmasingmasing.

Terimakasih,

Yoyon Sugiono
http://yoyonsugiono.com

38

Anda mungkin juga menyukai