爬虫工程师小李最近遇到难题:采集某电商平台数据时,IP被封频率从每天3次激增到每小时5次,存储的CSV文件因频繁写入导致数据丢失。这些场景折射出爬虫进阶的两大核心挑战——突破反爬机制与可靠数据存储。本文将通过真实案例拆解,提供可直接复用的解决方案。

某招聘网站的反爬策略极具代表性:
通过抓包分析发现,该网站在请求第15次后返回403错误,同时设置Cookie跟踪设备信息。这要求爬虫具备动态适应能力。
案例:采集天气数据时遭遇IP封禁 解决方案:
import requests
from proxy_pool import TunnelProxy # 假设的隧道代理库
# 初始化隧道代理(以站大爷为例)
proxy = TunnelProxy(
api_url="https://tunnel.zhandaye.com/api",
api_key="YOUR_KEY",
rotate_strategy="per_request" # 每请求切换IP
)
def fetch_data(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
try:
proxies = {"http": proxy.get_proxy(), "https": proxy.get_proxy()}
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 403:
proxy.rotate_now() # 立即切换IP
return fetch_data(url) # 重试
return response.text
except Exception as e:
proxy.rotate_now()
return fetch_data(url)
效果:IP封禁率从87%降至3%,采集效率提升20倍
场景:某论坛登录时需要滑动验证码 破解方案:

案例:某新闻网站使用React渲染内容 解决方案:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless") # 无头模式
options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
# 等待JS渲染完成
driver.implicitly_wait(5)
content = driver.page_source # 获取渲染后的HTML
driver.quit()
优化技巧:
存储方式 | 适用场景 | 写入速度 | 查询效率 | 并发支持 |
|---|---|---|---|---|
CSV | 小数据量 | 快 | 低 | 单进程 |
JSON | 结构化数据 | 中 | 中 | 低 |
Parquet | 大数据分析 | 慢 | 高 | 高 |
实测数据:存储100万条商品数据时:
场景:需要实时更新的电商价格监控系统 解决方案:
# Redis缓存最新价格(内存数据库)
import redis
r = redis.Redis(host='localhost', port=6379)
r.set("product_123_price", "299.00", ex=3600) # 1小时过期
# MongoDB存储历史数据(文档数据库)
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017/")
db = client["price_monitor"]
collection = db["history"]
collection.insert_one({
"product_id": "123",
"price": 299.00,
"timestamp": datetime.now()
})
# PostgreSQL分析数据(关系型数据库)
import psycopg2
conn = psycopg2.connect("dbname=monitor user=postgres")
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS price_trend (
id SERIAL PRIMARY KEY,
product_id VARCHAR(50),
price DECIMAL(10,2),
record_time TIMESTAMP
)
""")
选型建议:
案例:爬取千万级社交媒体数据 架构设计:
性能数据:
对比测试:
# 同步版本
import requests
def sync_crawl(urls):
results = []
for url in urls:
res = requests.get(url)
results.append(res.text)
return results
# 异步版本(aiohttp)
import aiohttp
import asyncio
async def async_crawl(urls):
async with aiohttp.ClientSession() as session:
tasks = [session.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [await r.text() for r in responses]
# 实测结果(100个URL):
# 同步:12.4s
# 异步:3.1s
三级缓存架构:
效果:减少65%的重复请求,网络流量节省40%
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1))
def robust_request(url):
response = requests.get(url, timeout=10)
if response.status_code != 200:
response.raise_for_status()
return response
参数说明:
Q1:被网站封IP怎么办? A:立即启用备用代理池,建议使用隧道代理(如站大爷隧道IP池),配合每请求更换IP策略。若已封禁可尝试:
time.sleep(random.uniform(2,5)))Q2:如何处理JavaScript渲染的页面? A:根据复杂度选择方案:
Q3:数据存储时如何避免丢失? A:实施"三二一"备份策略:
Q4:如何提高爬虫的隐蔽性? A:关键技巧包括:
Q5:采集大量数据时如何节省内存? A:推荐方法:
requests.iter_content)del object)突破反爬与可靠存储是爬虫工程的两大支柱。实践中需把握三个原则:
随着AI反爬技术的升级,未来爬虫将向"智能代理"方向发展,结合机器学习动态调整采集策略。掌握本文技术栈,可应对90%以上的实际场景需求,为数据驱动决策提供坚实基础。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。