Python爬虫实战:从入门到进阶

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实现分布式架构:

  1. 安装Redis服务器
  2. 配置共享调度队列
  3. 多节点部署爬虫
python 复制代码
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
监控与告警系统
  • 异常捕获:通过Sentry监控运行错误
  • 性能日志:记录请求响应时间、成功率
  • 自动恢复:异常后自动重启爬虫
法律合规要点
  • 严格遵守robots.txt协议
  • 设置合理爬取间隔(建议≥3秒)
  • 避免爬取个人隐私数据
  • 商业用途需获得授权

以上方法需根据具体目标网站特点组合使用,建议配合Docker容器化部署提高环境一致性。

相关推荐
IT_Octopus2 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148112 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
程序猿追3 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓3 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播3 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
CCblandy3 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
墨云安全4 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠4 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y4 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
拿本唠嗑AI研究4 小时前
本体工程实战指南:从建模到可维护的完整落地路径
java·人工智能·python·jena·ontology