爬虫基础
约 1228 字大约 4 分钟
2026-05-10
爬虫是自动请求网页并提取数据的程序。Python 常用 requests/httpx 请求网页,用 BeautifulSoup、lxml 等解析 HTML。
- 合法合规
- 请求网页
- User-Agent
- BeautifulSoup
- 1开始前先看 robots.txt 和网站条款;优先找公开 API,不要硬爬。
- 2判断页面是不是 SSR:右键查看源代码能看到目标内容就是 SSR;看不到说明数据靠 JS 动态加载,要找 XHR 接口。
- 3三步走:requests.get + raise_for_status → BeautifulSoup(html, 'html.parser').select(...) → 写 CSV/JSON。
- 4相对链接永远用 urljoin(base_url, href) 补全 —— 直接拼字符串迟早翻车。
- 5请求间 time.sleep(1) 是基本礼貌;遇到 429 立刻降速;不要绕登录/验证码/付费墙。
爬虫是自动请求网页并提取数据的程序。Python 常用 requests/httpx 请求网页,用 BeautifulSoup、lxml 等解析 HTML。
合法合规
写爬虫前应注意:
- 查看 robots.txt
- 遵守网站条款
- 控制请求频率
- 不抓取敏感信息
- 不绕过登录、验证码、风控
- 不对目标网站造成压力
请求网页
import requests
response = requests.get('https://example.com', timeout=5)
response.raise_for_status()
html = response.textUser-Agent
有些网站会根据 User-Agent 判断客户端。
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers, timeout=5)不要伪装成浏览器去做违规抓取。
BeautifulSoup
安装:
pip install beautifulsoup4解析:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
print(soup.title.text)CSS Selector
for link in soup.select('a'):
print(link.get('href'), link.text)提取链接
from urllib.parse import urljoin
base_url = 'https://example.com'
for a in soup.select('a'):
href = a.get('href')
if href:
print(urljoin(base_url, href))urljoin() 可以把相对链接转换成绝对链接。
保存 CSV
import csv
rows = [{'title': 'Python', 'url': 'https://python.org'}]
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'url'])
writer.writeheader()
writer.writerows(rows)翻页
翻页通常有几种形式:
- URL 中有
page=1 - 页面中有“下一页”链接
- 前端接口分页
- 滚动加载
先观察浏览器 Network 面板,确认数据来源。
避免频繁请求
import time
time.sleep(1)真实爬虫应设置请求间隔、失败重试、并发限制和缓存。
先判断页面是不是适合爬
不是所有网页都适合直接用 requests + BeautifulSoup 抓取。开始前先做几个判断:
- 页面内容是否直接出现在 HTML 里;
- 是否需要登录;
- 是否有 robots.txt 或网站规则限制;
- 是否有公开 API 可以直接使用;
- 抓取频率会不会影响对方服务。
如果内容是前端 JavaScript 动态加载的,requests.get(url).text 里可能找不到你在浏览器看到的数据。这时要么找接口,要么使用浏览器自动化工具,但那已经是更进阶的话题。
一个完整的小例子:抓取标题
下面用 httpbin 不太适合演示 HTML 解析,这里写一个通用结构。真实使用时把 URL 换成你要练习的页面。
import requests
from bs4 import BeautifulSoup
url = 'https://example.com/'
headers = {
'User-Agent': 'Mozilla/5.0 learning-python-crawler/1.0',
}
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
for link in soup.select('a'):
text = link.get_text(strip=True)
href = link.get('href')
if text and href:
print(text, href)这个例子展示了最常见的三步:请求页面、解析 HTML、提取元素。
相对链接要补全
网页里的链接经常不是完整 URL:
<a href="/articles/1">文章</a>可以用 urljoin 补全:
from urllib.parse import urljoin
base_url = 'https://example.com/list/'
href = '/articles/1'
full_url = urljoin(base_url, href)
print(full_url) # https://example.com/articles/1不补全的话,后续请求 /articles/1 会不知道域名是什么。
保存 CSV 时注意换行和编码
import csv
rows = [
{'title': '第一篇', 'url': 'https://example.com/1'},
{'title': '第二篇', 'url': 'https://example.com/2'},
]
with open('articles.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'url'])
writer.writeheader()
writer.writerows(rows)newline='' 可以避免某些系统上出现多余空行。utf-8-sig 对 Excel 打开中文 CSV 更友好。
温和一点的爬取方式
初学者练习爬虫时,建议遵守几条朴素规则:
- 优先使用公开 API;
- 不绕过登录、付费墙、验证码和访问限制;
- 给请求加
timeout; - 每次请求之间
sleep一下; - 只抓自己需要的数据,不要全站乱扫;
- 报错时停止或降低频率,不要无限重试。
示例:
import time
for page in range(1, 6):
print('抓取第', page, '页')
# requests.get(...)
time.sleep(1)这不是技术洁癖,而是基本的工程礼貌。
总结
爬虫基础是“请求网页 + 解析内容 + 保存数据”。但爬虫必须遵守合法合规和礼貌抓取原则,不能只追求速度。
- 爬虫基本流程是请求页面、解析 HTML、提取数据、保存结果。
- 先确认内容是否在 HTML 中;如果是 JavaScript 动态加载,可能需要找接口。
- 爬取时要控制频率、尊重规则,不要绕过登录、验证码和付费限制。
版权所有
版权归属:Shuo Liu
