20221211王澜2022-2023-2python实验四报告

飞蓬 2023-05-25 22:54:28

实验四 综合实践
课程:《Python程序设计》
班级: 2212
姓名:王澜
学号:20221211
实验教师:王志强
实验日期:2022年5月20日
必修/选修: 公选课

1.实验内容:利用爬虫,实现自动化下载网站视频、文件。

我做的是用爬虫爬取豆瓣网的图片和视频,分为主函数、文件测试、和测试代码三个主要部分

2.实验过程和结果

(一)实验代码

1.主函数

# 利用python爬虫实现自动化下载网络视频、文件等
# 开发环境:Windows 10  PyCharm 2022.2.2(Professional)
# python版本:python 3.7
# 采用bs4进行网页解析

from random import randint

import requests
import savefile
import time
from bs4 import BeautifulSoup

default_urls = [
    'https://movie.douban.com/subject/3878007/',
    'https://movie.douban.com/trailer/240074/#content',
    'https://movie.douban.com/trailer/241197/#content'
]

header = {
    'user-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 '
                  'Safari/537.36',
}

picture = 0
skip_picture = 0
video = 0
skip_video = 0
picture_failed = []
video_failed = []


def get_type(url):
    """
    :param url: 目标资源的URL,一般来说,URL会携带有目标文件的格式和命名信息,并且在URL的最后 一个斜杠后
    :return: 只取最后一个.后面的内容,通常代表文件格式
    """
    start = url.rfind('.')
    this_type = url[start:]  # 切片
    return this_type


def download_picture(src):
    wait_time = randint(1, 2)  # 随机生成等待时间,模拟真实用户操作,防止被反爬虫
    for url in src:
        print("尝试下载:", url)
        response = requests.get(url=url)
        if response.status_code == 200:
            data = response.content  # 获取文件二进制内容
            # print(len(data))
            if len(data) < 1000:
                # 图片过小认为是素材,不予存储
                print("下载跳过")
                global skip_picture  # 声明全局变量
                skip_picture = skip_picture + 1
                continue
            img_type = get_type(url)
            global picture
            picture = picture + 1
            name = str(picture) + img_type
            savefile.save_picture(data, name) # data表示二进制内容,命名是刚刚剪切的字符串
        else:
            print(url, '下载失败')
            picture_failed.append(url) # 存储异常信息
            continue
        time.sleep(wait_time)


def download_video(src):
    wait_time = randint(1, 2)
    for url in src:
        print("尝试下载:", url)
        response = requests.get(url=url)
        if response.status_code == 200:
            data = response.content
            # print(len(data))
            if len(data) < 10000:
                # 体积过小认为是素材
                print("下载跳过")
                global skip_video
                skip_video = skip_video + 1
                continue
            video_type = get_type(url)
            global video
            video = video + 1
            name = str(video) + video_type
            savefile.save_video(data, name)
        else:
            print(url, '下载失败')
            video_failed.append(url)
            continue
        time.sleep(wait_time)


def analyze_resource_types(html_file):
    with open(html_file, 'r', encoding='utf-8') as file:
        soup = BeautifulSoup(file, 'html.parser')
        # 查找所有的链接标签<video>
        video_tags = soup.find_all('video')
        # 查找所有的图像标签 <img>
        img_tags = soup.find_all('img')

    src_list = []

    src_list.clear()
    savefile.clear_video()  # 清空预备文件夹
    for tag in video_tags:
        # 根据tag内容选择bs4筛选方式
        video_src = tag.source['src']
        if video_src:
            src_list.append(video_src)
    if src_list:
        download_video(src=src_list)

    src_list.clear()
    savefile.clear_picture()  # 清空预备文件夹
    for tag in img_tags:
        # 根据tag内容选择bs4筛选方式
        this_src = tag.get('src')
        if this_src:
            src_list.append(this_src)
    if src_list:
        download_picture(src=src_list)

    print('Spider Over!')
    print(picture, "pictures downloaded")
    print(skip_picture, "picture skipped!")
    print(len(picture_failed), "pictures failed!")
    if picture_failed:
        print(picture_failed)
    print()

    print(video, "videos downloaded")
    print(skip_video, "video skipped!")
    print(len(video_failed), "videos failed!")
    if video_failed:
        print(video_failed)


