Python爬虫基础实现

使用requestsBeautifulSoup库可以快速实现基础爬虫功能。以下是一个完整的示例代码,用于抓取网页标题和链接:

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树遍历方法。

安装依赖库命令:

pip install requests beautifulsoup4

反爬虫策略处理

设置请求头模拟浏览器访问:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)

数据存储方案

将抓取结果保存为CSV文件:

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()])

异常处理机制

增加网络请求异常处理:

try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Request failed: {e}")

动态内容处理

对于JavaScript渲染的页面,可使用selenium

from selenium import webdriver

driver = webdriver.Chrome()
driver.get(url)
print(driver.page_source)
driver.quit()

Python爬虫进阶技巧

掌握基础爬虫后,可通过以下方法提升爬虫效率、稳定性和反反爬能力。以下内容基于最新技术实践总结。

动态页面处理

使用Selenium或Playwright处理JavaScript渲染的页面。Playwright支持多浏览器且性能更优。安装方式:

pip install playwright
playwright install

示例代码:

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倍。关键配置包括连接池限制和延迟控制:

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+图像预处理
  • 复杂验证码:第三方打码平台接入
  • 行为验证码:模拟鼠标移动轨迹
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. 多节点部署爬虫
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

监控与告警系统
  • 异常捕获:通过Sentry监控运行错误
  • 性能日志:记录请求响应时间、成功率
  • 自动恢复:异常后自动重启爬虫
法律合规要点
  • 严格遵守robots.txt协议
  • 设置合理爬取间隔(建议≥3秒)
  • 避免爬取个人隐私数据
  • 商业用途需获得授权

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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