前言:
如今的高速网络极大促进了信息的展示方式,高清图片,视频等成就了我们的视听盛宴。但是,我们获取到的图片或者视频可能是被压缩过的,所以总体上还是有点小瑕疵,今天呢,我给大家带来一篇使用Python爬取著名高清图片网站500px图片的文章,这个爬虫具有搜索功能哦。让你感受摄影魅力!
通过这篇文章的学习,你将学会:
- 使用requests库发起请求
- 将requests请求结果转化为json类型
- 提取json类型的数据
- 写入图像类型文件
Python环境搭建可以参考这里
顺手牵羊:Python 环境搭建zhuanlan.zhihu.com整体流程图
实战:
- 安装使用 pip 工具 安装requests库
pip install requests
2.导入 rrequests库
import requests
3. json数据类型介绍
json是一种数据存储方式,它可以看做字典和列表的组合,列表可以是字典的值,字典可以是列表中的项目 一下例子可能会让你更容易理解
# json是一种数据存储方式,类python的字典,例如下面json_example={"name":"Mike",
"hoobby":["Ball","game"],
"address":[{"city":"New York"},{"street":"Center Street"}]
}
# 上面的json_example就是一个简单的json数据的实例
# 可以看到,json类型文件就是字典和列表的组合,列表可以是字典的值,字典
# 下面是获取指定数据的方法
name=json_example['name']
print(name)
# 输出: Mike
# 请注意下面的 0,这个0代表 adrress 这个 键 对应的值是一个列表
# 0代表列表的第一项,而第一项的键 city 所对于的值是New York,所以这样子可以获得city
city=json_example['address'][0]['city']
print(city)
# 输出 New York# 下面演示在不知道键名的情况下遍历json数据中所有内容
for i in json_example:print(i)
# 输出:hoobby address
爬取图片完整代码
import requests
# 接受搜索
key=input("请输入关键词:")pn=input("请输入要爬取的页数:")# input获取的输入是字符串格式,而我们想要的页数是整数,所以使用 int() 函数进行类型转换
# pn代表爬取的图片总页数
pn=int(pn)print('。。。。。。开始爬取。。。。。。')# 定义一个列表来存放图片地址
image_list=[]
# 利用循环,依次访问不同页码
for i in range(1,pn+1):print("。。。。。。正在提取第{}页。。。。。。".format(i))# 这个url是我通过浏览器开发者工具抓取的,对初学者来说难度有点大,建议直接使用就行# 传递页数和关键词即可使用# 如果想知道怎么获取,可以私信我,或者在评论区留言,我教你。url='https://api.500px.com/v1/photos/search?type=photos&term={}&image_size%5B%5D=1&image_size%5B%5D=2&image_size%5B%5D=32&image_size%5B%5D=31&image_size%5B%5D=33&image_size%5B%5D=34&image_size%5B%5D=35&image_size%5B%5D=36&image_size%5B%5D=2048&image_size%5B%5D=4&image_size%5B%5D=14&include_states=true&formats=jpeg%2Clytro&include_tags=true&exclude_nude=true&page={}&rpp=50'.format(key,i)# 通过requests库获的get方法访问图片所在页的地址# requests.get(url).json()表示将获得的访问结果转化为json类型image_json=requests.get(url).json()# print(requests.get(url).text)# 取消上面这句代码的注释,再仔细看看json实例介绍,你就知道下面为什么这么写了data=image_json.get('photos')for i in data:image_url=i.get('images')[8].get('url')# 把图片地址添加到之前列表中image_list.append(image_url)
# 定义一个变量来计算下载成功的图片个数,并且以它命名图片
count=0
for image in image_list:print("正在下载第{}张图片!".format(count+1))image_content=requests.get(image).content# wb表示以二进制的方式写入文件,w表示覆盖写,即创建新文件,或者覆盖之前同名的文件# b表示二进制方式写入,图片,视频等文件是二进制文件# "{}.jpg".format(count) 表示文件名,count是变量,下载过程中,文件名为:1.jpg , 2.jpg ... with open("{}.jpg".format(count),"wb") as f:f.write(image_content)# 每成功下载一张图片,count加1count=count+1print("成功下载第{}张图片!".format(count))print("全部图片下载完毕,图片路径与当前文件相同!")
爬取过程图片:
写在最后:
希望大家通过本文掌握前文提到的几个技能,有问题欢迎在评论区留言或者私信我