目录
-
-
- 一、背景与需求
- 二、静态页面抓取的核心流程
- 三、requests库基础与请求头配置
-
- [3.1 安装与基本请求](#3.1 安装与基本请求)
- [3.2 请求头核心参数解析](#3.2 请求头核心参数解析)
- [3.3 自定义请求头实战](#3.3 自定义请求头实战)
- 四、实战案例:抓取豆瓣读书Top250
-
- [1. 目标](#1. 目标)
- [2. 代码实现](#2. 代码实现)
- [3. 技术要点](#3. 技术要点)
- 五、高阶技巧与反反爬策略
-
- [5.1 动态Cookie维护](#5.1 动态Cookie维护)
- [5.2 随机请求头轮换](#5.2 随机请求头轮换)
- [5.3 请求频率控制](#5.3 请求频率控制)
- 六、注意事项与合规建议
-
- [1. 法律合规:](#1. 法律合规:)
- [2. 道德规范:](#2. 道德规范:)
- [3. 异常监控:](#3. 异常监控:)
- 七、总结与扩展
-
- [1. 核心收获:](#1. 核心收获:)
- [2. 进阶方向:](#2. 进阶方向:)
- Python爬虫相关文章(推荐)
-
一、背景与需求
在数据驱动的互联网时代,静态页面抓取是获取公开数据的核心手段。然而,大多数网站会对非浏览器请求进行拦截,例如通过检测请求头(User-Agent/Cookie)识别爬虫行为。若未正确模拟浏览器请求,轻则返回异常数据,重则触发IP封禁。
本文目标:基于Python的requests库,详解如何通过设置请求头绕过基础反爬机制,高效抓取静态页面数据,并提供可复用的代码模板与避坑指南。
二、静态页面抓取的核心流程
静态页面抓取的本质是模拟浏览器发送HTTP请求,其核心步骤包括:
- 发送请求:使用requests.get()或requests.post()获取网页内容。
- 解析响应:通过状态码(如200/403/404)判断请求状态,提取HTML文本。
- 数据清洗:结合正则表达式、BeautifulSoup或XPath解析目标数据。
关键问题
- 如何避免被封禁? → 伪装请求头(User-Agent/Cookie)。
- 如何处理登录状态? → 携带Cookie维持会话。
三、requests库基础与请求头配置
3.1 安装与基本请求
python
# 安装requests库
pip install requests
# 发送GET请求示例
import requests
url = "https://www.example.com"
response = requests.get(url)
print(response.status_code) # 输出状态码
print(response.text) # 输出HTML内容
3.2 请求头核心参数解析
请求头(Headers)是HTTP请求的元数据,用于告知服务器客户端信息。爬虫需重点关注以下字段:
字段 | 作用 | 示例值 |
---|---|---|
User-Agent | 标识客户端类型(浏览器/设备),帮助服务器识别客户端环境 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) |
Cookie | 维持会话状态,包含登录凭证、页面偏好等关键信息 | sessionid=abc123; token=xyz789 |
Referer | 声明请求来源页面,用于防跨站请求伪造(CSRF)等安全机制 | https://www.google.com |
3.3 自定义请求头实战
python
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Cookie": "Hm_lvt_abc=123456; Hm_lpvt_abc=654321",
"Referer": "https://www.baidu.com/"
}
# 发送带自定义请求头的GET请求
response = requests.get(url, headers=headers)
如何获取合法User-Agent?
- 浏览器开发者工具(F12 → Network → Headers → User-Agent)。
- 第三方库fake_useragent随机生成:
python
from fake_useragent import UserAgent
ua = UserAgent()
headers = {"User-Agent": ua.chrome}
如何获取Cookie?
- 手动获取:登录目标网站后,从浏览器开发者工具复制Cookie。
- 自动获取:通过requests.Session模拟登录流程(需分析登录接口)。
四、实战案例:抓取豆瓣读书Top250
1. 目标
提取书籍名称、评分、短评数量及出版信息。
2. 代码实现
python
import requests
from bs4 import BeautifulSoup
url = "https://book.douban.com/top250"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Cookie": "your_cookie_here" # 如需登录后数据,需填写有效Cookie
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
books = []
for item in soup.find_all("tr", class_="item"):
title = item.find("div", class_="pl2").a["title"].strip()
rating = item.find("span", class_="rating_nums").text
comment_num = item.find("span", class_="pl").text.split()[-1].strip("()")
publish_info = item.find("p", class_="pl").text.split("/")[-3:]
books.append({
"title": title,
"rating": rating,
"comment_num": comment_num,
"publish_info": publish_info
})
print(books[:3]) # 输出前3条数据
else:
print(f"请求失败,状态码:{response.status_code}")
3. 技术要点
- User-Agent伪装:绕过豆瓣基础反爬检测。
- 异常处理:检查状态码,避免解析失败导致崩溃。
- 数据清洗:通过字符串分割提取出版年份、出版社等信息。
五、高阶技巧与反反爬策略
5.1 动态Cookie维护
使用requests.Session对象自动管理Cookie:
python
session = requests.Session()
# 模拟登录(需分析登录接口)
login_data = {"username": "user", "password": "pass"}
session.post("https://www.example.com/login", data=login_data)
# 后续请求自动携带Cookie
response = session.get("https://www.example.com/protected-page")
5.2 随机请求头轮换
结合fake_useragent与代理IP,降低封禁风险:
python
from fake_useragent import UserAgent
import random
ua = UserAgent()
headers_list = [{"User-Agent": ua.chrome}, {"User-Agent": ua.firefox}]
# 随机选择请求头
headers = random.choice(headers_list)
response = requests.get(url, headers=headers)
5.3 请求频率控制
添加随机延迟,模拟人类操作:
python
import time
import random
for page in range(1, 6):
response = requests.get(f"https://example.com/page/{page}", headers=headers)
time.sleep(random.uniform(1, 3)) # 随机延迟1~3秒
六、注意事项与合规建议
1. 法律合规:
- 遵守robots.txt协议(如豆瓣禁止部分路径抓取)。
- 禁止采集个人隐私或商业机密数据。
2. 道德规范:
- 控制请求频率,避免对目标服务器造成压力。
- 注明数据来源,尊重版权。
3. 异常监控:
- 捕获requests.exceptions(如超时、连接错误)。
- 监控响应内容是否包含反爬提示(如"请验证身份")。
七、总结与扩展
1. 核心收获:
- 请求头(User-Agent/Cookie)是静态页面抓取的生命线,需精准配置。
- requests库灵活易用,结合BeautifulSoup可实现快速数据解析。
2. 进阶方向:
- 动态页面抓取:学习Selenium或Playwright处理JavaScript渲染。
- 分布式爬虫:使用Scrapy-Redis提升抓取效率。
- 数据存储:集成MySQL/MongoDB持久化数据。