Python爬虫基础实现
使用requests和BeautifulSoup库可以快速实现基础爬虫功能。以下是一个完整的示例代码,用于抓取网页标题和链接:
python
import requests
from bs4 import BeautifulSoup
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
for link in soup.find_all('a'):
print(link.get('href'), link.text)
关键组件说明
requests库负责发送HTTP请求并获取响应,支持GET/POST等常用方法。BeautifulSoup用于解析HTML/XML文档,提供便捷的DOM树遍历方法。
安装依赖库命令:
bash
pip install requests beautifulsoup4
反爬虫策略处理
设置请求头模拟浏览器访问:
python
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
数据存储方案
将抓取结果保存为CSV文件:
python
import csv
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['URL', 'Text'])
for link in soup.find_all('a'):
writer.writerow([link.get('href'), link.text.strip()])
异常处理机制
增加网络请求异常处理:
python
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
动态内容处理
对于JavaScript渲染的页面,可使用selenium:
python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
print(driver.page_source)
driver.quit()
Python爬虫进阶技巧
掌握基础爬虫后,可通过以下方法提升爬虫效率、稳定性和反反爬能力。以下内容基于最新技术实践总结。
动态页面处理
使用Selenium或Playwright处理JavaScript渲染的页面。Playwright支持多浏览器且性能更优。安装方式:
python
pip install playwright
playwright install
示例代码:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://example.com")
print(page.content())
browser.close()
异步爬虫架构
采用aiohttp+asyncio实现高并发请求,速度比同步请求快5-10倍。关键配置包括连接池限制和延迟控制:
python
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com/1", "https://example.com/2"]
tasks = [fetch(url) for url in urls]
return await asyncio.gather(*tasks)
results = asyncio.run(main())
智能代理池管理
构建自适应代理池需考虑:
- 多平台代理源聚合(免费+付费)
- 实时响应时间检测
- 自动剔除失效节点 推荐使用scrapy-proxy-pool等开源库实现自动切换
验证码破解方案
- 简单图像验证码:Tesseract OCR+图像预处理
- 复杂验证码:第三方打码平台接入
- 行为验证码:模拟鼠标移动轨迹
python
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element("xpath", "//div[@class='slider']")
ActionChains(driver).click_and_hold(element).move_by_offset(280,0).release().perform()
数据存储优化
根据数据量级选择方案:
- 小规模:SQLite/MySQL
- 大规模:MongoDB+Celery异步写入
- 实时分析:Elasticsearch索引
反爬对抗策略
- 请求头深度伪装:随机生成User-Agent、Accept-Language
- 请求频率控制:根据网站响应动态调整间隔
- Cookie持久化:使用requests.Session保持会话
- TLS指纹对抗:使用curl_cffi等库
分布式爬虫设计
Scrapy+Scrapy-Redis实现分布式架构:
- 安装Redis服务器
- 配置共享调度队列
- 多节点部署爬虫
python
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
监控与告警系统
- 异常捕获:通过Sentry监控运行错误
- 性能日志:记录请求响应时间、成功率
- 自动恢复:异常后自动重启爬虫
法律合规要点
- 严格遵守robots.txt协议
- 设置合理爬取间隔(建议≥3秒)
- 避免爬取个人隐私数据
- 商业用途需获得授权
以上方法需根据具体目标网站特点组合使用,建议配合Docker容器化部署提高环境一致性。