Python爬虫 爬取超清壁纸代码实例
网站分析
在准备开始爬取壁纸之前,需要先分析目标网站。本例中我们使用的是Pixabay图库网站来进行数据爬取。
首先,我们打开目标网站,随后打开浏览器的开发者工具,选择 Network(网络)选项卡,刷新页面后看到已经加载好的资源。
在筛选后,我们可以找到查找数据的文件(XHR 类型),例如搜索图片时的请求数据 url 如下:/api/?key=<API key>&q=<搜索关键字>&image_type=photo&pretty=true&per_page=100&safesearch=true&order=latest&orientation=horizontal
。可以看到,请求参数很清晰地表示了需要获取哪些数据。
获取 API Key
为了访问 Pixabay API,你需要先注册一个账户并获取 API Key。在 这里 注册账户并创建一个 API Key。
安装依赖
接下来,需要先安装解析 JSON 格式数据的库——json
,以及用于请求数据和解析 HTML 页面的库——requests
和BeautifulSoup4
。在命令行中使用以下命令安装:
pip install requests beautifulsoup4
编写代码
下面贴上完整的 Python 代码,该代码会从 Pixabay API 获取高质量的图片,然后将其按照分类下载至本地,程序运行完毕后,将在程序所在的文件夹中生成按照分类组织好的壁纸文件夹。
import os
import requests
import json
from bs4 import BeautifulSoup
class PixabayScraper:
def __init__(self, key:str):
self.key = key
self.url = "https://pixabay.com/api/"
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
def search(self, query:str, category:str, per_page:int, save_path:str):
params = {
'key': self.key,
'q': query,
'category': category,
'image_type': 'photo',
'pretty': 'true',
'per_page': per_page,
'safesearch': 'true',
'order': 'latest',
'orientation': 'horizontal'
}
response = requests.get(url=self.url, headers=self.headers, params=params)
html = json.loads(response.text)
for image in html['hits']:
src = image['largeImageURL']
r = requests.get(src, headers=self.headers)
filename = os.path.join(save_path, src.split("/")[-1])
with open(filename, 'wb') as f:
f.write(r.content)
print("壁纸已保存:", filename)
def scrape(self, categories:list, queries:list, per_page:int, save_dir:str):
if not os.path.exists(save_dir):
os.makedirs(save_dir)
for category in categories:
category_dir = os.path.join(save_dir, category)
if not os.path.exists(category_dir):
os.makedirs(category_dir)
for query in queries:
query_dir = os.path.join(category_dir, query)
if not os.path.exists(query_dir):
os.makedirs(query_dir)
self.search(query=query, category=category, per_page=per_page, save_path=query_dir)
if __name__ == '__main__':
categories = ['backgrounds', 'nature', 'science', 'education', 'feelings', \
'health', 'people', 'religion', 'places', 'animals', 'industry', \
'food', 'computer', 'sports', 'transportation', 'travel', \
'buildings', 'business', 'music']
queries = ['ocean', 'holiday', 'sunrise', 'sunset', 'desert', 'beach', 'mountain', \
'skyline', 'cityscape', 'waterfall', 'underwater', 'wildlife', \
'landscape', 'architecture']
per_page = 20
save_dir = "wallpapers/"
api_key = '<Your Pixabay API Key>'
pixabay_scraper = PixabayScraper(key=api_key)
pixabay_scraper.scrape(categories=categories, queries=queries, per_page=per_page, save_dir=save_dir)
接下来我们详细讲解一下核心代码的实现:
首先是在 PixabayScraper 类中实现的 search 方法。该方法内部调用了爬取图片的 API,并下载图片至本地。使用 requests 库的 get 方法来获取 API 返回的 JSON 格式数据,并将其解析为 dict。接着,从数据中提取出图片的 URL,使用 requests 库下载图片并保存至本地。
def search(self, query:str, category:str, per_page:int, save_path:str):
params = {
'key': self.key,
'q': query,
'category': category,
'image_type': 'photo',
'pretty': 'true',
'per_page': per_page,
'safesearch': 'true',
'order': 'latest',
'orientation': 'horizontal'
}
response = requests.get(url=self.url, headers=self.headers, params=params)
html = json.loads(response.text)
for image in html['hits']:
src = image['largeImageURL']
r = requests.get(src, headers=self.headers)
filename = os.path.join(save_path, src.split("/")[-1])
with open(filename, 'wb') as f:
f.write(r.content)
print("壁纸已保存:", filename)
接下来是 PixabayScraper 类中实现的 scrape 方法。该方法包含了对图片类别和图片关键字的遍历,以获取所有图片。最后,将遍历结果按照图片类别和关键字来组织存放。
def scrape(self, categories:list, queries:list, per_page:int, save_dir:str):
if not os.path.exists(save_dir):
os.makedirs(save_dir)
for category in categories:
category_dir = os.path.join(save_dir, category)
if not os.path.exists(category_dir):
os.makedirs(category_dir)
for query in queries:
query_dir = os.path.join(category_dir, query)
if not os.path.exists(query_dir):
os.makedirs(query_dir)
self.search(query=query, category=category, per_page=per_page, save_path=query_dir)
示例说明
示例一:按关键字下载壁纸
我们可以通过传入一个关键字来下载相关的壁纸。例如,我们输入关键字 "beach"
,那么程序将会自动下载所有与海滩相关的壁纸。
if __name__ == '__main__':
categories = ['backgrounds', 'nature', 'science', 'education', 'feelings', 'health', 'people', 'religion', 'places', 'animals', 'industry', 'food', 'computer', 'sports', 'transportation', 'travel', 'buildings', 'business', 'music']
queries = ['beach']
per_page = 20
save_dir = "wallpapers/"
api_key = '<Your Pixabay API Key>'
pixabay_scraper = PixabayScraper(key=api_key)
pixabay_scraper.scrape(categories=categories, queries=queries, per_page=per_page, save_dir=save_dir)
示例二:按类别下载壁纸
我们也可以按照壁纸的类别进行下载。例如,我们输入壁纸类别 category "nature"
,那么程序将会自动下载所有与自然景观相关的壁纸。
if __name__ == '__main__':
categories = ['nature']
queries = ['ocean', 'holiday', 'sunrise', 'sunset', 'desert', 'beach', 'mountain', 'skyline', 'cityscape', 'waterfall', 'underwater', 'wildlife', 'landscape', 'architecture']
per_page = 20
save_dir = "wallpapers/"
api_key = '<Your Pixabay API Key>'
pixabay_scraper = PixabayScraper(key=api_key)
pixabay_scraper.scrape(categories=categories, queries=queries, per_page=per_page, save_dir=save_dir)
从以上两个示例中可以看出,PixabayScraper 类提供了十分灵活和方便的图片下载方式,可以根据设定的参数自定义下载内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫 爬取超清壁纸代码实例 - Python技术站