Advertisement
  1. Code
  2. PHP

Bagaimana Mengeruk Halaman Web Untuk Metadata

Scroll to top
Read Time: 3 min
This post is part of a series called How to Scrape Web Pages for Metadata.
Using the New York Times API to Scrape Metadata

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Pendahuluan

Baru-baru ini saya mulai membangun sebuah situs komunitas pada platform Yii yang saya tulis dalam Pemrograman Dengan Yii2: Membangun Komunitas Dengan Komentar, Sharing dan Voting (Envato Tuts+). Saya ingin membuatnya mudah untuk menambahkan tautan terkait pada konten di situs ini. Sementara mudah bagi orang untuk menempel URL ke dalam form, itu memakan waktu untuk menyediakan juga judul dan sumber informasi.

Di dalam tutorial hari ini, saya akan menunjukkan bagaimana memanfaatkan PHP untuk mengeruk metadata umum dari halaman web untuk membuatnya lebih mudah bagi pengguna untuk berpartisipasi dan membangun layanan yang lebih menarik.

Ingat, saya berpartisipasi dalam komentar di bawah, jadi sampaikan apa yang kamu pikirkan! Kamu juga bisa menghubungi saya di Twitter @lookahead_io.

Memulai

Pertama-tama, saya membuat sebuah form untuk menambahkan tautan dengan menempelkan URL. Saya juga membuat sebuah tombol Lookup untuk menggunakan AJAX untuk meminta halaman web dikeruk informasi metadatanya.

Web Scraping - Create Link form with Lookup buttonWeb Scraping - Create Link form with Lookup buttonWeb Scraping - Create Link form with Lookup button

Menekan Lookup memanggil fungsi Link::grab() via ajax:

1
$(document).on("click", '[id=lookup]', function(event) {
2
  $.ajax({
3
     url: $('#url_prefix').val()+'/link/grab',
4
     data: {url:   $('#url').val()},
5
     success: function(data) {
6
       $('#title').val(data);
7
       return true;
8
     }
9
  });
10
});

Mengeruk Halaman Web

Kode Link::grab() memanggil fetch_og(). Ini meniru sebuah crawler untuk menangkap halaman dan mendapatkan metadata dengan DOMXPath:

1
public static function fetch_og($url)
2
    {
3
        $options  = array('http' => array('user_agent' => 'facebookexternalhit/1.1'));
4
        $context  = stream_context_create($options);
5
        $data = file_get_contents($url,false,$context);
6
        $dom = new \DomDocument;
7
        @$dom->loadHTML($data);
8
        $xpath = new \DOMXPath($dom);
9
        # query metatags with og prefix

10
        $metas = $xpath->query('//*/meta[starts-with(@property, \'og:\')]');
11
        $og = array();
12
        foreach($metas as $meta){
13
            # get property name without og: prefix

14
            $property = str_replace('og:', '', $meta->getAttribute('property'));
15
            $content = $meta->getAttribute('content');
16
            $og[$property] = $content;
17
        }
18
        return $og;
19
    }

Untuk skenario saya, saya mengganti tags og: di atas, namun kode di bawah mencari berbagai jenis tags:

1
$tags = Link::fetch_og($url);
2
      if (isset($tags['title'])) {
3
        $title = $tags['title'];
4
      } else if (isset($tags['metaProperties']['og:title']['value'])) {
5
        $title=$tags['metaProperties']['og:title']['value'];
6
      } else {
7
        $title = 'n/a';
8
      }
9
      return $title;
10
    }

Kamu dapat juga mengeruk tags lainnya seperti keywords, description, dll. jQuery kemudian menambahkan hasil ke form bagi pengguna untuk di-submit:

Web Scraping - Create Link with Resulting Title Filled InWeb Scraping - Create Link with Resulting Title Filled InWeb Scraping - Create Link with Resulting Title Filled In

Melangkah Lebih Jauh

Saya juga mempunyai tabel sumber yang akan saya kembangkan nantinya. Namun pada dasarnya, tiap kali URL baru ditambahkan, kita mengurainya untuk domain website dasar dan menempatkannya di dalam tabel Source:

1
$model->source_id = Source::add($model->url);
2
...
3
public static function add($url='',$name='') {
4
      $source_url = parse_url($url);
5
      $url = $source_url['host'];
6
      $url = trim($url,' \\');
7
      $s = Source::find()
8
        ->where(['url'=>$url])
9
        ->one();
10
      if (is_null($s)) {
11
        $s=new Source;
12
        $s->url = $url;
13
        $s->name = $name;
14
        $s->status = Source::STATUS_ACTIVE;
15
        $s->save();
16
      } else {
17
        if ($s->name=='') {
18
          $s->name = $name;
19
          $s->update();
20
        }
21
      }
22
      return $s->id;
23
    }

Untuk saat ini, saya mengupdate secara manual nama-nama sumber sehingga mereka tampak rapi bagi pengguna, misalnya ABC News, BoingBoing, dan Vice:

Web Scraping - Item page with completed links and clean sourcesWeb Scraping - Item page with completed links and clean sourcesWeb Scraping - Item page with completed links and clean sources

Semoga di dalam episode mendatang, saya akan mengulas bagaimana menggunakan API yang tersedia secara gratis untuk mencari nama situs. Aneh bagi saya bahwa tidak ada metatag umum untuk ini; seandainya internet sempurna.

Situs-Situs Paywall

Beberapa situs seperti The New York Times tidak mengijinkanmu mengeruk metadata karena paywall mereka. Namun mereka memiliki API. Itu tidak mudah untuk dipelajari karena dokumentasi yang membingungkan, namun pengembang mereka cepat membantu dalam GitHub. Saya juga berharap untuk menuliskan tentang menggunakan metadata lookup untuk judul New York Times dalam episode mendatang.

Penutup

Saya harap kamu merasa terbantu dengan panduan scraping ini dan menggunakannya dalam projectmu. Jika kamu ingin melihatnya beraksi, kamu dapat mencoba beberapa web scraping pada situs saya, Active Together.

Silahkan bagikan pendapat dan feedback apapun di dalam komentar. Kamu juga dapat menghubungi saya di Twitter @lookahead_io secara langsung. Dan pastikan untuk memeriksa halaman instruktur saya dan seri saya lainnya, Membangun Startup Dengan PHP dan Pemrograman Dengan Yii2.

Tautan Terkait

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.