Python 爬虫入门:requests + BeautifulSoup 实战
# Python 爬虫入门:requests + BeautifulSoup 实战
数据采集是很多项目绕不开的一步,不管是做数据分析、做搜索引擎还是自己攒数据集,爬虫都是最基础也最常用的技能。这篇文章用 `requests` + `BeautifulSoup` 这对最经典的组合,走一遍完整流程。
## 1. 发起请求:requests
`requests` 是 Python 里最常用的 HTTP 请求库,用法非常直观:
```python
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` 把需要的数据提取出来:
```python
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. 处理分页
大多数列表页都有分页,写一个循环遍历所有页码即可:
```python
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 或数据库),不要全放在内存里,程序中途报错就前功尽弃了。
```python
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 这类框架。
评论区