def spider(*urls):
    url = urls[0]
    if len(url) == 0:
        # 如果没有输入采取默认地址
        url = default_urls[2]
    print("开始爬取:", url)
    response = requests.get(url=url, headers=header)
    if response.status_code != 200:
        # 访问失败
        print(f'Error get:{url}')
        print("Maybe not enter right URL!")
        exit(0)
    html = response.content.decode('utf-8')
    savefile.savefile_text(html, 'index.html')
    analyze_resource_types('index.html')


def main():
    # url = input("请输入要爬取的网址")
    url = ''
    spider(url)


# 主程序
if __name__ == '__main__':
    main()

2.文件测试的代码

import os
import shutil

video_folder = "Video"
picture_folder = "Picture"


def clear_folder(path):
    """清空文件夹函数
    :param path: 需要清空文件夹的路径
    :return:
    """
    try:
        shutil.rmtree(path)
    except FileNotFoundError:
        print("建立文件夹")
    finally:
        os.mkdir(path)


def savefile_text(content,path):
    """将二进制文件存储为目标名称的视频文件文件(名字里面需要包含文件格式)
        :param path: 文件路径
        :param content: 文件的字符串内容
        :return: 是否成功存储
    """
    try:
        file = open(path, "w", encoding='utf-8')  # 打开文件以进行写入
        bytes_written = file.write(content)  # 写入数据并获取写入的字节数
        file.close()  # 关闭文件

        if bytes_written == len(content):
            print(path, "写入成功")
            return True
        else:
            print(path, "写入失败")
            return False
    except IOError:
        print("写入文件时发生错误")
        return False


def savefile_binary(content, path):
    """将二进制文件存储为目标名称的视频文件文件(名字里面需要包含文件格式)
        :param path: 文件路径
        :param content: 文件的二进制内容
        :return: 是否成功存储
    """
    try:
        file = open(path, "wb")  # 打开文件以进行写入
        bytes_written = file.write(content)  # 写入数据并获取写入的字节数
        file.close()  # 关闭文件

        if bytes_written == len(content):
            print(path, "写入成功")
            return True
        else:
            print(path, "写入失败")
            return False
    except IOError:
        print("写入文件时发生错误")
        return False


def clear_video():
    clear_folder(path=video_folder)


def save_video(content, name):
    """保存视频的函数,本质上是调用了savefile_binary,封装了文件夹
    :param content: 二进制内容
    :param name: 存储名称
    :return:
    """
    path = video_folder + '/' + name
    return savefile_binary(content, path)


def clear_picture():
    clear_folder(path=picture_folder)


def save_picture(content, name):
    path = picture_folder + '/' + name
    return savefile_binary(content, path)

3.测试代码

from bs4 import BeautifulSoup

html = '''
<video class="video-js vjs-douban" id="player-html5-240074">
<source src="https://vt1.doubanio.com/202305202059/7670e86d6a346fd63191b99b767d0115/view/movie/M/402400074.mp4" title="" type="video/mp4"/>
</video>
'''
html_file = "index.html"
file = open(html_file, 'r', encoding='utf-8')
soup = BeautifulSoup(file, 'html.parser')
video_tag = soup.find_all('video')
tag = video_tag[0]
src_attribute = tag.source['src']
file.close()
print(tag)
print(src_attribute)

(二)运行结果

我通过此程序爬取了豆瓣网的一个视频和50张图片储存在电脑中。

下面是实验结果

爬取的照片

爬取的视频

 演示视频放在压缩包里了,老师可以看压缩包里的视频。

 

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

  • 问题1:不知道编写一个爬取的网站的代码
  • 问题1解决方案:从网络上搜集类似的爬取代码,求助会编写代码的朋友。
  • 问题2:最后怎么样都不能正常运行
  • 问题2解决方案:发现是没有安装完整的解释器,安装了bs4和requests后才成功爬取

心得体会(感悟、思考等)

选择爬取这个豆瓣是因为豆瓣的cp组比较好,我寒假时一直在豆瓣磕一对cp,就想能不能直接爬取豆瓣来保存他们的照片,最后在自己的编写下和朋友的帮助下最终完成了这个小程序,说实话,我并没有完全掌握这个代码,在多次求助下,运用大致框架,在结合所学的一些知识写完了小程序。最终写出来相对完整的代码,最让我头疼的是在哪里去储存这些图片,不能最后什么也找不到,找不到最后存哪里,还有就是怎么去爬取,利用的这个网址能不能是客户自己输入的,可是还是能力有限,只能自己在源代码里修改爬取的网址,不能做到像一个小程序和APP一样,可以由用户自己决定爬取的内容,还是存在一定的局限性,所以我想以后可以自己做一个可以在手机端或者电脑端能使用的小程序。

