python爬取newbing每日壁纸
1、研究网页结构
本次爬取的网站是:https://bing.wdbyte.com/zh-cn/
这个链接好像不是newbing壁纸的官方,但其中每天也会更新newbing的壁纸。
1.1、分析网页结构
通过研究可以发现,网页上的图片链接都是有固定形式的,所以可以考虑使用正则表达式的方式筛选出这些链接。
1.2、写正则表达式
正则表达式的主要功能就是进行模式匹配,给定一定形式的字符串,在大量文本中挑选出符合要求的字符串。
通过点击不同的图片,可以发现这些链接的特点是:首位都是固定的,不同之处进在于中间部分ID=的值不一样。据此可以设定如下匹配模式:
pattern = re.compile(r'https://cn\.bing\.com/th\?id=.*?\.jpg&rf=LaDigue_UHD\.jpg&pid=hp&w=3840&h=2160&rs=1&c=4')
且这些链接都是嵌入在<a href> (a标签且有href属性的)。
2、完整代码
代码共有两个文件:①get_picture_link.py和②download_picture.py。
第一个文件是通过网页,利用正则表达式筛选出所有图片下载链接,第二个文件实在第一个文件的基础上,根据得到的图片链接,依次下载所有图片。
get_picture_link.py
# 获得所有图片的链接,并写入Link.txt文档中
import time
import requests
import random
from bs4 import BeautifulSoup
import re
from datetime import datetime, timedelta
agent_list = [
"Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"
]
header = {'User-Agent': random.choice(agent_list)}
# 获取每张图片的链接
def get_link(url):
# 图片链接的正则化表达式
pattern = re.compile(r'https://cn\.bing\.com/th\?id=.*?\.jpg&rf=LaDigue_UHD\.jpg&pid=hp&w=3840&h=2160&rs=1&c=4')
res = requests.get(url, headers=header)
soup = BeautifulSoup(res.content, 'html.parser')
# 存储匹配到的链接
matches = []
# 链接都在<a>标签的href属性中
a_tags = soup.find_all('a', href=True) # 首先找到存在href的所有a标签
# 遍历所有的<a>标签
for tag in a_tags:
# 获取href属性
href = tag['href']
# 使用正则表达式查找匹配的链接
if pattern.search(href):
matches.append(href)
# 链接写入文本
with open('links.txt', 'a') as file:
# 遍历所有匹配的链接
for match in matches:
# 将每个链接写入文件,并添加换行符
file.write(match + '\n')
print("链接已存储到links.txt文件中!")
if __name__ == "__main__":
urls = []
# 设置爬取的起始-结束日期,代码中起止时间为2023.2-2024.11
start_date = datetime(2023, 2, 1)
end_date = datetime(2024, 12, 1)
# 当前日期
current_date = start_date
# 循环直到当前日期超过结束日期
while current_date <= end_date:
# 格式化日期为字符串
date_str = current_date.strftime('%Y-%m')
urls.append("https://bing.wdbyte.com/zh-cn/" + date_str)
# 将当前日期增加一个月
current_date += timedelta(days=31) # 这种方法简单但不精确,因为月份天数不同
for u in urls:
get_link(u)
time.sleep(1)
download_picture.py
# 通过Link.txt文本下载所有的图片
import requests
def download_picture(link_s, i_s):
# 发送GET请求
responses = requests.get(link_s)
# 检查请求是否成功
if responses.status_code == 200:
# 打开一个文件用于写入
with open(f'wallpaper/image{i_s}.jpg', 'wb') as file:
# 将图片数据写入文件
file.write(responses.content)
print(f"图片{i_s}下载成功")
else:
print(f"图片{i_s}下载失败,状态码:", responses.status_code)
if __name__ == "__main__":
links = []
with open('links.txt','r') as files:
for link in files:
links.append(link)
for index, i in enumerate(links):
if index == 50: # 这里只下载了50张,如果想全部下载,可以把条件限制语句删除
break
else:
download_picture(i, index+1)
整个文件目录结构如图所示,如果缺少相关文件记得先创建。
3、运行流程
先运行get_picture_link.py文件,生成一个包含所有图片链接的link.txt文件,再运行download_picture.py文件,下载所有图片到wallpaper文件中。
4、通过API下载newbing每日壁纸
该API由网站API - 每日必应壁纸 - DailyBing.com提供。
调用该API的代码集成在文件today_wallpaper.py文件中。运行该文件后,会在桌面生成当天的newbing壁纸文件。(如果运行出错,注意修改文件路径)
API的具体参数可查看该网站根据个人需要修改。
# 通过API下载每日图片
import requests
import random
from datetime import datetime
agent_list = [
"Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"
]
header = {'User-Agent': random.choice(agent_list)}
# 获取当前日期和时间
now = datetime.now()
# 只保留年、月、日
current_date = now.strftime('%Y-%m-%d')
# API的URL
api_url = 'https://dailybing.com/api/v1/UHD'
# 发送GET请求
response = requests.get(api_url, headers=header)
# 检查请求是否成功
if response.status_code == 200:
# 获取壁纸文件的内容
p_content = response.content
# 将壁纸文件内容保存到文件,根据需要修改地址
with open(f'D:\desktop\{current_date}.jpg', 'wb') as file:
file.write(p_content)
else:
print("请求失败,状态码:", response.status_code)