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

课程:《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.程序运行视频

Python作业

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

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

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

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

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

6.课程总结与感想体会

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值