写在前面
作为一名刚接触编程不久的 Python 爱好者,我最近迷上了网页爬虫的魔法:从网页上"偷"数据,感觉像打开了互联网的宝藏地图!😂 不过,爬虫的世界并不简单,从安装库到解析 HTML,再到应对反爬机制,踩坑无数。今天,我就把自己的学习心得整理成这篇文章,分享给想入门爬虫的小伙伴。希望你能少走弯路,快速上手!
本文将以一个简单的案例------爬取 Quotes to Scrape 的名人名言为例,带你从零开始实现一个 Python 爬虫。代码、思路、注意事项一应俱全,适合完全零基础的初学者。
准备工作:工具和环境
1. 安装必要的库
我们需要两个 Python 库:
- requests:用来发送 HTTP 请求,获取网页内容。
- beautifulsoup4:解析 HTML,提取我们想要的数据。
安装命令:
pip install requests beautifulsoup4
小Tips :建议用 Python 3.6+,确保环境干净。如果遇到权限问题,可以加
--user
:
csspip install --user requests beautifulsoup4
2. 选择一个练习网站
我选了 Quotes to Scrape 作为练习目标。这个网站是专门为爬虫初学者设计的,结构简单、无反爬限制,包含名人名言、作者和标签,适合练手。
实战:爬取名人名言
目标
我们将爬取网站前 3 页的名言,每页 10 条,提取以下信息:
- 名言内容
- 作者
- 标签
最终将数据保存为 CSV 文件,方便后续分析。
代码实现
下面是完整的爬虫代码,带详细注释:
python
import requests
from bs4 import BeautifulSoup
import csv
import time
# 设置请求头,模拟浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'
}
# 保存数据的列表
quotes_data = []
# 爬取前 3 页
base_url = 'http://quotes.toscrape.com'
for page in range(1, 4):
url = f"{base_url}/page/{page}/"
print(f"正在爬取第 {page} 页: {url}")
try:
# 发送请求
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(response.text, 'html.parser')
# 查找所有名言
quotes = soup.select('div.quote')
if not quotes:
print(f"第 {page} 页未找到名言")
continue
# 提取每条名言
for quote in quotes:
text = quote.select_one('span.text').text.strip()
author = quote.select_one('small.author').text.strip()
tags = [tag.text.strip() for tag in quote.select('div.tags a.tag')]
tags = ', '.join(tags) if tags else '无标签'
quotes_data.append({
'quote': text,
'author': author,
'tags': tags,
'page': page
})
print(f"第 {page} 页爬取完成,找到 {len(quotes)} 条名言")
time.sleep(1) # 休眠 1 秒,避免请求过快
except requests.RequestException as e:
print(f"请求第 {page} 页失败: {e}")
continue
# 保存到 CSV
if quotes_data:
with open('quotes.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['quote', 'author', 'tags', 'page'])
writer.writeheader()
writer.writerows(quotes_data)
print(f"爬取完成,共保存 {len(quotes_data)} 条名言到 quotes.csv")
else:
print("未爬取到任何数据,请检查代码或网站")
代码解析
- 请求网页 :
requests.get
获取页面内容,添加User-Agent
模拟浏览器,降低被识别为爬虫的风险。 - 解析 HTML :用
BeautifulSoup
解析网页,select
方法通过 CSS 选择器定位元素(如div.quote
)。 - 提取数据 :
- 名言:
span.text
- 作者:
small.author
- 标签:
div.tags a.tag
- 名言:
- 分页处理 :通过构造
page/1/
、page/2/
等 URL 爬取多页。 - 保存数据 :用
csv.DictWriter
将数据写入 CSV,确保支持中文(encoding='utf-8'
)。 - 错误处理 :用
try-except
捕获网络错误,time.sleep(1)
防止请求过快。
运行后,你会在当前目录生成 quotes.csv
,内容如下:
css
quote,author,tags,page
"The world as we have created it is a process of our thinking...",Albert Einstein,change,deep-thoughts,thinking,world,1
...
踩坑经验
- 选择器不对 :一开始我用
find_all
找元素,结果漏掉了一些嵌套标签。后来发现select
更灵活,直接用 CSS 选择器,省心省力! - 编码问题 :保存 CSV 时忘了加
encoding='utf-8'
,中文全变成乱码,血泪教训!😅 - 请求频率 :没有加
time.sleep
,连续请求导致网站响应变慢,差点被封 IP。
进阶建议
- 动态网页 :如果遇到 JavaScript 加载的页面(如评论区),可以试试
selenium
模拟浏览器。 - 反爬机制 :真实网站可能需要 cookies、代理或随机 User-Agent,推荐
fake_useragent
库。 - API 爬取 :很多网站通过 API 返回数据,用
requests.post
解析 JSON 更高效。 - 数据存储:除了 CSV,还可以存到 SQLite 或 MongoDB,方便复杂查询。
写在最后
爬虫就像一场冒险,既要胆大(敢试敢写),又要心细(注意合法性和礼貌爬取)。Quotes to Scrape 只是起点,接下来你可以试试爬取电商价格、论坛评论或新闻标题,但记得:
- 合法合规 :查看目标网站的
robots.txt
,避免爬取敏感数据。 - 尊重服务器:设置合理的请求间隔,保护网站资源。
希望这篇文章能帮你快速入门爬虫!如果你有其他问题或想分享自己的爬虫经历,欢迎在评论区交流!🚀
个人感悟:写爬虫让我感受到代码的"魔法",从一堆 HTML 中提取结构化数据,真的有种"化腐朽为神奇"的快感!但也提醒自己,技术要用在正途,爬虫虽好,可别滥用哦!