初学者如何用 Python 写第一个爬虫?

初学者写第一个 Python 爬虫 的最友好路径,通常是使用 requests + BeautifulSoup4 的组合。这套组合在 2026 年仍然是入门首选:简单、强大、社区资源最多。

目标:爬取一个静态网页(比如“豆瓣图书 Top 250” 或 “示例网站”),提取书名、评分、简介等信息,并打印出来。

第一步:准备环境(5 分钟)

确保你已经安装 Python(推荐 3.10+ 或 3.11/3.12/3.13)。

在命令行(cmd / PowerShell / 终端)执行:

pip install requests beautifulsoup4

验证安装:

import requests
from bs4 import BeautifulSoup
print("安装成功!")

第二步:最简单可运行的第一个爬虫(复制粘贴就能跑)

我们选择一个非常友好的练习目标:httpbin.org(专门给爬虫练习用的网站,不会封 IP,也不会变结构)。

# 文件名可以叫:my_first_spider.py
import requests
from bs4 import BeautifulSoup

# 1. 目标网址
url = "https://httpbin.org/html"

# 2. 发送请求(模拟浏览器)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}

try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()          # 非 200 就抛异常
except Exception as e:
    print("请求失败:", e)
    exit()

# 3. 把网页内容交给 BeautifulSoup 解析
soup = BeautifulSoup(response.text, "html.parser")

# 4. 提取我们想要的内容
# 这个页面有一个 <h1> 标题 和一段正文
title = soup.find("h1").get_text(strip=True)
content = soup.find("div", class_="jumbotron").p.get_text(strip=True)

print("页面标题:", title)
print("主要内容:")
print(content)

运行方式

python my_first_spider.py

预期输出类似:

页面标题:Herman Melville - Moby-Dick
主要内容:
...</p>

恭喜!你已经成功完成了第一个爬虫!

第三步:升级版 —— 爬取真实网页(豆瓣图书 Top 250 前 10 本)

目标网址:https://book.douban.com/top250

import requests
from bs4 import BeautifulSoup
import time

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

books = []

for page in range(0, 2):  # 前两页(前50本),初学者先爬前10本即可
    url = f"https://book.douban.com/top250?start={page*25}"

    try:
        response = requests.get(url, headers=headers, timeout=8)
        response.raise_for_status()
    except Exception as e:
        print(f"第 {page+1} 页请求失败:{e}")
        continue

    soup = BeautifulSoup(response.text, "html.parser")

    # 找到所有图书的 <tr> 行
    items = soup.select("tr.item")

    for item in items:
        title_tag = item.select_one(".pl2 a")
        title = title_tag.get_text(strip=True) if title_tag else "未知"

        author_tag = item.select_one("p.pl")
        author_info = author_tag.get_text(strip=True) if author_tag else ""

        rating_tag = item.select_one(".rating_nums")
        rating = rating_tag.get_text(strip=True) if rating_tag else "无评分"

        quote_tag = item.select_one(".inq")
        quote = quote_tag.get_text(strip=True) if quote_tag else ""

        books.append({
            "书名": title,
            "作者/出版信息": author_info,
            "评分": rating,
            "短评": quote
        })

    print(f"第 {page+1} 页爬取完成,已有 {len(books)} 本书")
    time.sleep(2)  # 非常重要!防止被封

# 打印前 10 本
print("\n前 10 本书:")
for i, book in enumerate(books[:10], 1):
    print(f"{i}. 《{book['书名']}》 评分:{book['评分']}   {book['短评']}")

运行前注意

  • 第一次运行很可能成功,但如果频繁运行,豆瓣可能会暂时限制你的 IP。
  • 真实爬虫必须加延时(time.sleep(1~5))。
  • 建议只跑一次,保存结果,不要反复运行。

第四步:常见问题 & 避坑指南(初学者最容易踩的 8 个点)

问题现象解决方案
403 Forbidden被网站拒绝加真实的 User-Agent + 随机延时
404 / 连接超时网络问题加 timeout=10 + try-except
提取不到内容find / select 返回 None右键“检查元素” → 确认 class/id 正确
乱码中文显示 ????response.encoding = ‘utf-8’
被封 IP跑几页就 403/429加代理(proxies)、降低频率、用 requests.Session() 保持会话
动态加载数据为空切换到 Selenium(浏览器自动化)或找 API
道德/法律爬私有/收费内容只爬公开数据,遵守 robots.txt,控制频率
代码太乱后期维护难把请求、解析、保存拆成函数

第五步:下一步推荐(学完第一个爬虫后)

  1. 保存数据 → 用 csv 或 json 存储
   import csv
   with open("douban_top250.csv", "w", newline="", encoding="utf-8") as f:
       writer = csv.DictWriter(f, fieldnames=["书名", "作者/出版信息", "评分", "短评"])
       writer.writeheader()
       writer.writerows(books)
  1. 学习 XPath / CSS 选择器(更精准定位)
  2. 掌握 requests 高级用法(代理、cookies、session、重试)
  3. 尝试简单反爬网站(如 quotes.toscrape.com)
  4. 进阶工具:Scrapy(框架级)、Playwright / Selenium(动态页)、httpx(异步)

一句话总结给初学者:

先用 requests + BeautifulSoup 爬 1~2 个静态网站,成功后再考虑反爬、动态页、框架。

如果你运行上面代码遇到具体报错,把错误信息贴出来,我帮你 debug。

现在就去试试吧!第一个爬虫跑通的那一刻真的很爽~

文章已创建 3996

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部