三国杀十周年壁纸抓取
三国杀壁纸抓取
创建时间:2024年3月5日
背景
在一段时间里,我沉迷于三国杀手游。为此,我特意找到了一个专门抓取壁纸的网站。
先看效果
抓取思路分析
首先肯定是先找到需要抓取的网站: https://www.sanguosha.com/msgs/mWallPaper
在页面上看到查看更多,然后使用F12 去查看这个翻页的规律
点击查看更多后可以看到是一个post的请求ajax
我们复制该地址在浏览器查看规律是不是我们想的那样?第二页就是在后面加一个cur/2
第3页就是在后面加一个cur/3
显示编码为utf-8.后续用到解析我们的title
修改为1的时候和不添加该参数的页面显示是一样的
修改为2,3,4的时候和不添加该参数的页面显示是不一样的,这个类似与一个json的东西,我们可以将保存下来然后进行提取链接和链接的名字。就可以拿到我们的图片了
随便在网上找一个工具 -----> https://www.json.cn/
查看下这个文本的数据能否是正常的。-----》观察我们可以得出该title需要编码格式去解析。
展现完整的代码
import json
import os
import urllib.request
from io import StringIO
from lxml import etree
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/115.0.0.0 Safari/537.36"}
folder = './sgs10th/'
URL = "https://www.sanguosha.com/msgs/mWallPaper"
start_page = 1
end_page = 7
if not os.path.exists(folder):
os.makedirs(folder)
for page in range(start_page, end_page + 1):
if page == 1:
request_first = urllib.request.Request(url=URL, headers=headers)
response = urllib.request.urlopen(request_first)
content_first = response.read().decode("utf-8")
num = 0
tree = etree.HTML(content_first)
# https_list = tree.xpath("/html/body/div[1]/div/div//@href")
https_list = tree.xpath("//div[@class='galary_wrapper']/a/@href")
# print(https_list)
for i in range(len(https_list)):
url = https_list[i]
num += 1
urllib.request.urlretrieve(url=url, filename=f"{folder}" + "00" + str(num) + ".jpg")
else:
url = URL + "/cur/" + str(page)
print(url)
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode("utf-8")
# print(content)
#
# with open(f"{folder}sgs10th.json", "w", encoding="utf-8") as file:
# file.write(content)
# json_file = json.load(open(f"{folder}sgs10th.json", "r", encoding="utf-8"))
# # print(json_file)
# for i in range(len(json_file)):
# https_data = json_file[i]["imgurl"]
# name = json_file[i]["title"].replace("*", "-")
# urllib.request.urlretrieve(url=https_data, filename=f"{folder}" + name + ".jpg")
json_file = StringIO()
json_file.write(content)
json_file.seek(0)
json_data = json.load(json_file)
for i in range(len(json_data)):
https_data = json_data[i]["imgurl"]
name = json_data[i]["title"].replace("*", "-")
urllib.request.urlretrieve(url=https_data, filename=f"{folder}" + name + ".jpg")
json_file.close()
下面我们的代码分段解释
0.参数、导包、地址
import json
import os
import urllib.request
from io import StringIO
from lxml import etree
headers = { # 请求头
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/115.0.0.0 Safari/537.36"}
folder = './sgs10th/' # 存储的文件夹
URL = "https://www.sanguosha.com/msgs/mWallPaper" # 抓取的URL地址
start_page = 1 # 开始页
end_page = 2 # 结束页
if not os.path.exists(folder): # 判断是否存在,不存在则创建
os.makedirs(folder)
1.页面1需要特殊处理
for page in range(start_page, end_page + 1):
if page == 1:
request_first = urllib.request.Request(url=URL, headers=headers) # 使用urllib请求,创建一个请求对象
response = urllib.request.urlopen(request_first)
content_first = response.read().decode("utf-8")
num = 0 # 编号
tree = etree.HTML(content_first) # 使用过etree解析
# https_list = tree.xpath("/html/body/div[1]/div/div//@href") # 也可使用
https_list = tree.xpath("//div[@class='galary_wrapper']/a/@href") # 使用xpath解析
# print(https_list) # 链接列表
for i in range(len(https_list)):
url = https_list[i]
num += 1
urllib.request.urlretrieve(url=url, filename=f"{folder}" + "00" + str(num) + ".jpg") # 抓取的保存在地址并取名字,使用urlretrieve下载数据
该页面是没有我们前面提到的ajax返回的文本,所以没有我们的标题。标题按照序号进行排序
2.其余ajax请求处理
else:
url = URL + "/cur/" + str(page)# 按照我们需要的页面进行的拼接链接
print(url)
request = urllib.request.Request(url=url, headers=headers) # 创建一 个请求对象
response = urllib.request.urlopen(request) # 使用请求对象取服务器请求资料
content = response.read().decode("utf-8") # 设置编码格式
# -------------------
# print(content)
#
# with open(f"{folder}sgs10th.json", "w", encoding="utf-8") as file:
# file.write(content) # 将文本内容保存到我们的json文件中
# json_file = json.load(open(f"{folder}sgs10th.json", "r", encoding="utf-8")) # 读取文件
# # print(json_file)
# for i in range(len(json_file)): # 找到地址链接进行访问下载
# https_data = json_file[i]["imgurl"]
# name = json_file[i]["title"].replace("*", "-")
# urllib.request.urlretrieve(url=https_data, filename=f"{folder}" + name + ".jpg")
#
# -------------------
json_file = StringIO()# 使用内存创建一个变量
json_file.write(content) # 写入内容
json_file.seek(0) # 指针到最前面,以便于后面进行处理
json_data = json.load(json_file) # 使用json库加载我们的数据
# print(json_data)
for i in range(len(json_data)):
https_data = json_data[i]["imgurl"]
name = json_data[i]["title"].replace("*", "-")
# print(name)
urllib.request.urlretrieve(url=https_data, filename=f"{folder}" + name + ".jpg")
json_file.close() # 关闭内存在用的变量
# -------------------------
序号之内可以相互替换,然后区别是一个是内存占用,一个是将文件先保存到本地的json文件格式后然后进行我们的链接处理,
3.结果
4.下载的图片和代码如下链接
链接:https://pan.baidu.com/s/10xbdimjtMgW-F46hugiizA?pwd=jixj
提取码:jixj
--来自百度网盘超级会员V6的分享
总结
这个抓取程序利用urllib.request.urlopen
来访问网页,并使用json来解析Ajax请求所返回的数据。此外,它还采用etree
解析库,结合XPath表达式,对网页内容进行高效提取。对于具体的数据文件,程序使用urllib.request.urlretrieve
进行下载。值得学习。