網絡爬蟲(Spider/Bot)是搜索引擎、數據採集的核心組件。本文拆解爬蟲核心流程,展示基於 Socket 的 HTTP 抓取原理,提供 Ruby 參考實現,並匯總主流開源爬蟲項目。

難點在於:JS 渲染(Ajax/SPA)、反爬策略、大規模去重存儲、分佈式調度。
telnet somesite.com 80
GET /index.html HTTP/1.0
(按兩次回車)
本質是 TCP Socket + HTTP 協議。現代爬蟲需處理 HTTPS、Cookie、Redirect、Gzip、Chunked Encoding、JS 執行等。
require 'rubygems'
require 'mechanize'
class Crawler < WWW::Mechanize
attr_accessor :callback
INDEX, DOWNLOAD, PASS = 0, 1, 2
def initialize
super
@visited = []
self.user_agent_alias = 'Windows IE 6'
end
def start(link)
return if link.nil? || @visited.include?(link)
@visited << link
action = @callback.call(link)
perform_index(link) if @first
@first = false
case action
when INDEX then perform_index(link)
when DOWNLOAD then get(link).save_as(File.basename(link))
when PASS then puts "passing on #{link}"
end
end
def perform_index(link)
get(link)
return unless page.class == WWW::Mechanize::Page
(page.links.map(&:href) - @visited).each { |l| start(l) }
end
end
# 使用示例
crawler = Crawler.new
crawler.callback = lambda do |link|
case link
when /\.(zip|rar|gz|pdf|doc)$/ then crawler.remember(link); Crawler::PASS
when /\.(jpg|jpeg)$/ then Crawler::DOWNLOAD
else Crawler::INDEX
end
end
crawler.start("https://somesite.com")
| 項目 | 語言 | 特點 |
|---|---|---|
| arachnode.net | C# | .NET 生態,SQL Server + Lucene |
| DataparkSearch | C | 爬蟲+搜索引擎一體 |
| GNU Wget | C | 命令行鏡像工具,GPL |
| Heritrix | Java | Internet Archive 歸檔級,企業級 |
| HTTrack | C | 網站鏡像離線瀏覽 |
| ICDL Crawler | C++ | 跨平台,基於規則抓取 |
手寫爬蟲易上手,工程化難。建議:小項目用成熟庫(Scrapy, Puppeteer, Colly);大規模採用分佈式架構(Scrapy-Redis, Apache Nutch),關注合規與反反爬。