要想创建一个动态壁纸网站,那么动态壁纸就是灵魂!
目前主流的动态壁纸网站没有几个,今天我分析一下元气桌面网站的动态壁纸:https://bizhi.cheetahfun.com/dn/d/
首先导入包:
import requests
import re
import MySQLdb
然后分析一下网站:
通过每个分类的url得知,‘c1d’是风景分类,‘c2d’是动漫分类,其他的分类依次是:‘c3d’,‘c4d’......
防止反爬规则,我们写入:
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'
}
命名一个变量:category_dict,里面写入所有的分类:
# 请求URL获取分类
category_dict = {
'1': '风景',
'2': '动漫',
'3': '美女',
'6': '动物',
'5': '明星',
'4': '游戏',
'7': '科幻',
'10': '小清新',
'11': '其他'
}
新建for循环:
for page in range(start, end):
category_dict1 = f'https://bizhi.cheetahfun.com/dn/c{page1}d/p{page}' + category_dict[category_id]
category1 = requests.get(url=category_dict1, headers=headers).text
# print(category1)
href = re.findall(r'<a target="_blank" href="(.*?)" title="(.*?)" data-classify-id="(.*?)" data-image-id="(.*?)".*?>', category1)
# print(href)
然后给代码增加输入效果:
start = int(input("开始页数:")) # 这里写要爬取的初始页面
end = int(input("结束页数:")) # 这里写要终止爬取的页面
category_id = input("分类翻页:") # 这里写category_dict中分类对应的数字,如:1,2,3,6......
page1 = int(input("分类:")) # 这里写category_dict中分类对应的数字,如:1,2,3,6......
现在,我们只是获得了该分类页面下的所有视频网页,如:https://bizhi.cheetahfun.com/dn/pd345388.html
新建for循环,目的是为了将每一个动态壁纸的链接提取出来:
for h in href:
img = re.findall(r'https://([^"]*)', h[0])
print('https://' + img[0])
新建for循环,为了将每一个动态壁纸的视频与名字提取出来:
for link in list_img:
response = requests.get(link, headers=headers).text
# print(response)
pattern = re.findall(r'<video id="myVideo".*? src="(.*?)".*?></video>', response)
name = re.findall(r'<div class="relative mb-3 float-left".*? alt="(.*?)".*?></div>', response)
# print(name)
接下来,我们新建两个数组:
# 新建数组
list_img = []
list_mp4 = []
# 保存到数组里面
list_img.append('https://' + img[0])
list_mp4.append(name + pattern)
现在所有的视频链接与名字都可以提取出来啦!
需要将内容存储到数据库中:
# 连接到 MySQL 数据库
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='user')
# 创建游标
cursor = conn.cursor()
# 创建数据表
# 如果要想更改分类,就把数据表修改名字,重新创造一个数据表
try:
cursor.execute("CREATE TABLE images (name VARCHAR(255), mp4_url VARCHAR(255))")
except:
pass
for link in list_img:
response = requests.get(link, headers=headers).text
name = re.findall(r'<div class="relative mb-3 float-left".*? alt="(.*?)".*?></div>', response)[0]
pattern = re.findall(r'<video id="myVideo".*? src="(.*?)".*?></video>', response)[0]
cursor.execute("SELECT * FROM images WHERE name=%s AND mp4_url=%s", (name, pattern))
if cursor.fetchone() is not None:
print(f'Skipping duplicate: {name}')
else:
cursor.execute("INSERT INTO images VALUES (%s, %s)", (name, pattern))
print(f'Saved: {name}')
# 提交更改
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()
完整代码如下:
import requests
import re
import MySQLdb
# PS:爬取多页运行速度很慢,可以调整一下软件的内存与运行内存
# 连接到 MySQL 数据库
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='user')
# 创建游标
cursor = conn.cursor()
# 创建数据表
# 如果要想更改分类,就把数据表修改名字,重新创造一个数据表
try:
cursor.execute("CREATE TABLE images (name VARCHAR(255), mp4_url VARCHAR(255))")
except:
pass
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'
}
# 请求URL获取分类
category_dict = {
'1': '风景',
'2': '动漫',
'3': '美女',
'6': '动物',
'5': '明星',
'4': '游戏',
'7': '科幻',
'10': '小清新',
'11': '其他'
}
start = int(input("开始页数:")) # 这里写要爬取的初始页面
end = int(input("结束页数:")) # 这里写要终止爬取的页面
category_id = input("分类翻页:") # 这里写category_dict中分类对应的数字,如:1,2,3,6......
page1 = int(input("分类:")) # 这里写category_dict中分类对应的数字,如:1,2,3,6......
list_img = []
list_mp4 = []
for page in range(start, end):
category_dict1 = f'https://bizhi.cheetahfun.com/dn/c{page1}d/p{page}' + category_dict[category_id]
category1 = requests.get(url=category_dict1, headers=headers).text
# print(category1)
href = re.findall(r'<a target="_blank" href="(.*?)" title="(.*?)" data-classify-id="(.*?)" data-image-id="(.*?)".*?>', category1)
# print(href)
for h in href:
img = re.findall(r'https://([^"]*)', h[0])
list_img.append('https://' + img[0])
for link in list_img:
response = requests.get(link, headers=headers).text
# print(response)
pattern = re.findall(r'<video id="myVideo".*? src="(.*?)".*?></video>', response)
name = re.findall(r'<div class="relative mb-3 float-left".*? alt="(.*?)".*?></div>', response)
list_mp4.append(name + pattern)
# print(name)
for link in list_img:
response = requests.get(link, headers=headers).text
name = re.findall(r'<div class="relative mb-3 float-left".*? alt="(.*?)".*?></div>', response)[0]
pattern = re.findall(r'<video id="myVideo".*? src="(.*?)".*?></video>', response)[0]
cursor.execute("SELECT * FROM images WHERE name=%s AND mp4_url=%s", (name, pattern))
if cursor.fetchone() is not None:
print(f'Skipping duplicate: {name}')
else:
cursor.execute("INSERT INTO images VALUES (%s, %s)", (name, pattern))
print(f'Saved: {name}')
# 提交更改
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()
程序的缺点就是爬下来的动态壁纸只有十秒时间!并且运行很慢!!!
PS:4K动态壁纸不要爬!!!