Python 爬虫入门:requests + BeautifulSoup 实战
数据采集是很多项目绕不开的一步,不管是做数据分析、做搜索引擎还是自己攒数据集,爬虫都是最基础也最常用的技能。这篇文章用 requests + BeautifulSoup 这对最经典的组合,走一遍完整流程。
1. 发起请求:requests
requests 是 Python 里最常用的 HTTP 请求库,用法非常直观:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
resp = requests.get('https://example.com', headers=headers, timeout=10)
resp.encoding = 'utf-8'
print(resp.status_code)
print(resp.text[:200])
几个容易忽略但很重要的点:
- 一定要带
User-Agent,很多网站会拦截没有请求头的请求 - 设置
timeout,避免某个请求卡死整个程序 - 注意编码,中文页面乱码大多是编码没设对
2. 解析页面:BeautifulSoup
拿到 HTML 之后,用 BeautifulSoup 把需要的数据提取出来:
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, 'html.parser')
# 按标签 + class 定位
titles = soup.find_all('h2', class_='article-title')
for t in titles:
print(t.get_text(strip=True))
# 按 CSS 选择器定位,更灵活
links = soup.select('div.article-list a')
for link in links:
print(link.get('href'))
find_all 和 select(CSS 选择器语法)是最常用的两种定位方式,页面结构复杂的时候用浏览器开发者工具(F12)先看清楚标签层级,再写选择器会顺畅很多。
3. 处理分页
大多数列表页都有分页,写一个循环遍历所有页码即可:
all_data = []
for page in range(1, 11):
url = f'https://example.com/list?page={page}'
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
items = soup.select('div.item')
if not items:
break # 没有数据了,提前结束
for item in items:
all_data.append(item.get_text(strip=True))
4. 别忘了这几件事
- 控制请求频率:在循环里加个
time.sleep(1),避免短时间内高频请求把对方服务器打挂,也降低自己被封 IP 的风险。 - 遵守 robots.txt:采集前看一下目标网站的
/robots.txt,了解哪些路径是明确不允许抓取的。 - 数据落地:抓到的数据尽量边采集边保存(比如写入 CSV 或数据库),不要全放在内存里,程序中途报错就前功尽弃了。
import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['title', 'link'])
for row in all_data:
writer.writerow(row)
5. 什么时候该换 Scrapy
如果只是抓几十上百页的静态页面,requests + BeautifulSoup 完全够用,代码也简单直接。但如果任务变成:
- 要抓成千上万个页面,需要并发和调度
- 需要处理重试、去重、中间件这些工程化需求
- 项目会长期维护,需要更规范的结构
这时候切换到 Scrapy 框架会更合适,它把请求调度、并发、数据管道这些都封装好了,适合做体量更大的采集项目。
小结
requests 负责拿数据,BeautifulSoup 负责解析数据,两者搭配是入门爬虫最快的路径。写的时候记得带请求头、控制频率、及时落地数据,量级上去了再考虑上 Scrapy 这类框架。
评论区