55 - 爬虫开发实战教程

适用人群:有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网络爬虫权威指南
返回首页