如何搭建网络爬虫:从零构建 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 框架,它内置了队列管理、并发控制、去重、缓存等功能,比自己从零写要稳定得多。

相关教程

chcrazy

Share