如何搭建网络爬虫:从零构建 Web Crawler 完整教程
Web Crawler(网络爬虫)和 Web Scraper 不同——爬虫是系统性地遍历网站的所有页面,而不只是提取特定数据。本文教你从零搭建一个功能完整的网络爬虫。
爬虫 vs 采集器
简单区分:爬虫(Crawler)负责”找”——发现和遍历链接;采集器(Scraper)负责”取”——从页面提取特定数据。现实项目中两者通常是组合使用的。
爬虫核心组件
- URL 队列:待访问的 URL 列表(FIFO 或优先级队列)
- DNS 解析:将域名转为 IP 地址
- 页面下载器:发送 HTTP 请求获取页面内容
- HTML 解析器:提取页面中的链接和数据
- 重复检测:防止重复爬取同一个 URL
- 存储后端:保存爬取结果
Python 实现示例
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
from collections import deque
class SimpleCrawler:
def __init__(self, start_url, max_pages=100):
self.queue = deque([start_url])
self.visited = set()
self.max_pages = max_pages
self.domain = urlparse(start_url).netloc
def crawl(self):
while self.queue and len(self.visited) < self.max_pages:
url = self.queue.popleft()
if url in self.visited:
continue
self.visited.add(url)
try:
html = requests.get(url, timeout=10).text
soup = BeautifulSoup(html, "lxml")
for link in soup.find_all("a", href=True):
full_url = urljoin(url, link["href"])
if urlparse(full_url).netloc == self.domain:
self.queue.append(full_url)
except Exception as e:
print(f"Error: {url} - {e}")
进阶:Scrapy 爬虫
生产环境建议用 Scrapy 框架,它内置了队列管理、并发控制、去重、缓存等功能,比自己从零写要稳定得多。