Python爬虫实战:从入门到反反爬策略

📅 2026/7/18 5:55:03 👁️ 阅读次数 📝 编程学习
Python爬虫实战:从入门到反反爬策略

1. Python爬虫入门指南

网络爬虫已经成为数据获取的重要手段,而Python凭借其丰富的库和简洁的语法,成为了爬虫开发的首选语言。我在过去五年里使用Python开发过电商价格监控、新闻聚合、社交媒体分析等多个爬虫项目,今天就来分享一些实战经验。

初学者常犯的错误是直接开始写代码,而忽略了爬虫的基本原理。实际上,一个完整的爬虫工作流程包括:目标分析、页面请求、数据提取、数据存储和反反爬处理五个关键环节。我们先从最基础的HTTP请求开始讲起。

2. 爬虫核心组件解析

2.1 请求库的选择与使用

Requests库是目前最流行的HTTP请求库,相比Python自带的urllib,它的API设计更加人性化。安装很简单:

pip install requests

基础GET请求示例:

import requests url = 'https://example.com' response = requests.get(url) print(response.status_code) # 200表示成功 print(response.text[:500]) # 打印前500个字符

重要提示:实际项目中务必添加请求头headers,否则容易被识别为爬虫。最基本的需要包含User-Agent字段。

完整的带headers请求示例:

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

2.2 数据解析技术对比

常用的解析方式有三种:

  1. 正则表达式:灵活但维护困难
  2. BeautifulSoup:适合复杂HTML文档
  3. lxml:性能最好,支持XPath

对于新手,我推荐先用BeautifulSoup:

from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') titles = soup.find_all('h2', class_='title') for title in titles: print(title.get_text())

当需要处理大量数据时,建议切换到lxml:

from lxml import etree html = etree.HTML(response.text) titles = html.xpath('//h2[@class="title"]/text()')

3. 实战爬虫开发

3.1 电商价格监控案例

以爬取某电商网站商品价格为例,完整流程如下:

  1. 分析页面结构 使用浏览器开发者工具(Ctrl+Shift+I)查看商品价格对应的HTML元素

  2. 编写爬取代码

def get_product_price(url): headers = {...} # 完整headers response = requests.get(url, headers=headers) # 价格通常有特殊class或id soup = BeautifulSoup(response.text, 'lxml') price_element = soup.find('span', class_='price') if price_element: return float(price_element.text.strip('¥')) return None
  1. 添加异常处理
try: price = get_product_price(url) except requests.exceptions.RequestException as e: print(f"请求失败: {e}") except Exception as e: print(f"解析失败: {e}")

3.2 反反爬策略大全

根据我的实战经验,网站常见的反爬手段和应对策略:

反爬手段应对方法实现示例
User-Agent检测轮换User-Agent准备多个UA随机选择
IP限制使用代理IPrequests.get(url, proxies={'http':'ip:port'})
请求频率限制添加延迟time.sleep(random.uniform(1,3))
验证码识别服务/手动打码接入第三方打码平台
行为分析模拟鼠标移动使用Selenium控制浏览器

4. 爬虫进阶技巧

4.1 使用Selenium处理动态内容

当遇到JavaScript渲染的页面时,常规请求无法获取完整内容。这时需要浏览器自动化工具:

from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') # 无头模式 driver = webdriver.Chrome(options=options) driver.get(url) dynamic_content = driver.page_source driver.quit()

4.2 Scrapy框架入门

对于大型爬虫项目,推荐使用Scrapy框架。创建项目的命令:

scrapy startproject myproject cd myproject scrapy genspider example example.com

典型的Spider类结构:

import scrapy class ExampleSpider(scrapy.Spider): name = 'example' start_urls = ['http://example.com'] def parse(self, response): for item in response.css('div.item'): yield { 'title': item.css('h2::text').get(), 'price': item.css('.price::text').get() }

5. 合法合规与优化建议

5.1 遵守robots.txt规则

每个网站根目录下的robots.txt文件规定了爬虫的访问权限。使用robotparser模块可以检查:

from urllib import robotparser rp = robotparser.RobotFileParser() rp.set_url('https://example.com/robots.txt') rp.read() can_scrape = rp.can_fetch('*', 'https://example.com/target_page')

5.2 性能优化技巧

  1. 使用连接池:
session = requests.Session() session.mount('http://', requests.adapters.HTTPAdapter(pool_connections=10))
  1. 异步请求(aiohttp示例):
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()
  1. 增量爬取:记录已爬取的URL,避免重复请求

6. 常见问题解决方案

我在实际项目中遇到的典型问题及解决方法:

  1. 乱码问题
response.encoding = response.apparent_encoding # 自动检测编码
  1. 登录会话保持
session = requests.Session() session.post(login_url, data=credentials) session.get(protected_page) # 保持登录状态
  1. 图片下载
with open('image.jpg', 'wb') as f: f.write(requests.get(image_url).content)
  1. 数据清洗技巧
import re clean_text = re.sub(r'\s+', ' ', dirty_text).strip()

对于想要系统学习爬虫的开发者,我建议按照这个路线图进阶:

  1. 掌握HTTP协议基础
  2. 熟练使用Requests+BeautifulSoup
  3. 学习XPath和CSS选择器
  4. 了解Scrapy框架
  5. 研究反爬与反反爬技术
  6. 学习分布式爬虫架构