最近两年,我见过太多这样的Python学习者:花大价钱买了各种爬虫课程,从Selenium学到Scrapy,甚至研究分布式爬虫架构,结果连最基本的静态网页都爬不下来。这不是因为他们不够聪明,而是因为学习路径完全错了。
在2026年的爬虫领域,技术栈已经高度分化。但无论技术如何变化,有三个核心技能始终是爬虫工程师的立身之本:
这三个技能就像盖房子的地基,地基不牢,再漂亮的框架也撑不住。接下来,我会用最直白的语言,结合实战案例,带你彻底掌握这三个核心技能。
很多新手以为爬虫就是"下载网页",实际上爬虫是"模拟浏览器与服务器对话"。服务器会通过各种方式判断你是不是真人,而你的任务就是演得像一个真人用户。
这是最基础也最重要的伪装。一个完整的请求头应该包含:
python复制headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.google.com/',
'Connection': 'keep-alive'
}
注意:User-Agent不要用Python默认的,一定要用常见浏览器的。可以在Chrome开发者工具(F12)的Network标签中复制真实浏览器的User-Agent。
很多网站通过Cookie识别用户状态。requests库的Session对象可以自动管理Cookie:
python复制import requests
session = requests.Session()
# 第一次访问,获取Cookie
response = session.get('https://example.com/login')
# 后续请求会自动带上Cookie
response = session.get('https://example.com/dashboard')
疯狂发送请求是最容易被封的行为。合理的做法:
python复制import time
import random
for page in range(1, 101):
response = requests.get(f'https://example.com/page/{page}', headers=headers)
# 随机延时1-3秒
time.sleep(random.uniform(1, 3))
让我们用学到的知识实战一下:
python复制import requests
from bs4 import BeautifulSoup
import time
import random
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
def get_movie_info(url):
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
movies = []
for item in soup.select('.item'):
title = item.select_one('.title').text
rating = item.select_one('.rating_num').text
movies.append({'title': title, 'rating': rating})
return movies
base_url = 'https://movie.douban.com/top250?start='
for i in range(0, 250, 25):
url = base_url + str(i)
movies = get_movie_info(url)
print(f'第{i//25+1}页:', movies)
time.sleep(random.uniform(1, 3))
避坑指南:豆瓣有反爬机制,如果被封了可以:
- 更换User-Agent
- 增加延时
- 使用代理IP(后面会讲)
请求只是获取数据,解析才是提取价值的关键。常见问题:
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| BeautifulSoup | 简单易用,容错性好 | 速度较慢 | 静态HTML解析 |
| lxml | 速度快,内存占用小 | 容错性差 | 大规模数据提取 |
| 正则表达式 | 灵活强大 | 学习成本高 | 非结构化文本提取 |
| PyQuery | jQuery语法熟悉 | 功能相对有限 | 熟悉jQuery的开发者 |
python复制from bs4 import BeautifulSoup
html = """
<html>
<body>
<div class="content">
<h1>标题</h1>
<p class="text">第一段</p>
<p class="text">第二段</p>
</div>
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')
title = soup.select_one('h1').text # 获取标题
paragraphs = [p.text for p in soup.select('.text')] # 获取所有段落
find_parent()和find_next_sibling()tag['href']获取链接soup.get_text(strip=True)爬取的数据往往很脏,需要清洗:
python复制import re
dirty_data = "价格:¥ 1,299.00 元"
# 提取价格
price = re.search(r'¥\s*([\d,]+\.\d{2})', dirty_data).group(1)
# 去除千分位逗号
clean_price = float(price.replace(',', ''))
print(clean_price) # 输出:1299.0
| 反爬手段 | 识别方式 | 应对策略 |
|---|---|---|
| User-Agent检测 | 检查请求头中的User-Agent | 使用真实浏览器UA |
| IP频率限制 | 统计单个IP的请求频率 | 使用代理IP池+随机延时 |
| Cookie验证 | 检查Cookie的有效性 | 维护Session+定期更新 |
| 行为验证 | 鼠标移动、点击模式 | 使用Selenium模拟 |
| 参数加密 | 动态生成请求参数 | JS逆向分析 |
免费代理通常不稳定,建议使用付费代理服务。示例:
python复制import requests
proxies = {
'http': 'http://username:password@proxy_ip:proxy_port',
'https': 'http://username:password@proxy_ip:proxy_port'
}
response = requests.get('https://example.com', proxies=proxies)
重要提示:不要滥用免费代理,很多都是蜜罐,会窃取你的数据。
最有效的反爬策略其实是尊重网站的robots.txt,合理控制爬取频率。有些数据不一定要实时获取,可以设置定时任务每天爬一次。
根据我的经验,爬虫工程师的成长可以分为四个阶段:
虽然基础技能不变,但工具链每年都在更新。2026年值得关注的趋势:
但记住:工具会变,基础不会变。把HTTP协议、数据解析、反爬对抗这三大基础打牢,你就能快速适应任何新工具。