Python爬虫入门:豆瓣电影Top250数据爬取实战教程

Python 爬取豆瓣电影Top250教学文档

2.2 环境准备**
  • 工具安装

  • Python 解释器(建议 3.8 + 版本,官网下载)
  • PIP 包管理工具(默认随 Python 安装)
  • 库安装

    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/XML
  • html.parser:Python 内置,兼容性好但速度较慢
  • Soup = BeautifulSoup(html, "lxml")  # 指定解析器  
    
  • 元素定位方法

  • 标签名定位Soup.find("ol")
  • 属性定位info.find_all("span", {"class": "inq"})
  • 层级定位Soup.find("ol").find_all("li")
    互动任务:在黑板画出豆瓣 TOP250 页面的 HTML 结构示意图,标注ollispan等标签位置
  • 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

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python爬虫入门:豆瓣电影Top250数据爬取实战教程

    发表回复