Python爬虫入门:豆瓣电影Top250数据爬取实战教程
Python 爬取豆瓣电影Top250教学文档
2.2 环境准备**
工具安装
库安装
pip install requests beautifulsoup4 # 爬虫核心库
pip install lxml # HTML解析器(需额外安装)
提问互动
:为什么需要安装
lxml
?(对比默认解析器的性能差异)
2.3 代码框架初识
案例代码结构拆解
# 1. 导入库
from bs4 import BeautifulSoup
import requests
import os
# 2. 定义函数获取网页
def get_html(web_url):
...
# 3. 定义函数解析数据
def get_info(all_move):
...
# 4. 主程序逻辑
if __name__ == "__main__":
...
互动任务
:让学生指出代码中 “输入 – 处理 – 输出” 的环节
第二课时:网页抓取与 HTML 解析实战
1. 课程目标
requests库获取网页内容BeautifulSoup解析 HTML 结构2. 核心知识点
2.1 模拟浏览器请求:requests库
基础用法
response = requests.get(url, headers=header)
print(response.status_code) # 检查请求状态(200=成功)
print(response.text) # 打印网页源代码
请求头(Headers)的作用
模拟真实浏览器行为,避免被网站识别为爬虫
案例中的
User-Agent
字段:
header = {
"User-Agent": "Mozilla/5.0 (Windows...Chrome/10.0.648.133 Safari/534.16"
}
动手练习
获取自己的 User-Agent
2.2 HTML 解析:BeautifulSoup库
解析器选择
lxml:速度快,支持 HTML/XMLhtml.parser:Python 内置,兼容性好但速度较慢Soup = BeautifulSoup(html, "lxml") # 指定解析器
元素定位方法
Soup.find("ol")info.find_all("span", {"class": "inq"})Soup.find("ol").find_all("li")互动任务:在黑板画出豆瓣 TOP250 页面的 HTML 结构示意图,标注
ol、li、span等标签位置2.3 数据清洗:字符串处理
常见操作
replace(" ", "").replace("\n", "")replace("\xa0", "").replace("\xee", "")if remarks:
remark = remarks[0].get_text()
else:
remark = "此影片没有评价"
第三课时:文件操作与爬虫逻辑优化
1. 课程目标
2. 核心知识点
2.1 文件与文件夹操作:os库
创建文件夹
if not os.path.exists("D:\\Pythontest1"):
os.mkdir("D:\\Pythontest1")
删除 / 写入文件
if os.path.exists("douban.txt"):
os.remove("douban.txt")
with open("douban.txt", "a") as f: # "a"表示追加写入
f.write("数据内容\n")
最佳实践
:使用
with open
避免忘记关闭文件
2.2 分页爬虫逻辑
URL 规律分析
豆瓣 TOP250 分页 URL:https://movie.douban.com/top250?start=0&filter=(start=0,25,50,…)
循环变量
page
控制页码:
page = 0
while page <= 225:
web_url = f"https://movie.douban.com/top250?start={page}&filter="
page += 25
提问互动:为什么page从 0 开始?最大页数为什么是 225?
2.3 异常处理与优化
添加延迟
:避免高频请求被封禁
import time
time.sleep(1) # 每次请求后暂停1秒
异常捕获
:处理网络错误或解析失败
python
try:
html = requests.get(url, headers=header).text
except Exception as e:
print(f"请求失败:{e}")
continue # 跳过当前错误页
课程总结与实战任务
1. 知识图谱
requests库获取网页源代码BeautifulSoup库解析HTML元素os库文件与文件夹操作循环逻辑分页数据抓取
from bs4 import BeautifulSoup
import requests
import os
def get_html(web_url): # 爬虫获取网页没啥好说的
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
html = requests.get(url=web_url, headers=header).text#不加text返回的是response,加了返回的是字符串
Soup = BeautifulSoup(html, "lxml")#lxml 解析器
data = Soup.find("ol").find_all("li") # 还是有一点要说,就是返回的信息最好只有你需要的那部分,所以这里进行了筛选
return data
def get_info(all_move):
f = open("D:\\Pythontest1\\douban.txt", "a")
for info in all_move:
# 排名
nums = info.find('em')
num = nums.get_text()
# 名字
names = info.find("span") # 名字比较简单 直接获取第一个span就是
name = names.get_text()
# 导演
charactors = info.find("p") # 这段信息中有太多非法符号你需要替换掉
charactor = charactors.get_text().replace(" ", "").replace("\n", "") # 使信息排列规律
charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
"\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")
# 评语
remarks = info.find_all("span", {"class": "inq"})
if remarks: # 这个判断是因为有的电影没有评语,你需要做判断
remark = remarks[0].get_text().replace("\u22ef", "")
else:
remark = "此影片没有评价"
print(remarks)
# 评分
scores = info.find_all("span", {"class": "rating_num"})
score = scores[0].get_text()
f.write(num + '、')
f.write(name + "\n")
f.write(charactor + "\n")
f.write(remark + "\n")
f.write(score)
f.write("\n\n")
f.close() # 记得关闭文件
if __name__ == "__main__":
if os.path.exists("D:\\Pythontest1") == False: # 两个if来判断是否文件路径存在 新建文件夹 删除文件
os.mkdir("D:\\Pythontest1")
if os.path.exists("D:\\Pythontest1\\douban.txt") == True:
os.remove("D:\\Pythontest1\\douban.txt")
page = 0 # 初始化页数,TOP一共有250部 每页25部
while page <= 225:
web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
all_move = get_html(web_url) # 返回每一页的网页
get_info(all_move) # 匹配对应信息存入本地
page += 25
作者:qq_58092714