20234202 2023-2024-2 《Python程序设计》实验4 Python综合实践

20234202张思宇 2024-05-21 20:33:05

课程:《Python程序设计》
班级: 2342
姓名: 张思宇
学号:20234202
实验教师:王志强
实验日期:2024年5月20日
必修/选修: 专选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2.实验内容及结果

经过思考之后我决定制作一个关于爬虫的Pyhton程序,具体任务是爬取彼岸壁纸的壁纸内容信息。

 

(1)首先,为了顺利地爬取信息,我在Pycharm上事先下载了三个相关的库。具体操作如下。

 (2)接着,我对程序进行了编写,步骤分别是:创建一个随机User-Agent实例,生成随机的请求头,初始化一个列表的来存储所有图片链接,遍历前10页,查找图片链接并将其附加到列表中。

 (3)随后,我继续进行编写,具体步骤如下:休眠一段时间避免给服务器造成过大压力,创建文件夹,定义一个函数来保存图片,图片类型,获取图片信息名字链接,创建文件夹,发送请求,检查请求是否成果,清理文件名,保存图片,创建线程池,并限定为最多10个。

 (4)运行程序,以下是运行的结果展示。

 3.源代码

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import time
import os
from concurrent.futures import ThreadPoolExecutor

# 创建一个随机 User-Agent 实例
ua = UserAgent()

# 生成随机的请求头
headers = {'User-Agent': ua.random}

# 初始化一个列表来存储所有图片链接
all_urls = []

print('开始抓取')

# 遍历前10页
for page_num in range(1, 11):
    if page_num == 1:
        url = 'https://pic.netbian.com/new/'
    else:
        url = f'https://pic.netbian.com/new/index_{page_num}.html'
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, "html.parser")

    # 查找图片链接并将其附加到列表中
    ultag = soup.find('ul', class_='clearfix')
    litags = ultag.find_all('li')
    for litag in litags:
        imgurl = litag.find('a')['href']
        imgurl = 'https://pic.netbian.com' + imgurl
        all_urls.append(imgurl)

    # 休眠一段时间,避免给服务器造成过大压力
    time.sleep(1)
    print(f'获取了{page_num}页链接')

# 创建文件夹
parent_folder = "pic"
os.makedirs(parent_folder, exist_ok=True)

# 定义一个函数来保存图片
def save_image(url):
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, "html.parser")

    # 图片类型
    lotags = soup.find('div', class_="loaction")
    pictype = lotags.find_all('a')[1].text

    # 获取图片信息 名字 链接
    photomsg = soup.find('div', class_="photo")
    name = photomsg.find('h1').text
    imgurl = photomsg.find('a', id="img").find('img')['src']
    imgurl = 'https://pic.netbian.com'+imgurl

    # 创建文件夹
    sub_folder = pictype
    os.makedirs(os.path.join(parent_folder, sub_folder), exist_ok=True)

    # 发送请求
    response = requests.get(imgurl, headers=headers)
    # 检查请求是否成功
    if response.status_code == 200:
        # 清理文件名
        clean_name = ''.join(x for x in name if x.isalnum() or x in [' ', '.', '-'])
        # 保存图片
        with open(os.path.join(parent_folder, sub_folder, f"{clean_name}.jpg"), "wb") as f:
            f.write(response.content)
        print(f"图片已保存为{parent_folder}/{sub_folder}/{clean_name}.jpg")
    else:
        print("请求失败")

# 创建线程池 最多10个线程
with ThreadPoolExecutor(max_workers=10) as executor:
    # 提交任务
    for url in all_urls:
        executor.submit(save_image, url)


 

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import time
import os
from concurrent.futures import ThreadPoolExecutor

# 创建一个随机 User-Agent 实例
ua = UserAgent()

# 生成随机的请求头
headers = {'User-Agent': ua.random}

# 初始化一个列表来存储所有图片链接
all_urls = []

print('开始抓取')

# 遍历前10页
for page_num in range(1, 11):
    if page_num == 1:
        url = 'https://pic.netbian.com/new/'
    else:
        url = f'https://pic.netbian.com/new/index_{page_num}.html'
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, "html.parser")

    # 查找图片链接并将其附加到列表中
    ultag = soup.find('ul', class_='clearfix')
    litags = ultag.find_all('li')
    for litag in litags:
        imgurl = litag.find('a')['href']
        imgurl = 'https://pic.netbian.com' + imgurl
        all_urls.append(imgurl)

    # 休眠一段时间,避免给服务器造成过大压力
    time.sleep(1)
    print(f'获取了{page_num}页链接')

# 创建文件夹
parent_folder = "pic"
os.makedirs(parent_folder, exist_ok=True)

