首页 > 其他分享 >三国杀十周年壁纸抓取

三国杀十周年壁纸抓取

时间:2024-12-05 14:32:19浏览次数:5  
标签:https 十周年 url request 抓取 urllib json file 壁纸

三国杀壁纸抓取

创建时间: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进行下载。值得学习。

标签:https,十周年,url,request,抓取,urllib,json,file,壁纸
From: https://www.cnblogs.com/suifeng2000/p/18588516

相关文章

  • 怎么禁止爬虫对网站信息的抓取?
    完全阻止爬虫抓取网站信息是不可能的,但你可以采取一些措施来增加难度,减缓爬虫的速度,或引导爬虫抓取你希望它们抓取的内容。以下是一些前端开发可以采取的措施:1.robots.txt:这是最基本也是最重要的步骤。robots.txt文件位于网站的根目录,告诉搜索引擎和爬虫哪些页面可以抓取,哪些......
  • 爬虫—CrawlSpider 结合 Selenium实现抓取目录页url 并通过 url 进一步抓取每章内容
    1.环境准备首先,确保安装了所需的依赖:pipinstallscrapyscrapy-seleniumselenium然后,你需要下载与Chrome浏览器匹配的ChromeDriver,并将其路径添加到系统的环境变量中。或者,你可以在代码中指定Selenium驱动程序的路径。2.配置ScrapySettings在settings.py......
  • 如何禁止百度爬虫抓取网站?
    从前端开发的角度来看,完全阻止百度爬虫或任何搜索引擎爬虫是不可能的。前端代码对所有人可见,包括爬虫,因此任何基于前端的解决方案都可以被绕过。真正的爬虫控制是通过服务器端配置(例如robots.txt和元标签)完成的。然而,前端技术可以与服务器端方法结合使用,以增强对爬虫行为的控......
  • 公共政策和法律法规数据抓取:基于Python爬虫技术抓取政府网站上的政策法规与最新更新
    引言在现代社会,公共政策和法律法规是社会运行的基础,政府网站成为了传播政策法规、更新法律信息的重要平台。随着政策变化和法律法规的更新,准确获取这些信息对于政府、企业、学者、甚至普通公民来说,都具有重要意义。为了有效抓取政府网站上的政策法规及其最新更新信息,爬虫技术......
  • 使用Python爬虫抓取跑步和健身平台上的运动数据
    引言随着科技的不断进步,越来越多的人开始关注健康生活,跑步和健身成为许多人日常生活的一部分。为了帮助人们更好地追踪自己的运动数据,许多健身平台如NikeRunClub、Strava、Keep等,提供了用户的跑步、健身记录,包括运动时长、距离、卡路里消耗、步频等详细数据。这些数据对运动......
  • Python 爬虫实战:抓取百科网站上某个词条的详细信息
    目录一、前言二、爬虫前准备1.安装必备库2.确定目标网站和词条三、静态页面抓取:使用requests和BeautifulSoup1.发送HTTP请求2.解析HTML页面3.提取更多内容四、抓取动态加载页面数据:使用Selenium1.安装并配置Selenium2.使用Selenium抓取页面内容3......
  • webview2抓取返回数据
    webview2设置过滤器//进行网址过滤//webView.CoreWebView2.AddWebResourceRequestedFilter("http://test.com:8080/xx",CoreWebView2WebResourceContext.All);webView.CoreWebView2.WebResourceResponseReceived+=CoreWebView2_WebR......
  • Python 爬虫:抓取视频平台上的弹幕数据
    在现代视频平台中,弹幕(也称为"弹幕评论")是一种用户参与互动的独特形式。观众可以在观看视频的同时,发送实时评论,这些评论以“弹幕”形式出现在视频上方。弹幕不仅是观众情感的表达,也是视频平台的一种社交互动形式。抓取视频平台上的弹幕数据,不仅可以分析用户的互动行为,还可以深入......
  • Elastic Stack抓取Nginx日志并展示
    ElasticStack抓取Nginx日志并展示实现目标Nginx定义Json格式日志,方便后期处理Beats抓取nginx产生的日志输出到LogstashLogstash将日志输出到Elasticsearch使用Kibana中的devtools工具对日志做统计并使用看板展示相关日志组件部署图使用jmeter制造数据Elasticsearc......
  • 使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据
    我是做汽车行业的,可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容,分析各种电动汽车口碑数据。之前,我写过很多Python网络爬虫的案例,使用requests、selenium等技术采集数据,这次尝试去采集小米SU7在微博、汽车之家上的舆论数据,分析下小米SU7的口碑到底怎么样,用户关心和吐槽......