全课总结

“人生苦短,我用python”

开始

“进程已结束,退出代码0”

终止

这学期的晚课,可以说,python从一开始的折磨我,到后来的渐渐和解,到最后一起合作,完成一个又一个实验报告,我得到的收获不仅仅局限于计算机的一行行代码中,这背后所包含的道理和经验是我永远拥有的,我知道了csdn这个强大的平台,什么都有,我还收到了王老师赠予的csdn的小奖章,还有知道了遇到自己从未接触的领域时自己原来是可以放轻松,不用那么紧绷,如临大敌一般怕python,就平常心去踏踏实实学习就好,跟着志强老师一步步学习就够了,不懂的就在csdn上找能解决的方法,是在不行再去求助同学。总之,ddl的最后一秒,总能看到我的身影,但是我还是也走过来了。

对于课程的建议,我想的是老师可以将课上的讲义发给我们,课上提问的时候,可以多多抽取下一学期的朋友哦,多多益善,越多越好,这学期倒是真的每次抽人的时候,我都有点忐忑,嗯,这方面没做好,以后有机会,尽量不怕老师提问hh

有一个问题是,在实验二和实验三之间感觉难度跨度太大,我当时有点懵了,完全不知道怎么写这个新的实验报告,就好像是从十楼突然登上探月飞船,完全崩溃了,啥也不懂,怎么突然就加密解密,客户端、服务端了,有点希望就是王卡西老师可以针对以后的基础比较薄弱的同学可以有一个帮助小组,让有一些编程基础的同学当组长,组长可以加分,让组长带带像我的这种小白们。

还希望王老师,以后,可以,多布置点实验,不怕少的。

最大的感悟就是python比C语言简单多了,我真怵C语言,没选错课(*^▽^*),以后看见王老师的课还选。

 

 

...全文
738 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞蓬 2023-05-25
  • 打赏
  • 举报
回复

img

下载代码方式:https://pan.quark.cn/s/957405011bdf 在计算机视觉技术中,轮廓提取与中心识别被视为两项核心的技术,它们对于图像处理及模式识别领域扮演着不可或缺的角色。本文将深入剖析这两种算法,并围绕"轮廓提取(中心识别)算法"这一核心主题,同时结合所提供的压缩包文件"Contour",对相关知识点进行详尽的阐述。 轮廓提取算法,主要功能在于识别并分离图像中的不同对象。该算法通过探测物体边缘,构建出明确的边界线,从而实现图像内部各组成部分的区分。在多色位图环境下,不同的色彩可能象征着不同的对象或区域,因此,一个性能优越的轮廓提取算法应当具备处理此类复杂场景的能力。常见的轮廓提取算法包括Canny边缘检测、Sobel算子、Laplacian算子和Hough变换等。这些算法各自具备独特的优缺点,究竟选择何种方法,需要依据具体的应用情境以及性能要求来决定。 1. Canny边缘检测:由John F. Canny所研发,这是一种自适应的多级边缘检测方法。Canny算法借助高斯滤波器来降低噪声干扰,随后运用强度梯度和非极大值抑制技术来定位最显著的边缘,最终通过双阈值检测来区分边缘与噪声。 2. Sobel算子:Sobel算子是一种基于梯度的边缘检测工具,它通过计算图像在水平和垂直方向上的梯度来探测边缘。此方法操作简便且效率较高,但可能对图像中的噪声较为敏感。 3. Laplacian算子:Laplacian算子是一种二阶导数算子,能够迅速识别图像中的尖峰(即边缘)。然而,它容易受到噪声的影响,因此通常需要与其他技术结合使用,例如Gaussian滤波。 4. Hough变换:Hough变换是一种在参数空间中进行边缘检测的方法,它能够检测出任意...
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: **本资源原本已设置为“0积分下载”**,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,**自动将部分资源的积分调整为非0数值**(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 **因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。** 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。**强烈建议:仅在页面显示为0积分时进行下载。** 另外,本资源描述中**并未直接提供具体的下载地址或外部链接**,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!

144

社区成员

发帖
与我相关
我的任务
社区描述
开展Python教学和技术交流
python 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