Python 爬虫技术实战指南
引言
Python 凭借其简洁的语法和强大的生态库,成为网络爬虫开发的首选语言。爬虫技术旨在自动化获取互联网公开数据,广泛应用于数据分析、市场监控、学术研究等领域。本教程将引导初学者从零开始,系统掌握从基础请求发送、页面解析、反爬应对到分布式采集的全流程技术。
需要注意的是,爬虫开发必须遵守目标网站的 robots.txt 协议及相关法律法规,尊重数据版权,严禁用于非法用途或侵犯隐私。
一、基础环境与 HTTP 请求
1.1 环境准备
安装 Python 3.x 版本(推荐 3.8+),建议使用虚拟环境管理依赖。
python -m venv crawler_env
source crawler_env/bin/activate # Windows: crawler_env\Scripts\activate
pip install requests lxml beautifulsoup4 pymongo redis
1.2 发送 HTTP 请求
使用 requests 库模拟浏览器行为是爬虫的基础。需理解 HTTP 方法(GET/POST)、状态码及编码处理。
import requests
from requests.exceptions import RequestException
def fetch_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except RequestException as e:
print(f"Request failed: {e}")
return None
url = 'https://example.com'
text = fetch_page(url)
if text:
print(text[:500])
Session 管理:对于需要登录或多步操作的网站,使用 Session 对象保持 Cookie 状态。
session = requests.Session()
session.headers.update(headers)
resp = session.post('https://example.com/login', data={'user': 'admin'})
二、页面解析与数据提取
2.1 XPath 解析
XPath 是定位 HTML 元素的强大工具,适合结构清晰的静态页面。
from lxml import etree
html_content = '''<div class="news">
<h1>标题</h1>
<p class="author">作者</p>
</div>'''
tree = etree.HTML(html_content)
# 提取标题
title = tree.xpath('//div[@class="news"]/h1/text()')
print(title)
2.2 CSS 选择器与 BeautifulSoup
BeautifulSoup 容错性强,适合处理不规范 HTML。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'lxml')
items = soup.find_all('div', class_='news')
for item in items:
print(item.get_text())
2.3 正则表达式
适用于提取特定格式文本,如邮箱、电话等。
import re
pattern = r'\d{3}-\d{4}'
match = re.search(pattern, text)
if match:
print(match.group())
三、反爬策略应对技巧
3.1 请求头伪装
设置 User-Agent、Referer、Cookie 等头部信息,避免被识别为脚本。
headers = {
'User-Agent': 'Mozilla/5.0...',
'Referer': 'https://www.google.com/'
}
3.2 代理 IP 池
频繁访问会导致 IP 被封禁,需构建代理池并轮换使用。
proxies_list = ['http://ip1:port', 'http://ip2:port']
proxy = random.choice(proxies_list)
response = requests.get(url, proxies={'http': proxy}, timeout=5)
3.3 验证码与加密
- 验证码:集成 OCR 库(如 pytesseract)或调用打码平台 API。
- 参数加密:分析 JS 代码中的加密逻辑(如 MD5、AES),在 Python 中复现解密过程。
3.4 频率控制
使用 time.sleep() 模拟人工操作间隔,降低被封风险。
import time
time.sleep(random.uniform(1, 3))
四、工程化框架 Scrapy
4.1 项目初始化
Scrapy 是功能强大的异步爬虫框架。
scrapy startproject myspider
cd myspider
scrapy genspider example example.com
4.2 编写 Spider
定义 Item 模型和解析逻辑。
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example'
allowed_domains = ['example.com']
start_urls = ['https://example.com/page/1']
def parse(self, response):
for href in response.css('a.next::attr(href)').getall():
yield response.follow(href, self.parse)
yield {
'title': response.css('h1::text').get(),
'content': response.css('.content::text').getall()
}
4.3 中间件与管道
- Middleware:处理请求头、代理、异常重试。
- Pipeline:清洗数据、去重、入库。
五、数据存储与管理
5.1 MongoDB 存储
MongoDB 适合存储非结构化数据,如评论、日志。
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['crawler_db']
collection = db['articles']
data = {'title': '示例文章', 'url': 'https://...'}
result = collection.insert_one(data)
print(result.inserted_id)
5.2 MySQL 存储
结构化数据建议使用关系型数据库。
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='pwd', database='db')
cursor = conn.cursor()
cursor.execute("INSERT INTO articles (title) VALUES (%s)", ('Title',))
conn.commit()
六、分布式爬虫架构
6.1 Redis 任务队列
利用 Redis 实现任务分发与去重。
import redis
r = redis.Redis(host='localhost', port=6379)
r.lpush('crawl_queue', 'https://example.com')
while True:
url = r.rpop('crawl_queue')
if url:
process(url)
6.2 Scrapy-Redis 集成
配置 DUPEFILTER_CLASS 和 SCHEDULER 实现多节点共享队列。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
七、性能优化与监控
7.1 并发控制
调整 Scrapy 的 CONCURRENT_REQUESTS 参数,平衡速度与稳定性。
7.2 日志记录
使用 logging 模块记录运行状态,便于排查问题。
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("Crawl started")
结语
爬虫技术需要持续实践与迭代。建议从静态网站入手,逐步挑战动态加载和复杂反爬场景。始终遵循合法合规原则,合理控制抓取频率,保护目标服务器安全。通过掌握上述技术栈,你将具备独立构建高效数据采集系统的能力。


