准备工作
安装必要库(仅需基础库):
pip install requests beautifulsoup4 lxml
案例1:爬取豆瓣电影Top250(基础HTML解析)
目标:提取豆瓣电影Top250的电影名称、评分、评价人数(适合学习静态页面解析)。
import requests
from bs4 import BeautifulSoup
# 目标URL(豆瓣电影Top250第一页)
url = "https://movie.douban.com/top250?start=0"
# 模拟浏览器请求头(关键:避免被识别为爬虫)
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",
"Referer": "https://movie.douban.com/" # 模拟从豆瓣主页跳转
}
try:
# 发送GET请求
response = requests.get(url, headers=headers, timeout=10)
response.encoding = "utf-8" # 确保中文正常显示
# 解析HTML
soup = BeautifulSoup(response.text, "lxml") # 使用lxml解析器(高效)
# 定位电影列表(每个电影项在class为"info"的div中)
movie_list = soup.find_all("div", class_="info")
# 提取前5部电影信息
print("豆瓣电影Top250(前5部):")
for i, movie in enumerate(movie_list[:5], 1):
# 电影名称(取第一个class为"title"的span标签)
title = movie.find("span", class_="title").text.strip()
# 评分(class为"rating_num"的span标签)
rating = movie.find("span", class_="rating_num").text.strip()
# 评价人数(找到包含"人评价"的span标签)
comment_count = movie.find("div", class_="star").find_all("span")[-1].text.strip()
print(f"{i}. {title} | 评分:{rating} | {comment_count}")
except Exception as e:
print(f"爬取失败:{e}")
运行结果:会输出前5部电影的名称、评分和评价人数(如《肖申克的救赎》《霸王别姬》等)。
案例2:下载Unsplash免费图片(二进制文件处理)
目标:从Unsplash(免费图片网站)下载指定图片到本地(适合学习二进制数据保存)。
import requests
import os
# 稳定的Unsplash测试图片链接(2张示例图)
img_urls = [
"https://images.unsplash.com/photo-1518655048521-f130df041f66", # 风景图
"https://images.unsplash.com/photo-1505761671935-60b3a7427bad" # 动物图
]
# 模拟浏览器请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://unsplash.com/" # 防盗链验证
}
# 创建保存图片的文件夹
if not os.path.exists("unsplash_photos"):
os.makedirs("unsplash_photos")
# 循环下载图片
for i, url in enumerate(img_urls, 1):
try:
# 发送请求获取图片二进制数据(用content属性)
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
# 保存图片(二进制模式"wb")
img_path = f"unsplash_photos/photo_{i}.jpg"
with open(img_path, "wb") as f:
f.write(response.content)
print(f"第{i}张图片下载成功,保存至:{img_path}")
else:
print(f"第{i}张图片下载失败,状态码:{response.status_code}")
except Exception as e:
print(f"第{i}张图片下载出错:{e}")
运行结果:当前目录会生成unsplash_photos文件夹,内含2张下载的图片。
案例3:调用GitHub公开API(JSON数据解析)
目标:通过GitHub公开API获取指定仓库的信息(适合学习API接口调用和JSON解析)。
import requests
# GitHub公开API(获取"requests"库的仓库信息,无需认证)
repo_owner = "psf" # 仓库所有者(Python软件基金会)
repo_name = "requests" # 仓库名(requests库)
url = f"https://api.github.com/repos/{repo_owner}/{repo_name}"
# 请求头(GitHub API要求必须有User-Agent)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}
try:
# 发送GET请求
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
# 解析JSON数据(直接用response.json()转为字典)
repo_info = response.json()
# 提取关键信息
print(f"仓库名称:{repo_info['name']}")
print(f"描述:{repo_info['description']}")
print(f"星标数:{repo_info['stargazers_count']}")
print(f"分支数:{repo_info['forks_count']}")
print(f"最后更新时间:{repo_info['updated_at']}")
else:
print(f"API请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"请求出错:{e}")
运行结果:输出requests库的仓库信息(如星标数、分支数等)。
案例4:模拟表单提交(POST请求)
目标:通过测试接口模拟表单提交,查看服务器返回的结果(适合学习POST请求用法)。
import requests
# 公开测试接口(会返回提交的表单数据,无反爬)
url = "https://httpbin.org/post"
# 表单数据(模拟用户登录信息)
form_data = {
"username": "test_user",
"password": "123456",
"hobby": ["reading", "coding"], # 列表会自动转为多值参数
"remember_me": "true"
}
try:
# 发送POST请求(用data参数传递表单数据)
response = requests.post(url, data=form_data, timeout=10)
if response.status_code == 200:
# 解析JSON响应,查看服务器收到的数据
result = response.json()
print("服务器收到的表单数据:")
print(result["form"]) # 服务器返回的表单数据
else:
print(f"提交失败,状态码:{response.status_code}")
except Exception as e:
print(f"请求出错:{e}")
运行结果:输出服务器收到的表单数据(与提交的form_data一致)。
案例5:爬取维基百科表格数据(表格解析)
目标:提取维基百科“编程语言列表”表格的前5行数据(适合学习HTML表格解析)。
import requests
from bs4 import BeautifulSoup
# 维基百科“编程语言列表”页面(结构稳定,无反爬)
url = "https://en.wikipedia.org/wiki/List_of_programming_languages"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}
try:
response = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "lxml")
# 定位表格(维基百科表格通常有class="wikitable")
table = soup.find("table", class_="wikitable")
if table:
# 提取表头(表格第一行的th标签)
headers = [th.text.strip() for th in table.find_all("th")[:3]] # 取前3列
print("表头:", headers)
# 提取表格内容(跳过表头行,取前5行数据)
rows = table.find_all("tr")[1:6] # 从第2行开始,取5行
for i, row in enumerate(rows, 1):
# 提取每行的单元格文本(前3列)
cols = [td.text.strip() for td in row.find_all("td")[:3]]
print(f"行{i}:", cols)
else:
print("未找到表格数据")
except Exception as e:
print(f"爬取失败:{e}")
运行结果:输出编程语言列表的表头和前5行数据(如语言名称、设计者、年份等)。
关键说明
- 可运行性:所有案例均使用公开稳定的网站/接口(豆瓣、GitHub、维基百科、httpbin等),无复杂反爬,复制代码即可运行。
- 核心知识点:
- 案例1:静态页面解析(BeautifulSoup提取标签内容)
- 案例2:二进制文件下载(response.content保存图片)
- 案例3:API接口调用(JSON数据解析)
- 案例4:POST请求(表单提交)
- 案例5:HTML表格解析(提取结构化数据)
- 反爬提示:代码中已添加基础请求头(User-Agent、Referer),避免被简单反爬拦截;若运行失败,可尝试更换User-Agent(浏览器F12开发者工具中获取)。
通过这5个案例,可掌握爬虫入门的核心技能:发送请求、解析数据、处理文件、应对基础反爬。