从零开始用 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 中提取结构化数据,真的有种"化腐朽为神奇"的快感!但也提醒自己,技术要用在正途,爬虫虽好,可别滥用哦!

相关推荐
西猫雷婶35 分钟前
python学智能算法(二十六)|SVM-拉格朗日函数构造
人工智能·python·算法·机器学习·支持向量机
java1234_小锋3 小时前
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析
python·自然语言处理·flask
**梯度已爆炸**3 小时前
Python Web框架详解:Flask、Streamlit、FastAPI
python·flask·fastapi·streamlit
@陌陌4 小时前
力扣(1957,128) - day01
java·python·算法
CYRUS STUDIO5 小时前
打造自己的 Jar 文件分析工具:类名匹配 + 二进制搜索 + 日志输出全搞定
java·python·pycharm·jar·逆向
MediaTea5 小时前
Python 库手册:html.parser HTML 解析模块
开发语言·前端·python·html
杨荧5 小时前
基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js
开发语言·前端·vue.js·后端·爬虫·python·信息可视化
蹦蹦跳跳真可爱5896 小时前
Python----NLP自然语言处理(Doc2Vec)
开发语言·人工智能·python·自然语言处理
学习的学习者6 小时前
CS课程项目设计4:支持AI人机对战的五子棋游戏
人工智能·python·深度学习·五子棋
LeoSpud6 小时前
# 🚀 如何在公司正确配置 Miniconda + conda-forge(避免 Anaconda 商业限制)
python