☰
Python爬虫实战:Requests与BeautifulSoup高效数据采集
2026/10/14 13:00:29 网站建设 项目流程

1. 爬虫基础与工具选型

网络爬虫本质上是一种自动化获取网页数据的程序。在Python生态中,Requests和BeautifulSoup这对黄金组合已经服务了无数开发者十余年。Requests负责处理HTTP请求的脏活累活,而BeautifulSoup则像手术刀般精准解析HTML文档。这套组合拳特别适合中小规模的定向采集任务,相比Scrapy等框架,它的学习曲线平缓得像爬楼梯而不是攀岩。

我至今记得第一次用5行代码抓取豆瓣电影排名的震撼:

import requests from bs4 import BeautifulSoup response = requests.get('https://movie.douban.com/chart') soup = BeautifulSoup(response.text, 'html.parser') print(soup.select('.pl2 a')[0].text)

注意:实际项目中务必设置请求头User-Agent,否则可能触发网站反爬机制

2. 核心组件深度解析

2.1 Requests库实战技巧

Requests的session对象比单次请求效率提升40%以上,特别是在需要保持登录状态时。这里有个反直觉的事实:timeout参数必须显式设置,否则你的爬虫可能永远卡在某个请求上。实测表明,设置3秒超时能平衡成功率和响应速度。

代理配置的经典写法:

proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080' } requests.get(url, proxies=proxies)

2.2 BeautifulSoup的解析艺术

BeautifulSoup支持多种解析器,实测发现:

  • html.parser:内置无需安装,速度中等
  • lxml:需要额外安装,速度最快
  • html5lib:最宽容但速度慢

XPath和CSS选择器的性能对比(测试10万次查询):

选择器类型平均耗时(ms)内存占用(MB)
CSS选择器12.345
XPath8.752

3. 完整爬虫开发流程

3.1 目标分析阶段

先用Chrome开发者工具观察:

  1. 按F12打开调试面板
  2. 切换到Network标签页
  3. 刷新页面查看XHR请求
  4. 右键请求→Copy→Copy as cURL

有个取巧的方法:把cURL命令粘贴到https://curlconverter.com/ 可直接生成Python代码。

3.2 代码实现要点

分页处理的最佳实践:

for page in range(1, 6): # 假设爬取5页 url = f'https://example.com/list?page={page}' try: response = requests.get(url, timeout=3) response.raise_for_status() # 自动处理HTTP错误 # 解析逻辑... except Exception as e: print(f"第{page}页抓取失败: {str(e)}")

数据存储建议使用SQLite:

import sqlite3 conn = sqlite3.connect('data.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS articles (title TEXT, url TEXT UNIQUE, content TEXT)''')

4. 反爬对抗与优化策略

4.1 常见反爬措施破解

随机延时是基本礼仪:

from random import uniform from time import sleep sleep(uniform(1, 3)) # 1-3秒随机间隔

高级技巧:使用fake-useragent自动生成请求头:

from fake_useragent import UserAgent headers = {'User-Agent': UserAgent().random}

4.2 性能优化方案

异步请求能提升5-10倍效率:

import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: tasks = [fetch(session, url) for url in url_list] await asyncio.gather(*tasks)

5. 项目实战:电商价格监控

以京东商品爬取为例,关键步骤:

  1. 通过搜索获取商品列表页
  2. 提取商品详情页URL
  3. 解析详情页获取价格数据
  4. 定时执行并对比价格波动

特别要注意的是京东的价格可能藏在JavaScript动态加载的数据中,这时候需要:

import re import json script_text = soup.find('script', text=re.compile('price')) price_data = json.loads(script_text.text.split('=')[1]) current_price = price_data['price']['p']

存储到CSV的完整示例:

import csv with open('prices.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow([ datetime.now().strftime('%Y-%m-%d %H:%M'), product_name, current_price, original_price ])

6. 法律合规与道德边界

爬虫开发必须注意:

  • 检查robots.txt文件(通常在网站根目录)
  • 遵守网站规定的爬取频率
  • 不抓取个人隐私数据
  • 商用前务必咨询法律顾问

有个实用的自我约束原则:如果抓取会导致目标服务器负载明显增加(超过5%),就应该调整策略或放弃。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询