🕸️ 什么是网络爬虫?
一段能自动浏览网页、提取信息的程序
🤖
核心定义
网络爬虫(Web Crawler / Spider)是一种自动化程序,它能够模拟浏览器的行为,按照一定的规则, 自动地浏览互联网并从网页中抓取、提取、存储数据。 就像蜘蛛在蜘蛛网上爬行,从一个节点跳到下一个节点。
🕷️ 蜘蛛网比喻
网站A网站B网站C网站D网站E网站F网站G🕷️
爬虫(蜘蛛)从中心出发,沿链接跳转到各个网站节点
⚡ 爬虫 vs 人工浏览
| 维度 | 人工浏览 | 爬虫程序 |
|---|---|---|
| 速度 | 1页/分钟 | 1000页/秒 |
| 工作时间 | 8小时/天 | 24小时/天 |
| 准确性 | 容易出错 | 精确无误 |
| 规模 | 数十个网页 | 数十亿网页 |
| 成本 | 高(人力) | 低(服务器) |
🧩 爬虫的核心组成
📡
下载器 Downloader
发送 HTTP 请求,获取网页原始内容
🔍
解析器 Parser
从 HTML/JSON 中提取目标数据
📋
URL 调度器 Scheduler
管理待爬取 URL 队列,去重调度
💾
存储器 Storage
将数据存入 CSV / JSON / 数据库
Chapter 02
⚙️ 爬虫工作原理
从发送请求到存储数据,五步完成一次完整爬取
📋URL 队列种子URL集合去重 · 调度取出URL📡HTTP 请求GET / POSTheaders · cookies响应内容🔍HTML 解析CSS选择器XPath · regex提取数据💾数据存储CSV / JSONMySQL / MongoDB新URL入队🔄发现新 URL提取页面内链接加入队列继续♻️ 循环爬取,直到队列为空或达到目标STEP 1STEP 2STEP 3STEP 4STEP 5
📡 HTTP 请求详解
💻爬虫程序本地客户端Python 代码🌐目标网站Web Server返回HTMLHTTP 请求GET / POSTHTTP 响应200 OK + HTML请求头 Headers:User-Agent / Cookie响应码:200✅ 404❌ 403🚫 503⚠️域名解析 DNS → IP → TCP 握手 → 传输
🔍 HTML 解析结构
<html><head><body><div><h1><p><span><a href>🎯 提取目标用 CSS 选择器 / XPath 定位目标节点
Chapter 03
🚀 爬虫的应用场景
现实中爬虫无处不在,这些场景你一定不陌生
🔎
搜索引擎
Google、百度等搜索引擎用爬虫(称为 Spider/Bot)持续抓取全网页面,建立搜索索引。 没有爬虫,就没有搜索引擎。
Googlebot百度蜘蛛全网索引
💹
价格监控
电商平台监控竞品价格,比价网站实时抓取商品信息, 帮助用户在最优价格时购买商品。
比价网站竞品分析价格预警
📰
新闻聚合
各大资讯 App 通过爬虫抓取全网新闻, 经过分类、推荐算法,推送给用户感兴趣的内容。
今日头条内容聚合RSS
🔬
学术研究
研究人员爬取社交媒体数据、学术论文、政府公开数据, 用于舆情分析、自然语言处理训练等。
NLP语料舆情分析大数据
📊
数据分析
抓取股票行情、房产信息、招聘数据, 结合 Pandas/Matplotlib 进行深度分析和可视化。
股票数据房价分析求职趋势
🤖
AI 训练数据
大型语言模型的训练数据(如 Common Crawl)来源于 对互联网的大规模爬取,是 AI 发展的基础。
语料库图像数据集LLM训练
📊 爬虫技术应用领域分布
搜索引擎100%AI 训练数据86%数据分析76%价格监控65%新闻聚合55%学术研究41%
Chapter 04
💻 爬虫使用方法
从简单到高级,循序渐进掌握 Python 爬虫实战
1
基础爬虫 --- requests + BeautifulSoup
适合静态网页,入门首选,5分钟上手
01_basic_crawler.py
# 安装:pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
# ① 设置请求头(模拟浏览器)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0)',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
# ② 发送 GET 请求
url = 'https://example.com/news'
resp = requests.get(url, headers=headers, timeout=10)
resp.encoding = 'utf-8'
# ③ 解析 HTML
soup = BeautifulSoup(resp.text, 'html.parser')
# ④ CSS选择器提取数据
titles = soup.select('h2.news-title a')
for t in titles:
print(t.get_text(strip=True))
print(t.get('href'))
# ⑤ 提取表格数据
table = soup.find('table', {'class': 'data-table'})
rows = table.find_all('tr')
for row in rows[1:]:
cols = [td.get_text() for td in row.find_all('td')]
print(cols)
🎯 常用 BS4 选择方法
| 方法 | 说明 |
|---|---|
find(tag) |
查找第一个匹配标签 |
find_all(tag) |
查找所有匹配标签 |
select('css') |
CSS选择器,返回列表 |
.text / .get_text() |
获取文本内容 |
.get('href') |
获取属性值 |
.parent / .children |
父/子节点导航 |
💡 适用场景内容在 HTML 源码中直接存在的静态页面,如新闻、博客、百科等。
2
数据保存 --- CSV / JSON / 数据库
将抓取的数据结构化存储,便于后续分析
02_save_data.py
import csv, json
import pandas as pd
import sqlite3
# ─── 保存到 CSV ───
data = [
{'标题': '新闻1', '链接': 'https://...', '时间': '2026-06'},
{'标题': '新闻2', '链接': 'https://...', '时间': '2026-06'},
]
df = pd.DataFrame(data)
df.to_csv('news.csv', encoding='utf-8-sig', index=False)
# ─── 保存到 JSON ───
with open('news.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# ─── 保存到 SQLite ───
conn = sqlite3.connect('spider.db')
df.to_sql('news', conn, if_exists='append', index=False)
conn.close()
💾 存储方式对比
📄
CSV:简单通用,Excel 可直接打开,适合小数据
🔧
JSON:保留嵌套结构,API 友好,前端常用
🗄️
SQLite:轻量数据库,无需服务器,适合中小项目
🐘
MySQL/PostgreSQL:大规模生产环境,支持并发查询
🍃
MongoDB:文档型,灵活存储不固定结构的爬取数据
3
动态页面爬虫 --- Playwright(处理 JavaScript 渲染)
适合 Vue/React 构建的 SPA 应用、需要点击交互的页面
03_playwright_spider.py
# 安装:pip install playwright
# playwright install chromium
from playwright.sync_api import sync_playwright
import json
with sync_playwright() as p:
# 启动浏览器(headless=True 无界面模式)
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# 访问目标页面
page.goto('https://example.com/list')
# 等待内容加载完毕
page.wait_for_selector('.item-list')
# 模拟滚动加载更多
page.evaluate('window.scrollTo(0,9999)')
page.wait_for_timeout(2000)
# 点击下一页按钮
page.click('button.next-page')
# 提取数据
items = page.query_selector_all('.item-card')
for item in items:
title = item.query_selector('h3').inner_text()
price = item.query_selector('.price').inner_text()
print(title, price)
browser.close()
🎭 Playwright 核心操作
| 操作 | 代码 |
|---|---|
| 访问页面 | page.goto(url) |
| 点击元素 | page.click(selector) |
| 填写表单 | page.fill('#input', text) |
| 截图 | page.screenshot(path='x.png') |
| 等待元素 | page.wait_for_selector(css) |
| 执行JS | page.evaluate('...') |
⚡ 静态 vs 动态页面判断右键查看源代码,若数据不在源码中,说明是 JS 动态渲染,需用 Playwright/Selenium。
4
工业级框架 --- Scrapy 分布式爬虫
异步高并发,适合大规模抓取,生产环境首选
04_scrapy_spider.py
# scrapy startproject myspider
# scrapy genspider news_spider example.com
import scrapy
class NewsSpider(scrapy.Spider):
name = 'news_spider'
start_urls = ['https://news.example.com']
# 自定义请求头
custom_settings = {
'DOWNLOAD_DELAY': 1, # 限速1秒
'CONCURRENT_REQUESTS': 8, # 并发数
'ROBOTSTXT_OBEY': True, # 遵守robots.txt
}
def parse(self, response):
# 提取当前页数据
for article in response.css('article.news-item'):
yield {
'title': article.css('h2::text').get(),
'url': article.css('a::attr(href)').get(),
'date': article.css('.date::text').get(),
}
# 自动跟进下一页(递归爬取)
next_page = response.css('a.next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
🏗️ Scrapy 架构图
⚙️ Engine🕷️ Spider📋 Scheduler📡 Downloader💾 Pipeline📦 Item
Chapter 05
📦 主流爬虫库对比
按需选择最合适的工具,不同场景各有最优解
| 库名称 | 类型 | 学习难度 | 是否支持JS | 并发性能 | 适用场景 |
|---|---|---|---|---|---|
| requests | HTTP客户端 | ⭐ | ❌ 不支持 | 低 | 静态页面、API接口 |
| BeautifulSoup | HTML解析 | ⭐ | --- | --- | 配合requests解析HTML |
| lxml | 高速解析 | ⭐⭐ | ❌ 不支持 | 高(C语言底层) | 大量HTML/XML解析 |
| Scrapy | 爬虫框架 | ⭐⭐⭐ | ⚠️ 需插件 | 极高(异步) | 大规模抓取、生产环境 |
| Playwright | 浏览器自动化 | ⭐⭐ | ✅ 完整支持 | 中 | JS渲染、登录交互 |
| Selenium | 浏览器自动化 | ⭐⭐ | ✅ 完整支持 | 低(较慢) | Web测试、旧版兼容 |
| httpx | 异步HTTP | ⭐⭐ | ❌ 不支持 | 高(async/await) | 异步爬虫、API爬取 |
🌳 爬虫工具选择决策树
需要爬取数据?页面是 JS 动态渲染的?(右键源码中是否有数据)静态 / No动态 / Yes需要大规模抓取?(万级以上页面)小规模requests+ BeautifulSoup大规模Scrapy异步框架 高性能需要复杂交互操作?(登录/点击/填表)Playwright支持JS · 交互操作仅JS渲染httpx + async或拦截 API 接口
Chapter 06
🛡️ 反爬机制与应对策略
了解网站的防护手段,写出更稳健的爬虫
🚫 常见反爬手段
🔒
User-Agent 检测:识别非浏览器请求头直接拒绝
⏱️
访问频率限制:短时间大量请求触发 IP 封禁
🧩
验证码(CAPTCHA):图形验证码、滑块验证
🍪
Cookie / Session 验证:需要登录状态才能访问
🔄
动态 Token:每次请求参数加密或随机变化
🌐
IP 封禁:检测同一 IP 异常流量后封禁
🕵️
指纹识别:浏览器指纹、TLS 指纹检测
05_anti_anti_spider.py
import time, random
import requests
# ① 随机 User-Agent
ua_list = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X)...',
]
headers = {'User-Agent': random.choice(ua_list)}
# ② 随机延时(模拟人工浏览)
time.sleep(random.uniform(1.5, 3.5))
# ③ 使用 Session 保持 Cookie
session = requests.Session()
session.get('https://example.com/login')
# ④ 设置 Referer 等请求头
headers['Referer'] = 'https://example.com/list'
headers['Accept'] = 'text/html,application/xhtml+xml'
# ⑤ 代理 IP 轮换(需代理池服务)
proxies = {'http': 'http://proxy_ip:port'}
resp = session.get(url, proxies=proxies)
✅ 应对策略总结
模拟浏览器行为
设置真实 User-Agent、Referer、Accept,使用随机延时 1~3 秒
维护 Cookie
用 requests.Session() 自动携带 Cookie,或先登录获取凭证
IP 轮换 / 代理池
构建代理 IP 池,每隔若干请求切换 IP,避免封禁
使用无头浏览器
Playwright 自带真实浏览器环境,绕过大多数 JS 检测
请求频率控制
Scrapy 设置 DOWNLOAD_DELAY,避免服务器过载触发封禁
⚠️ 重要提示反爬应对措施仅供技术学习,实际使用时必须遵守网站的 robots.txt 和服务条款,不得对服务器造成过大压力。
Chapter 07
⚖️ 爬虫合规与法律须知
技术有边界,合法使用爬虫是每个开发者的基本素养
✅ 合规做法
✅
遵守网站 robots.txt 中的爬虫规则
✅
只爬取公开可访问的数据,不破解登录
✅
控制请求频率,不对服务器造成过大负担
✅
尊重版权,不大规模复制付费内容
✅
不收集、存储、传播个人隐私信息
✅
用于合法的研究、学习、商业数据分析
06_check_robots.py
from urllib.robotparser import RobotFileParser
# 检查 robots.txt 是否允许爬取
rp = RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
# 检查某个路径是否被允许
can_fetch = rp.can_fetch('*', 'https://example.com/data')
print('允许爬取:', can_fetch) # True / False
🚨 违规红线
❌
绕过登录验证,未授权访问需要权限的数据
❌
大规模爬取导致服务器瘫痪(DDoS)
❌
爬取并倒卖用户隐私数据(姓名/手机/地址)
❌
抓取付费内容进行商业再分发
❌
用于恶意竞争、价格欺诈等不正当目的
❌
违反《网络安全法 》《数据安全法》等法规
⚖️ 法律风险提示我国《计算机信息网络国际联网安全保护管理办法》《数据安全法》对非法获取数据有明确处罚规定,情节严重者可追究刑事责任。开发爬虫前,务必确认合法性。
robots.txt 示例
# 所有爬虫都不允许访问 /admin/
User-agent: *
Disallow: /admin/
Disallow: /private/
# Google 允许访问所有页面
User-agent: Googlebot
Allow: /
# 爬取频率限制
Crawl-delay: 1
💡 黄金原则:己所不欲,勿施于人设身处地想想:如果你是网站运营者,你能接受什么样的爬取行为? 合理的爬取速度 + 公开数据 + 合法用途 = 值得鼓励的技术实践。
Chapter 08
🗺️ 爬虫学习路线
从零到爬虫工程师的系统成长路径
1
Python 基础 + HTTP 协议(1-2周)
掌握字符串操作、列表字典、函数、文件读写;理解 HTTP 请求/响应报文结构,状态码含义(200/301/403/404/503)。
2
requests + BeautifulSoup 入门(1-2周)
抓取静态新闻、产品列表页;学习 CSS 选择器和 XPath;完成:豆瓣电影 Top250 爬取并保存 CSV。
3
动态页面 + API 接口分析(2周)
用 Chrome DevTools Network 面板抓包分析真实 API;学会解析 JSON 响应;处理分页、Ajax 请求;使用 Playwright 模拟操作。
4
Scrapy 框架 + 数据管道(2-3周)
搭建完整 Scrapy 项目;自定义 Spider / Item / Pipeline;接入 MySQL 或 MongoDB;实现断点续爬。
5
实战项目 + 数据分析(持续)
完整项目:招聘数据分析(拉勾/Boss直聘)、房价地图、舆情监控;结合 Pandas/Matplotlib 制作数据可视化报告;上传 GitHub 形成作品集。