requests + BeautifulSoup 实战:手把手教你写爬虫

在大模型、云计算、数据中台横行的今天,你可能会问:写爬虫是否已经过时?

答案是:恰恰相反,爬虫是数据世界的敲门砖。

在数据驱动、AI泛化的新时代,高质量的数据仍然是训练模型、构建知识图谱、进行数据分析的基础。爬虫不仅是数据获取的捷径,更是理解互联网结构与数据流动规律的绝佳工具。本文将带你深入浅出,从零开始实战一个真实的网页数据爬取案例,从而掌握构建通用型爬虫的关键技术与思想。


一、核心技术栈简介

  • requests:Python中使用最广泛的 HTTP 请求库,封装简单,语义清晰。

  • BeautifulSoup:用于解析 HTML/XML 的 Python 库,基于 lxmlhtml.parser,以 Pythonic 的方式提取网页结构信息。

它们结合,构成了最轻量、最实用、最经典的爬虫组合,适合初学者入门,也适合专家进行快速数据获取任务。


二、目标任务:爬取豆瓣电影 Top250

我们以豆瓣电影 Top250 页面为例,目标是获取每部电影的:

  • 电影名称

  • 评分

  • 引言(短评)

  • 详情页链接


三、搭建爬虫的工程思维

一个高质量的爬虫项目,不应只是拼凑代码,而应具备完整的工程结构鲁棒性思维

3.1 目录结构推荐

douban_spider/
├── main.py
├── spider.py
├── parser.py
├── utils.py
└── requirements.txt

说明:模块化设计是保证可扩展性与可测试性的关键。


四、实战代码解析:一步步构建高质量爬虫

4.1 请求页面(spider.py

import requests
from utils import get_headers

def fetch_html(url):
    try:
        response = requests.get(url, headers=get_headers(), timeout=10)
        response.raise_for_status()
        response.encoding = response.apparent_encoding
        return response.text
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

✅ 启发:加上 timeout异常处理 是保障鲁棒性的重要实践。


4.2 伪装浏览器(utils.py

import random

USER_AGENTS = [
    # 多个User-Agent可以反爬虫
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...",
]

def get_headers():
    return {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept-Language": "zh-CN,zh;q=0.9"
    }

✅ 启发:反反爬虫策略的第一步——伪装自己


4.3 解析页面(parser.py

from bs4 import BeautifulSoup

def parse_movies(html):
    soup = BeautifulSoup(html, 'html.parser')
    movie_list = []
    for item in soup.select('.grid_view li'):
        title = item.select_one('.title').text.strip()
        rating = item.select_one('.rating_num').text.strip()
        quote = item.select_one('.inq')
        quote = quote.text.strip() if quote else ""
        detail_link = item.select_one('a')['href']
        
        movie_list.append({
            'title': title,
            'rating': rating,
            'quote': quote,
            'link': detail_link
        })
    return movie_list

✅ 启发:用 CSS 选择器定位元素,结构清晰,表达精准。


4.4 组织主流程(main.py

from spider import fetch_html
from parser import parse_movies
import time

BASE_URL = "https://movie.douban.com/top250?start={}&filter="

def main():
    all_movies = []
    for start in range(0, 250, 25):
        url = BASE_URL.format(start)
        print(f"正在爬取:{url}")
        html = fetch_html(url)
        if html:
            movies = parse_movies(html)
            all_movies.extend(movies)
        time.sleep(1)  # 模拟人类访问,防止封IP
    print(f"共获取电影:{len(all_movies)} 部")
    for movie in all_movies[:5]:  # 展示前5个
        print(movie)

if __name__ == "__main__":
    main()

五、实战提升建议

5.1 数据持久化

建议将数据写入 csvjson数据库,方便后续分析:

import csv

def save_to_csv(data, filename="douban_top250.csv"):
    with open(filename, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=['title', 'rating', 'quote', 'link'])
        writer.writeheader()
        writer.writerows(data)

5.2 加入代理池

可集成开源代理池(如 proxy_pool)提高稳定性。

5.3 异步优化

结合 aiohttp + asyncio,提升大规模爬取效率。


六、AI 时代下的爬虫新价值

你可能会想:爬虫还值得学吗?AI不都能自动获取信息了吗?

实际上,AI 的能力依赖优质数据训练,而爬虫是获取数据的第一步。

  • 训练语料获取:自建行业语料库用于微调

  • 数据增强:爬取图文数据用于生成式任务

  • 领域模型构建:构建垂直行业知识图谱的数据支撑

换句话说,爬虫是连接真实世界与人工智能模型之间的桥梁


七、总结与启发

模块关键实践启发思考
requests超时+异常+伪装UA网络环境不稳定,必须防御
BeautifulSoup精准选择器结构页面结构变化时要弹性处理
工程组织模块化、可维护性可重用性决定未来发展空间
AI 结合从采集到训练闭环数据即力量,先手为王

结语:爬虫不只是技能,而是数据认知的起点

真正的高手,不仅写得出爬虫,还知道数据为什么有价值,如何构建数据资产的护城河

愿你从这篇文章出发,不仅学会技术,更掌握理解世界的另一种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试者家园

你的认同,是我深夜码字的光!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值