适用人群:有Python基础,想学习数据采集
难度:中等
预计学习时间:20-30小时
为什么学爬虫?
| 场景 | 说明 |
|---|
| 数据采集 | 从网站获取公开数据进行分析 |
| 价格监控 | 电商商品价格追踪 |
| 舆情分析 | 社交媒体内容监控 |
| 学术研究 | 论文、数据集采集 |
| 自动化测试 | 网页功能自动化验证 |
学习路线
第1阶段:基础爬虫(1周)
├── HTTP协议基础
├── requests库发送请求
├── BeautifulSoup解析HTML
├── CSS选择器/XPath
└── 简单数据提取
第2阶段:进阶爬虫(2周)
├── 动态页面(Selenium/Playwright)
├── 反爬策略应对
│ ├── 请求头伪装
│ ├── Cookie/Session
│ ├── IP代理池
│ └── 验证码识别
├── 数据存储(CSV/MySQL/MongoDB)
└── 异步爬虫(aiohttp)
第3阶段:框架爬虫(2周)
├── Scrapy框架
│ ├── Spider
│ ├── Item/ItemLoader
│ ├── Pipeline
│ └── 中间件
├── 分布式爬虫(Scrapy-Redis)
└── 爬虫调度与监控
第4阶段:实战项目(1周)
├── 电商商品数据采集
├── 新闻网站全站采集
├── 社交媒体数据采集
└── 数据清洗与分析
核心代码示例
# 1. requests + BeautifulSoup
import requests
from bs4 import BeautifulSoup
url = 'https://example.com/articles'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取所有文章标题
articles = soup.select('.article-item')
for article in articles:
title = article.select_one('h2').text.strip()
link = article.select_one('a')['href']
print(f"{title}: {link}")
# 2. 处理分页
for page in range(1, 11):
url = f'https://example.com/articles?page={page}'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# ... 提取数据
time.sleep(1) # 礼貌延迟
# 3. 动态页面(Selenium)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://example.com')
# 等待元素加载
wait = WebDriverWait(driver, 10)
element = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '.content'))
)
# 点击按钮
driver.find_element(By.CSS_SELECTOR, '.load-more').click()
# 获取页面内容
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 4. 数据存储
import csv
import sqlite3
# CSV存储
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'link', 'date'])
writer.writeheader()
writer.writerows(data_list)
# SQLite存储
conn = sqlite3.connect('data.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS articles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
link TEXT,
date TEXT
)
''')
for item in data_list:
cursor.execute(
'INSERT INTO articles (title, link, date) VALUES (?, ?, ?)',
(item['title'], item['link'], item['date'])
)
conn.commit()
conn.close()
# 5. Scrapy Spider示例
import scrapy
class ArticleSpider(scrapy.Spider):
name = 'articles'
start_urls = ['https://example.com/articles']
def parse(self, response):
for article in response.css('.article-item'):
yield {
'title': article.css('h2::text').get(),
'link': article.css('a::attr(href)').get(),
'date': article.css('.date::text').get()
}
# 翻页
next_page = response.css('.next-page::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
反爬策略速查
| 反爬手段 | 应对方案 |
|---|
| User-Agent检测 | 伪装浏览器UA |
| IP封禁 | 使用代理IP池 |
| 频率限制 | 添加随机延迟 |
| Cookie验证 | 使用Session保持Cookie |
| 验证码 | 打码平台/AI识别 |
| JavaScript渲染 | Selenium/Playwright |
| API加密 | 逆向分析/抓包分析 |
法律与道德
爬虫使用原则:
1. 遵守robots.txt规则
2. 不要过于频繁请求(加延迟)
3. 不要采集个人隐私数据
4. 不要用于商业牟利(未经授权)
5. 尊重网站的知识产权
6. 只采集公开可访问的数据
推荐资源
| 资源 | 说明 |
|---|
| Scrapy官方文档 | 框架爬虫入门 |
| Selenium文档 | 浏览器自动化 |
| Playwright文档 | 现代浏览器自动化 |
| 爬虫实战书 | Python网络爬虫权威指南 |