1. 爬虫基础与工具选型
网络爬虫本质上是一种自动化获取网页数据的程序。在Python生态中,Requests和BeautifulSoup这对黄金组合已经服务了无数开发者十余年。Requests负责处理HTTP请求的脏活累活,而BeautifulSoup则像手术刀般精准解析HTML文档。这套组合拳特别适合中小规模的定向采集任务,相比Scrapy等框架,它的学习曲线平缓得像爬楼梯而不是攀岩。
我至今记得第一次用5行代码抓取豆瓣电影排名的震撼:
import requests from bs4 import BeautifulSoup response = requests.get('https://movie.douban.com/chart') soup = BeautifulSoup(response.text, 'html.parser') print(soup.select('.pl2 a')[0].text)注意:实际项目中务必设置请求头User-Agent,否则可能触发网站反爬机制
2. 核心组件深度解析
2.1 Requests库实战技巧
Requests的session对象比单次请求效率提升40%以上,特别是在需要保持登录状态时。这里有个反直觉的事实:timeout参数必须显式设置,否则你的爬虫可能永远卡在某个请求上。实测表明,设置3秒超时能平衡成功率和响应速度。
代理配置的经典写法:
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080' } requests.get(url, proxies=proxies)2.2 BeautifulSoup的解析艺术
BeautifulSoup支持多种解析器,实测发现:
- html.parser:内置无需安装,速度中等
- lxml:需要额外安装,速度最快
- html5lib:最宽容但速度慢
XPath和CSS选择器的性能对比(测试10万次查询):
| 选择器类型 | 平均耗时(ms) | 内存占用(MB) |
|---|---|---|
| CSS选择器 | 12.3 | 45 |
| XPath | 8.7 | 52 |
3. 完整爬虫开发流程
3.1 目标分析阶段
先用Chrome开发者工具观察:
- 按F12打开调试面板
- 切换到Network标签页
- 刷新页面查看XHR请求
- 右键请求→Copy→Copy as cURL
有个取巧的方法:把cURL命令粘贴到https://curlconverter.com/ 可直接生成Python代码。
3.2 代码实现要点
分页处理的最佳实践:
for page in range(1, 6): # 假设爬取5页 url = f'https://example.com/list?page={page}' try: response = requests.get(url, timeout=3) response.raise_for_status() # 自动处理HTTP错误 # 解析逻辑... except Exception as e: print(f"第{page}页抓取失败: {str(e)}")数据存储建议使用SQLite:
import sqlite3 conn = sqlite3.connect('data.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS articles (title TEXT, url TEXT UNIQUE, content TEXT)''')4. 反爬对抗与优化策略
4.1 常见反爬措施破解
随机延时是基本礼仪:
from random import uniform from time import sleep sleep(uniform(1, 3)) # 1-3秒随机间隔高级技巧:使用fake-useragent自动生成请求头:
from fake_useragent import UserAgent headers = {'User-Agent': UserAgent().random}4.2 性能优化方案
异步请求能提升5-10倍效率:
import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: tasks = [fetch(session, url) for url in url_list] await asyncio.gather(*tasks)5. 项目实战:电商价格监控
以京东商品爬取为例,关键步骤:
- 通过搜索获取商品列表页
- 提取商品详情页URL
- 解析详情页获取价格数据
- 定时执行并对比价格波动
特别要注意的是京东的价格可能藏在JavaScript动态加载的数据中,这时候需要:
import re import json script_text = soup.find('script', text=re.compile('price')) price_data = json.loads(script_text.text.split('=')[1]) current_price = price_data['price']['p']存储到CSV的完整示例:
import csv with open('prices.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow([ datetime.now().strftime('%Y-%m-%d %H:%M'), product_name, current_price, original_price ])6. 法律合规与道德边界
爬虫开发必须注意:
- 检查robots.txt文件(通常在网站根目录)
- 遵守网站规定的爬取频率
- 不抓取个人隐私数据
- 商用前务必咨询法律顾问
有个实用的自我约束原则:如果抓取会导致目标服务器负载明显增加(超过5%),就应该调整策略或放弃。