1. Python爬虫入门:从零开始的环境搭建
对于刚接触Python爬虫的新手来说,环境配置往往是第一道门槛。我建议从Python 3.7+版本开始,这个版本区间对大多数爬虫库都有良好支持。安装时务必勾选"Add Python to PATH"选项,这是很多初学者容易忽略的关键步骤。
验证安装是否成功,可以在命令行输入:
bash复制python --version
pip --version
注意:如果系统同时存在Python2和Python3,可能需要使用python3和pip3命令来明确指定版本。
开发工具方面,VSCode配合Python插件是轻量级的好选择。以下是推荐的必备插件列表:
- Python (Microsoft官方插件)
- Pylance (类型提示支持)
- Jupyter (交互式编程)
对于爬虫开发,核心库的安装顺序也有讲究。建议按以下顺序通过pip安装:
bash复制pip install requests beautifulsoup4 lxml selenium scrapy
2. 爬虫基础:HTTP请求与网页解析实战
理解HTTP协议是爬虫开发的基石。Requests库提供了简洁的API来发送HTTP请求:
python复制import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
response = requests.get('https://example.com', headers=headers)
print(response.status_code)
print(response.text[:500]) # 打印前500字符
对于动态加载的内容,Selenium是更强大的工具。需要先下载对应浏览器的WebDriver:
python复制from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
print(driver.page_source)
driver.quit()
网页解析方面,BeautifulSoup和lxml组合效率最高:
python复制from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'lxml')
titles = soup.select('h1.title') # CSS选择器
for title in titles:
print(title.get_text())
3. 爬虫进阶:应对反爬机制的策略
现代网站普遍采用各种反爬措施,合理的应对策略包括:
- 请求头伪装:完整模拟浏览器headers
python复制headers = {
'User-Agent': 'Mozilla/5.0...',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Referer': 'https://google.com'
}
- IP轮换:使用代理池避免IP被封
python复制proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080'
}
requests.get(url, proxies=proxies)
- 请求频率控制:添加随机延迟
python复制import time
import random
time.sleep(random.uniform(0.5, 1.5))
- Cookie持久化:使用Session保持登录状态
python复制session = requests.Session()
session.get(login_url)
session.post(login_url, data=auth_data)
4. Scrapy框架:构建生产级爬虫
对于复杂项目,Scrapy框架提供了完整的解决方案。创建项目的命令:
bash复制scrapy startproject myproject
cd myproject
scrapy genspider example example.com
典型的Spider类结构:
python复制import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ['http://example.com']
def parse(self, response):
for article in response.css('article'):
yield {
'title': article.css('h2::text').get(),
'url': article.css('a::attr(href)').get()
}
管道(Pipeline)处理数据持久化:
python复制class MyProjectPipeline:
def process_item(self, item, spider):
# 数据清洗逻辑
return item
运行爬虫并输出结果:
bash复制scrapy crawl example -o results.json
5. 法律与伦理:合规爬虫开发指南
开发爬虫必须遵守robots.txt协议,可以通过以下方式检查:
python复制from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url("https://example.com/robots.txt")
rp.read()
print(rp.can_fetch("*", "https://example.com/private"))
关键合规原则:
- 限制请求频率(建议≥3秒/次)
- 不爬取敏感个人信息
- 遵守网站服务条款
- 设置明显的User-Agent标识
数据存储规范:
- 仅存储必要字段
- 匿名化处理个人信息
- 设置数据过期时间
6. 性能优化:提升爬虫效率的技巧
异步请求可以大幅提高效率,aiohttp是常用选择:
python复制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:
html = await fetch(session, 'http://example.com')
print(html[:100])
asyncio.run(main())
连接池配置优化:
python复制adapter = requests.adapters.HTTPAdapter(
pool_connections=100,
pool_maxsize=100,
max_retries=3
)
session = requests.Session()
session.mount('http://', adapter)
缓存策略实现:
python复制from requests_cache import CachedSession
session = CachedSession(
'demo_cache',
expire_after=3600, # 1小时缓存
allowable_methods=['GET', 'POST']
)
7. 项目实战:微博评论爬取案例
以下是模拟登录微博的完整流程:
- 预登录获取参数
python复制prelogin_url = "https://login.sina.com.cn/sso/prelogin.php"
params = {
'entry': 'weibo',
'callback': 'sinaSSOController.preloginCallBack',
'su': base64.b64encode(username.encode()),
'rsakt': 'mod',
'checkpin': '1',
'client': 'ssologin.js(v1.4.19)'
}
- 构造登录请求
python复制session = requests.Session()
login_url = "https://login.sina.com.cn/sso/login.php"
data = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'useticket': '1',
'pagerefer': '',
'vsnf': '1',
'su': encoded_username,
'service': 'miniblog',
'servertime': servertime,
'nonce': nonce,
'pwencode': 'rsa2',
'rsakv': rsakv,
'sp': encoded_password,
'sr': '1920*1080',
'encoding': 'UTF-8',
'prelt': '115',
'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
- 爬取评论数据
python复制api_url = "https://weibo.com/ajax/statuses/buildComments"
params = {
'flow': '0',
'is_reload': '1',
'id': weibo_id,
'is_show_bulletin': '2',
'is_mix': '0',
'count': '20'
}
response = session.get(api_url, params=params)
comments = response.json()['data']
8. 常见问题排查手册
- SSL证书错误:
python复制requests.get(url, verify=False) # 临时解决方案
# 永久方案是安装证书或指定证书路径
- 编码问题:
python复制response.encoding = response.apparent_encoding # 自动检测编码
- 元素定位失败:
- 使用显式等待替代硬性等待
python复制from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "target"))
)
- 封禁应对策略:
- 检查User-Agent是否合理
- 尝试更换IP地址
- 降低请求频率
- 模拟鼠标移动等人类行为
9. 数据存储方案选型
根据数据量选择适当存储方式:
| 数据规模 | 推荐方案 | 示例代码 |
|---|---|---|
| <1MB | JSON文件 | json.dump(data, open('data.json','w')) |
| <1GB | SQLite | import sqlite3; conn = sqlite3.connect('data.db') |
| >1GB | MySQL | import pymysql; conn = pymysql.connect(host='localhost') |
| 非结构化 | MongoDB | from pymongo import MongoClient; client = MongoClient() |
对于分布式爬虫,Redis是理想的请求队列:
python复制import redis
r = redis.Redis(host='localhost', port=6379)
r.lpush('url_queue', 'http://example.com')
10. 爬虫工程化实践
使用Docker容器化部署:
dockerfile复制FROM python:3.8
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["scrapy", "crawl", "example"]
定时任务配置(Linux crontab):
bash复制0 */6 * * * /usr/bin/python3 /path/to/spider.py >> /var/log/spider.log 2>&1
日志记录最佳实践:
python复制import logging
logging.basicConfig(
filename='spider.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
监控指标收集(Prometheus格式):
python复制from prometheus_client import start_http_server, Counter
REQUESTS = Counter('spider_requests', 'Total requests')
REQUESTS.inc() # 每次请求时调用
在实际项目中,我通常会建立完整的异常处理机制,特别是对于长时间运行的爬虫,网络波动和页面结构变化是常见问题。一个健壮的重试机制可以显著提高爬虫的稳定性