# 定义一个函数来保存图片
def save_image(url):
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, "html.parser")

    # 图片类型
    lotags = soup.find('div', class_="loaction")
    pictype = lotags.find_all('a')[1].text

    # 获取图片信息 名字 链接
    photomsg = soup.find('div', class_="photo")
    name = photomsg.find('h1').text
    imgurl = photomsg.find('a', id="img").find('img')['src']
    imgurl = 'https://pic.netbian.com'+imgurl

    # 创建文件夹
    sub_folder = pictype
    os.makedirs(os.path.join(parent_folder, sub_folder), exist_ok=True)

    # 发送请求
    response = requests.get(imgurl, headers=headers)
    # 检查请求是否成功
    if response.status_code == 200:
        # 清理文件名
        clean_name = ''.join(x for x in name if x.isalnum() or x in [' ', '.', '-'])
        # 保存图片
        with open(os.path.join(parent_folder, sub_folder, f"{clean_name}.jpg"), "wb") as f:
            f.write(response.content)
        print(f"图片已保存为{parent_folder}/{sub_folder}/{clean_name}.jpg")
    else:
        print("请求失败")

# 创建线程池 最多10个线程
with ThreadPoolExecutor(max_workers=10) as executor:
    # 提交任务
    for url in all_urls:
        executor.submit(save_image, url)

4.程序运行视频

 

https://v.youku.com/v_show/id_XNjM5ODUwNTM0OA==.html

 

5.本次实验遇到的困难、解决措施及心得体会

(1)问题一:在最初编写程序的时候,并没有安装好合适的库;

措施一:在网上搜索资料并请教了学长学姐进行解决,最后成功在Pycharm上安装了三个库。

(2)问题二:由于网络问题,爬虫时发生网络中断;

措施二:使用重试机制,当发生异常时自动重试。

6.课程总结与感想体会

首先,非常感谢王志强老师一个学期的倾情教导,细心地教授,不厌其烦地一次又一次解答同学们在学习中遇到的问题。尤其是结课时,送给我们的临别赠语,充满了对教学事业的热爱以及对同学们倾注的热情。

其次,我作为一名文科生对Python由最初的陌生与好奇变成了熟悉与喜爱,在学习这门课程前,我无法想象自己可以独立制作一个游戏或者进行爬虫,进步之大令人震惊。这门课不仅仅提高了我的动手操作能力,更是培养了我勇于探索、勤于动手、善于思考的精神。

再次,对于课程的建议是,增加学生自己动手操作的环节,拥有更多实践锻炼的机会。

接着,这是一门应用性极强的技术,帮助我方便日常生活,对于以后的工作也大有裨益。希望以后可以通过我学习的Python技术为人民服务、为社会与国家做出自己的贡献。

最后,再次感谢王志强老师。在未来的日子里我会继续学习Python知识,始终保持对未知世界的探索热情,希望有机会可以再参与王老师的课堂。

...全文
175 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
下载代码方式:https://pan.quark.cn/s/d5321a99c521 在信息技术网络架构领域,配置双块网卡于同一网络段内的静态路由是一项高级且具有实用价值的技术,其能够高效地管理和优化网络数据流,保障数据包能够沿最优路径传送,同时合理分配与控制内外网络资源的访问。本资料将详细阐述双块网卡同网络段静态路由的核心概念、配置机制及其应用实例。 ### 双块网卡同网络段静态路由概述 双块网卡同网络段静态路由指的是在一台主机上部署两个或更多网络接口卡(NICs),这些网卡可能接入同一个物理网络或不同的物理网络,但它们的IP地址归属于同一个网络段。在这种配置下,主机能够同时作为多个子网的成员,并通过静态路由表来引导数据包的传输路径。静态路由是由网络管理者手动设定的,它不依赖于动态路由协议,因而具备更高的稳定性和安全性。 ### 配置机制 在双块网卡同网络段静态路由的应用场景中,关键环节在于为各个网卡设定正确的默认网关与子网掩码,以及确立通往特定目标网络的静态路由条目。具体而言,每块网卡都必须拥有独立的IP地址和子网掩码,而默认网关则用于转发那些需要进入外部网络的数据包。此外,通过增设静态路由条目,可以明确指定某些特定目的地址的数据包应经由哪块网卡进行发送。 ### 实际操作流程 以下是从相关内容中总结出的实际操作流程: 1. **环境初始化**:确认两块网卡已正确安装,并配置了相应的IP地址与子网掩码。例如,一块网卡的IP地址为192.168.1.200,另一块为192.168.1.219,均属于192.168.1.0/24网络段。 2. **删除现有路由**:运用`routedelete 0.0.0.0`指令移除所有默认路由,以确保后续配置不会受到干扰。...

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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