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

你可能感兴趣的:(python,开发语言)