从零开始用 Python 爬取网页:初学者的实践指南

写在前面

作为一名刚接触编程不久的 Python 爱好者,我最近迷上了网页爬虫的魔法:从网页上"偷"数据,感觉像打开了互联网的宝藏地图!😂 不过,爬虫的世界并不简单,从安装库到解析 HTML,再到应对反爬机制,踩坑无数。今天,我就把自己的学习心得整理成这篇文章,分享给想入门爬虫的小伙伴。希望你能少走弯路,快速上手!

本文将以一个简单的案例------爬取 Quotes to Scrape 的名人名言为例,带你从零开始实现一个 Python 爬虫。代码、思路、注意事项一应俱全,适合完全零基础的初学者。

准备工作:工具和环境

1. 安装必要的库

我们需要两个 Python 库:

  • requests:用来发送 HTTP 请求,获取网页内容。
  • beautifulsoup4:解析 HTML,提取我们想要的数据。

安装命令:

复制代码
pip install requests beautifulsoup4

小Tips :建议用 Python 3.6+,确保环境干净。如果遇到权限问题,可以加 --user

css 复制代码
pip 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("未爬取到任何数据,请检查代码或网站")

代码解析

  1. 请求网页requests.get 获取页面内容,添加 User-Agent 模拟浏览器,降低被识别为爬虫的风险。
  2. 解析 HTML :用 BeautifulSoup 解析网页,select 方法通过 CSS 选择器定位元素(如 div.quote)。
  3. 提取数据
    • 名言:span.text
    • 作者:small.author
    • 标签:div.tags a.tag
  4. 分页处理 :通过构造 page/1/page/2/ 等 URL 爬取多页。
  5. 保存数据 :用 csv.DictWriter 将数据写入 CSV,确保支持中文(encoding='utf-8')。
  6. 错误处理 :用 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
...

踩坑经验

  1. 选择器不对 :一开始我用 find_all 找元素,结果漏掉了一些嵌套标签。后来发现 select 更灵活,直接用 CSS 选择器,省心省力!
  2. 编码问题 :保存 CSV 时忘了加 encoding='utf-8',中文全变成乱码,血泪教训!😅
  3. 请求频率 :没有加 time.sleep,连续请求导致网站响应变慢,差点被封 IP。

进阶建议

  • 动态网页 :如果遇到 JavaScript 加载的页面(如评论区),可以试试 selenium 模拟浏览器。
  • 反爬机制 :真实网站可能需要 cookies、代理或随机 User-Agent,推荐 fake_useragent 库。
  • API 爬取 :很多网站通过 API 返回数据,用 requests.post 解析 JSON 更高效。
  • 数据存储:除了 CSV,还可以存到 SQLite 或 MongoDB,方便复杂查询。

写在最后

爬虫就像一场冒险,既要胆大(敢试敢写),又要心细(注意合法性和礼貌爬取)。Quotes to Scrape 只是起点,接下来你可以试试爬取电商价格、论坛评论或新闻标题,但记得:

  • 合法合规 :查看目标网站的 robots.txt,避免爬取敏感数据。
  • 尊重服务器:设置合理的请求间隔,保护网站资源。

希望这篇文章能帮你快速入门爬虫!如果你有其他问题或想分享自己的爬虫经历,欢迎在评论区交流!🚀

个人感悟:写爬虫让我感受到代码的"魔法",从一堆 HTML 中提取结构化数据,真的有种"化腐朽为神奇"的快感!但也提醒自己,技术要用在正途,爬虫虽好,可别滥用哦!

相关推荐
free-elcmacom几秒前
机器学习高阶教程<7>Transformer原理全景解读:从“序列困境”到“注意力革命”
人工智能·python·机器学习·transformer
RwwH2 分钟前
PyCharm虚拟环境创建
ide·python·pycharm
码海踏浪7 分钟前
JMeter 时间函数合集
开发语言·python
serve the people8 分钟前
tensorflow 深度解析 Sequential 模型的输入形状指定
人工智能·python·tensorflow
SunnyDays10119 分钟前
Python 实现 PDF 文档压缩:完整指南
linux·开发语言·python
长安牧笛10 分钟前
设计考研党备考开支追踪程序,记录教材,网课,报名费支出,按科目统计花费,优化备考预算分配。
python
长空任鸟飞_阿康13 分钟前
LangChain 技术栈全解析:从模型编排到 RAG 实战
前端·python·langchain
江上鹤.14814 分钟前
Day42Dataset和Dataloader
python
天勤量化大唯粉18 分钟前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式
Bruce_Liuxiaowei24 分钟前
Python 跨平台 Nmap 自动化扫描工具:从手动到一键批量扫描
开发语言·python·网络安全·自动化