课程:《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知识,始终保持对未知世界的探索热情,希望有机会可以再参与王老师的课堂。