網路爬蟲(web crawler)

What?

簡而言之就是用程式抓取網頁資料
廣義的爬蟲是抓單一網頁就算
狹義的是指從一個網頁出發,再擴散出去
像蜘蛛爬過整張網一樣才會有這個稱呼

Why?

某些資料有 Open Data 可以使用
但很多沒有
就只能去它的網頁一個一個找
如果是手動操作會像這樣

  1. 滑鼠點擊網頁
  2. 滑鼠捲軸尋找需要的資料
  3. 複製資料
  4. 存在我們要的地方

這樣做曠日廢時
所以就需要程式出動
也就是自動化處理

Where?

爬蟲有哪些應用呢?
其實搜尋引擎的本質就是爬蟲
Google 會先透過爬蟲抓取網頁內容,建立索引
使用者才能用這些索引查到網頁

各種比價網也是用爬蟲整理出資訊
Skyscanner 是爬各航空公司的機票
Booking.com 爬各飯店的房間
Google News 爬各家新聞網的新聞

How?

先理解基本原理

  1. 讀取網頁資料
  2. 解析網頁資料
  3. 儲存資料

以 Java 為例
這段程式會抓取該網址的 Title

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Aoo {

    public static void main(String[] args) {
        String html = getHtml("https://www.google.com/");
        Optional<String> title = findTitle(html);
        System.out.println(title.orElse("title not found")); //Google
    }

    private static String getHtml(String url) {
        try(HttpClient client = HttpClient.newHttpClient()) {
            return client.send(HttpRequest.newBuilder(URI.create(url)).build(),
                    HttpResponse.BodyHandlers.ofString()).body();
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    private static Optional<String> findTitle(String html) {
        Pattern titlePattern = Pattern.compile("<title>(.*?)</title>",
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher matcher = titlePattern.matcher(html);

        if (matcher.find())
            return Optional.of(matcher.group(1));
        return Optional.empty();
    }
}

當然取得資料後的處理、應用、儲存等就要看實際需求了

防止爬蟲

對一個網站爬蟲就是使用該網站的資源
如果過度爬蟲會造成網站負擔
而且某些網站的資料是屬於他們的智慧財產
直接端去用就相當於偷竊了

所謂的「搬運工」就是如此
將別人網站的文章貼到自己的網站
將別人的影片轉發到不同平台
用他人的資源來賺取流量,十分不可取

因應對策有

  • 防止連線:阻擋機器人
    • 登入機制:若是要公開的資料就沒辦法
    • CAPTCHA
    • 檢查 User-Agent
    • 限制請求頻率
    • 封鎖 IP:用 Honeypot 或 Log 監測
    • 使用 CDN 服務
  • 防止解析:增加抓取資料的難度
    • 網站根目錄設置 robots.txt:只能防君子
      User-agent: *
      Disallow: /private/
      Disallow: /admin/
      
    • 用 JavaScript 動態加載內容

    • 混淆或加密網站內容

當然上有政策下有對策
用代理伺服器隱藏 IP
用 Cookies 登入
破解驗證等
就是互相理解後的鬥智了…

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *