简易爬虫案例

wen java案例 5

从零开始,30分钟抓取豆瓣电影TOP250(附完整代码)

目录导读

  1. 爬虫是什么?为什么你需要一个简易案例?
  2. 环境准备:Python + 必备库安装(零基础友好)
  3. 核心原理拆解:HTTP请求 → 解析HTML → 提取数据
  4. 实战案例:抓取豆瓣电影TOP250(标题/评分/链接)
  5. 常见坑与反爬虫策略(含User-Agent伪装)
  6. 代码优化与数据存储(导出CSV/Excel)
  7. 问答环节:关于爬虫合法性、性能与进阶方向

爬虫是什么?为什么你需要一个简易案例?

爬虫(Web Crawler)本质是用代码自动获取网页数据的工具,无论是做市场调研、收集竞品信息,还是建立个人电影数据库,爬虫都是最直接的解决方案,但很多新手被“高深”的框架吓退,其实一个最简单的爬虫只需要20行代码,本文的“简易”体现在:不依赖Scrapy等重框架,只用requests + BeautifulSoup两个库,全程手写逻辑,让你彻底理解爬虫的底层流程。

简易爬虫案例

根据Google SEO的“搜索意图”分析,用户搜索“简易爬虫案例”时,80%的需求是想看到能直接运行的代码,其次才是理论,本文将重点放在可复制的实战代码上,并搭配详细的注释。


环境准备:Python + 必备库安装

1 安装Python

前往python.org下载3.8+版本,安装时务必勾选“Add Python to PATH”。

2 安装两个核心库

打开终端(CMD或Terminal),输入以下命令:

pip install requests beautifulsoup4
  • requests:模拟浏览器发送HTTP请求,获取网页源代码。
  • BeautifulSoup:解析HTML文档,像“魔法棒”一样提取指定标签内容。

验证安装成功:在Python交互环境输入import requests,无报错即可。


核心原理拆解:三步走

1 第一步:获取HTML(Requests)

import requests
url = "https://movie.douban.com/top250"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."}  # 伪装浏览器
response = requests.get(url, headers=headers)
response.encoding = "utf-8"  # 解决中文乱码
html = response.text

关键点headers中的User-Agent必须设置,否则豆瓣会返回403错误(拒绝访问),这就是最基础的反爬虫应对。

2 第二步:解析HTML(BeautifulSoup)

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
items = soup.select(".grid_view .item")  # CSS选择器,定位所有电影条目

3 第三步:提取数据

for item in items:= item.select_one(".title").text          # 电影名
    rating = item.select_one(".rating_num").text    # 评分
    link = item.select_one("a")["href"]             # 详情页链接
    print(title, rating, link)

实战案例:抓取豆瓣电影TOP250(完整代码)

以下代码直接复制即可运行,抓取前10页(共250部电影),并保存为CSV文件。

import requests
from bs4 import BeautifulSoup
import csv
def get_movies(page):
    url = f"https://movie.douban.com/top250?start={page*25}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
    }
    resp = requests.get(url, headers=headers, timeout=5)
    resp.raise_for_status()  # 状态码非200则抛异常
    resp.encoding = "utf-8"
    soup = BeautifulSoup(resp.text, "html.parser")
    movies = []
    for item in soup.select(".grid_view .item"):
        title = item.select_one(".title").text.replace(" ", "")  # 去除特殊空格
        rating = item.select_one(".rating_num").text
        people = item.select_one(".star span:last-child").text  # “154万评价”格式
        link = item.select_one("a")["href"]
        movies.append([title, rating, people.replace("人评价", ""), link])
    return movies
# 抓取10页,每页25条
all_data = []
for i in range(10):
    print(f"正在爬取第{i+1}页...")
    all_data.extend(get_movies(i))
# 写入CSV
with open("douban_top250.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["标题", "评分", "评价人数", "链接"])
    writer.writerows(all_data)
print(f"成功保存{len(all_data)}条数据到 douban_top250.csv")

代码解析

  • 分页机制:豆瓣采用start=0/25/50...参数,每页固定25条。
  • CSS选择器.title.rating_num.star span:last-child都是精确提取的“钩子”。
  • 数据清洗:使用replace()去除转义字符,保证CSV格式正确。

常见坑与反爬虫策略

1 遇到403/418错误怎么解决?

  • 403:缺少或无效的User-Agent,解决方案:使用真实浏览器UA,或轮换多个UA池。
  • 418:被识别为爬虫(如豆瓣会检查Accept-Language),添加headers中的RefererAccept-Language

2 请求间隔控制

import time
time.sleep(2)  # 每页间隔2秒,防止IP被封

尤其在循环请求时,务必加入time.sleep()

3 Cookie与Session的使用

遇到需要登录的页面,可先用浏览器手动登录,将Cookie复制到代码中:

cookies = {"xxx": "yyy"}
resp = requests.get(url, headers=headers, cookies=cookies)

代码优化与数据存储

1 使用try-except增强健壮性

try:
    resp.raise_for_status()
except requests.exceptions.HTTPError as e:
    print(f"请求失败:{e}")
    return []

2 存储到Excel

安装pandas库,一行转换:

pip install pandas
import pandas as pd
df = pd.read_csv("douban_top250.csv")
df.to_excel("douban_top250.xlsx", index=False)

3 多线程加速(进阶)

使用concurrent.futures.ThreadPoolExecutor,同时请求多个页面,速度提升5倍以上(需谨慎控制并发数)。


问答环节

Q1:抓取的数据能用于商业用途吗?

A:根据《个人信息保护法》和网站robots协议,非公开数据不可商用,豆瓣的robots.txt明确禁止爬取用户隐私数据,本文案例仅用于学习,请勿部署到服务器大规模抓取。

Q2:如何处理动态加载的网页(如Ajax数据)?

A:简单爬虫只能获取静态HTML,动态数据需分析接口(在浏览器F12→Network→XHR中查找真实请求),直接模拟接口调用,或使用Selenium模拟浏览器操作。

Q3:这个案例能扩展到其他网站吗?

A:可以,只需修改三步:①目标URL的构造规律;②解析用的CSS选择器;③数据清洗逻辑,建议先右键“查看网页源代码”分析结构。

Q4:爬虫被封IP怎么办?

A:终极方案是使用代理IP池(如阿布云、快代理),并在每次请求时随机选择代理,但在学习阶段,控制频率(每页间隔3秒以上)通常足够。


结尾延伸:从“简易”到“专业”的进阶路径

  • 入门:本文案例(掌握requests + BeautifulSoup)
  • 进阶:学习Scrapy框架(支持分布式、去重、管道)
  • 终极:逆向工程(处理JS加密、验证码、浏览器指纹)

爬虫的本质是对抗与反对抗,简易案例是你的第一块敲门砖,建议亲手运行本文代码,再尝试改动选择器抓取自己需要的网站(如博客、公开API数据)。代码只有跑起来,才算真正学会


免责声明:本文代码仅用于技术学习和个人研究,请遵守目标网站的robots.txt协议,禁止用于任何违法用途,如因滥用引发法律纠纷,后果自负。

抱歉,评论功能暂时关闭!