description
本次大作业分组(1-2人)完成一个应用程序,不限于网络爬虫与信息提取、Python游戏、云端系统、数据分析与展示等领域。请每位同学在线完成大作业文章(文档),每份文档应用包含小组共同的工作和个人工作。其中,共同工作应包含内容:整体设计目标、分工说明,代码总体框架、第三方库介绍(下载地址)、软件环境配置及运行指导说明、软件运行截图、完成度自我评价等;个人工作应包含内容:自已完成的关键代码及说明、效果和结论。请每位同学在在线文章页面上传小组源代码工程、录制视频(尽量控制30秒内)、PPT文件压缩包(小组内每位同学的附件大小应一样),并命名为“姓名学号.zip”,如***10301047.zip。压缩包请上传至北理网盘http://pan.bit.edu.cn, 搜索群组“软件工程基础训练”。
code
-
我的大作业最终决定选择学习一下爬虫,然后利用python语言编写爬虫程序自动下载图片素材网站pexels中的高清壁纸
-
首先打开网页https://www.pexels.com/
-
输入关键词wallpaper,点击搜索:
-
按下键盘上的F12,进入开发者工具,点击下图中菜单:
-
刷新网页,观察
-
很明显我们已经发现了其中的奥秘,选择其中一个
选中复制RequestURL,精简一下,就可以得到
https://www.pexels.com/search/4k%20wallpaper/?page=2
后面page的值决定了网页加载的数量
好了,我们已经得到url了
- 查看源代码,其中有不同清晰度的图片,我们找到清晰度最高的
- 那么我们现在要来获取源代码,然后使用正则表达式匹配得到所有的下载地址
- 因为直接使用request.get()无法的到经过服务器渲染的网页源代码,所以我们使用selenium这个库,贴心的链接
获取 - 接下来的工作就很简单了,看代码一目了然,由于我使用的python解释器是Anaconda3,使用到的库我都有,就没有安装,如果需要安装的话使用pip安装工具安装即可
'''
Author : 鱼香肉丝没有鱼
Date : 2021-11-19 23:37:46
LastEditors : 鱼香肉丝没有鱼
LastEditTime : 2021-11-23 06:51:26
'''
'''
使用python语言编写爬虫程序,批量自动下载免费图片素材网站pexels中高清壁纸
'''
# 需要使用的库都在下面了
# 我使用的解释器是Anaconda3,不需要另外安装
import requests
import re
import time
from selenium import webdriver
# 增加计时功能
start_time = time.time()
# 网址示例
# view-source:https://www.pexels.com/search/4k%20wallpaper/?page=6
urls = [
"https://www.pexels.com/search/4k%20wallpaper/?page={}".format(str(i)) for i in range(3, 7)]
# UAC伪装,防止被服务器识别
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
ua = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
# 存储下载地址的列表,初始化为空
list = []
# 预编译正则表达式
obj = re.compile(r'.*?data-big-src="(?P<src>.*?)"', re.S)
# 遍历每一个网址
for url in urls:
try:
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
web = webdriver.Chrome(options=options)
# 如果不使用上面三行代码直接使用下面这行会报错
# web = webdriver.Chrome()
web.get(url)
time.sleep(8) # 让浏览器休息8s,防止网速太慢延迟高造成错误
# 由于这个动态加载的网页,使用selenium获取网页源代码
wb_resp = web.page_source # 返回源代码
# 把源代码写入文件保存
with open(r"C:\Users\Admin\Desktop\VScode\python\myhtml.html", mode="w", encoding='utf-8') as fp:
fp.write(wb_resp)
time.sleep(1)
# 打开的网页要及时关闭
web.close()
# 使用正则表达式在we_resp中匹配找到下载地址,并且返回一个可以迭代的对象
download_link = obj.finditer(wb_resp)
# 遍历这个迭代对象
for it in download_link:
tmpsrc = it.group("src")
# print(tmpsrc)#打印下载地址
# 把下载地址存储到列表中
list.append(tmpsrc)
# break#测试使用
except ConnectionError:
print("pass disappoint")
# 遍历所有的下载地址,下载每一张图片
for link in list:
# 其中的一个下载地址
# https://images.pexels.com/photos/1580271/pexels-photo-1580271.jpeg?auto=compress&cs=tinysrgb&h=750&w=1260
# 使用get方式来下载图片
image_resp = requests.get(link, headers=ua)
# 为了避免命名重复导致报错,使用其中的一直在变化的一串数字来作为文件名
tmp_image_name = link.split("?")[0]
image_name = tmp_image_name.split("/")[-1]
# 创建Bytes形式的图片文件,把数据写入图片文件中,保存在img文件中,打开方式为二进制写模式
with open(r"C:\Users\Admin\Desktop\VScode\python\img\\"+image_name, mode="wb") as f:
f.write(image_resp.content)
# 关闭
image_resp.close()
time.sleep(1)
# 结束时间
end_time = time.time()
# 持续时间 = 结束时间-开始时间
total_time = end_time - start_time
# 输出持续时间
print(total_time)
# 1319.1924061775208
程序运行时间:
1319.1924061775208
程序运行结束一共下载了151张图片
完
summary
- re正则表达式常用表达 https://blog.csdn.net/qq_41680771/article/details/121484908
- 使用selenium库时我使用的是chrome浏览器,记得要下载对应的浏览器驱动,还要下载和浏览器版本相同的驱动
驱动下载地址:http://npm.taobao.org/mirrors/chromedriver/
下载错了没有用哦