What?
簡而言之就是用程式抓取網頁資料
廣義的爬蟲是抓單一網頁就算
狹義的是指從一個網頁出發,再擴散出去
像蜘蛛爬過整張網一樣才會有這個稱呼
Why?
某些資料有 Open Data 可以使用
但很多沒有
就只能去它的網頁一個一個找
如果是手動操作會像這樣
- 滑鼠點擊網頁
- 滑鼠捲軸尋找需要的資料
- 複製資料
- 存在我們要的地方
這樣做曠日廢時
所以就需要程式出動
也就是自動化處理
Where?
爬蟲有哪些應用呢?
其實搜尋引擎的本質就是爬蟲
Google 會先透過爬蟲抓取網頁內容,建立索引
使用者才能用這些索引查到網頁
各種比價網也是用爬蟲整理出資訊
Skyscanner 是爬各航空公司的機票
Booking.com 爬各飯店的房間
Google News 爬各家新聞網的新聞
How?
先理解基本原理
- 讀取網頁資料
- 解析網頁資料
- 儲存資料
以 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 登入
破解驗證等
就是互相理解後的鬥智了…