20232311 2023-2024-2 《Python程序设计》实验四报告

20232311 2023-2024-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 202323
姓名: 朱峰正
学号:20232311
实验教师:王志强
实验日期:2024年5月26日
必修/选修: 公选课

1.实验内容

(1)实验要求

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。

例如:利用公开数据集,开展图像分类、恶意软件检测等

例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。

例如:爬取天气数据,实现自动化微信提醒

例如:利用爬虫,实现自动化下载网站视频、文件等。

例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

(2)实验内容

爬取网页视频,下载并保存到本地。

2.实验过程及结果

  • 第一步:获取视频所在的网页
  • 第二步:F12中找到视频真正所在的链接
  • 第三步:获取链接并转换成机械语言
  • 第四部:保存

(1)获取视频所在的网页:即这里的https;//www.ku6.com/detail/371为例

在这里插入图片描述

(2)F12中找到视频真正所在的链接:打开其中一个视频,按F12进入开发者模式;

在这里插入图片描述
按Ctrl+R,在网络模式下的媒体部分查看User-Agent:
在这里插入图片描述
在这里插入图片描述

(3)获取链接并转换成机械语言:

导入库

import re
from lxml import etree
import requests
import time
from tqdm import tqdm
import os
from urllib.request import urlopen

使用requests库发送网络请求,并使用XPath解析HTML网页内容设置了一个HTTP请求的头部信息(headers),然后使用requests库发送了一个GET请求来获取指定页面

# 头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
# 访问页面
response = requests.get('https://www.ku6.com/detail/371', headers=headers)
data = response.text

# 构造了一个XPath解析对象并对HTML文本进行自动修正
html = etree.HTML(data)
# 获取视频播放链接
html_data = html.xpath('//div[@class="r_box"]/ul/li//a/@href')
# print("html_data", html_data, type(html_data))

遍历爬取所有视频,构建完整的URL链接,发送请求获取页面内容,使用正则表达式匹配出视频地址,提取视频文件名,最后调用一个名为’download_from_url’的函数下载视频文件

# 遍历url
for i in html_data:
    url = "https://www.ku6.com%s" % i
    print(url)

    # 访问url
    response_1 = requests.get(url, headers=headers)
    data_1 = response_1.text
    # 正则匹配视频地址
    video = re.findall('type: "video/mp4", src: "(.*?)"', data_1)
    video_1 = video[0]
    print("video_1", video_1)
    x = video_1.split('/')[-1]

使用requests库发送一个支持流式下载的GET请求以获取文件内容。然后通过查询HTTP响应头部中的 ‘Content-Length’ 属性来获取文件大小,并将其转换为KB单位。接着,函数以二进制写入模式打开文件,并使用 tqdm 库来显示下载进度。

def DownloadFile(url, name):
    try:
        resp = requests.get(url=url, stream=True)
        content_size = int(resp.headers['Content-Length']) / 1024
        with open(name, "wb") as f:
            print("package total size is:", content_size, 'k,start...')
            for data in tqdm(iterable=resp.iter_content(1024), total=content_size, unit='k', desc=name):
                f.write(data)
        print("%s 下载成功" % url)
        return True
    except Exception as e:
        print(e)
        print("%s 下载失败" % url)
        return False

(4)保存

    # 本地保存视频文件名
    name = f'{x}.mp4'
    print("name", name)
# 下载视频
    download_from_url(video_1, name)
def download_from_url(url, dst):
    """
    @param: url to download file
    @param: dst place to put the file
    :return: bool
    """
    # 获取文件长度
    try:
        file_size = int(urlopen(url).info().get('Content-Length', -1))
    except Exception as e:
        print(e)
        print("错误,访问url: %s 异常" % url)
        return False

    # print("file_size",file_size)
    # 判断本地文件存在时
    if os.path.exists(dst):
        # 获取文件大小
        first_byte = os.path.getsize(dst)
    else:
        # 初始大小为0
        first_byte = 0

    # 判断大小一致,表示本地文件存在
    if first_byte >= file_size:
        print("文件已经存在,无需下载")
        return file_size

    header = {"Range": "bytes=%s-%s" % (first_byte, file_size)}

    pbar = tqdm(
        total=file_size, initial=first_byte,
        unit='B', unit_scale=True, desc=url.split('/')[-1])

    # 访问url进行下载
    req = requests.get(url, headers=header, stream=True)
    try:
        with(open(dst, 'ab')) as f:
            for chunk in req.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    pbar.update(1024)
    except Exception as e:
        print(e)
        return False

    pbar.close()
    return True

结果

在这里插入图片描述
在这里插入图片描述

实验效果

图片中为网站所含有的部分视频(虽然网站有点老)

在这里插入图片描述
视频中展现了视频的爬取和部分视频的内容

屏幕录制 2024-05-28 233335

3. 实验过程中遇到的问题和解决过程

  • 问题1:在F12中打开网络、媒体没有加载项,无法找到User-Agent:
  • 问题1解决方案:在F12中网络、xhr下也可以获得User-Agent:;
  • 问题2:只能爬取一个视频即已打开的;
  • 问题2解决方案:询问ChatGPT,遍历HTML数据中的URL,并访问每个URL,从中提取视频地址,然后将视频文件下载到本地

4.其他(感悟、思考等)

学习如何使用Python来爬取视频的过程是一个充满挑战和乐趣的过程,网络爬虫是一个广阔的领域,不断学习新的技术和工具是非常重要的。在学习过程中,需要不断搜索网络、查阅文档和代码示例,以便更好地理解和应用爬虫技术。而且爬取视频数据是一个耗时且复杂的过程,常常需要不断尝试和调试代码才能达到预期的效果,需要有耐心和坚持不懈的态度,才能克服遇到的困难和挑战。这是一个不断探索和提升自己的过程。

课程总结体会

  • 学习Python让我再一次深刻体验到了编程的魅力。通过编写代码,我可以实现各种有趣的功能和应用,这种创造力和成就感让我对编程充满了热爱。编程是一个日新月异的领域,新的技术、库和框架不断涌现,通过这一学期对python的学习,我意识到只有保持持续学习的态度,才能跟上时代的步伐,不断提升自己的竞争力。编程不仅是技术的学习,更是一种解决问题的思维方式。在这一学期的学习中,我学会了如何分析问题、拆解问题、查找资料、尝试解决方案,并在实践中不断优化和完善。
  • 从Python的语法基础开始,我逐渐掌握了变量、数据类型、条件语句、循环等核心概念。课程内外,我还学习了多个Python库和框架,我的编程能力得到了显著提高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值