爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

从零构建王者荣耀数据爬虫:JAVA实战解析营地号API与数据可视化 本文详细介绍了如何使用JAVA构建王者荣耀数据爬虫,从API逆向分析到数据可视化全流程实战。涵盖营地号API解析、反爬策略应对、数据结构化处理及ECharts可视化实现,助力开发者高效获取和分析王者荣耀战绩数据。 阅读详情

概述

可关注微信订阅号 loak 查看实际效果。

代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码。

本文主要介绍以下内容:

  • 使用selenium 和 requests爬取王者荣耀官网、王者营地APP数据,使用BeautifulSoup和正则进行数据解析;
  • 爬取的IP代理使用了redis搭建的代理池;
  • 数据通过pymongo保存到Mongodb中,并且通过提供接口进行数据的查询与显示;
  • 项目运行日志记录功能logging;
  • centos服务器的定时任务;
  • 数据的查询与显示可通过订阅号进行方便的查询。

爬虫实现

跟上一篇博文类似,我们想要爬取某些数据,同样首先要分析网站、APP程序的页面,确定要爬取的元素->分析网站及元素的加载->抓取数据

  • 确定爬取的元素
    我们百度搜索王者荣耀,进入其官网,可以发现有一个下拉选项“英雄资料”,地址为:https://pvp.qq.com/web201605/herolist.shtmlweb201605/herolist.shtml , 在这里我们可以看到所有英雄。
    点击某个英雄,进入详情页面,我们可以发现官网有对该英雄的简介、技能、加点、出装、铭文的推荐。所以我们可以确定这些内容可以从这里进行爬取。再进行分析“王者营地”APP(博主分析时,版本为:3.44.204),选择 战绩->游戏工具->英雄榜,我们可以看到该APP对实时数据的显示,主要包括了上下中辅野的热度、胜率、登场率、ban率、技能、出装、铭文、克制、被克制的内容。
    通过上面的分析,确定了在王者官网爬取英雄的铭文、出装、技能,在王者营地APP爬取 热度、胜率、登场率、ban率、克制、被克制

  • 分析网站及元素的加载

  • 抓取数据
    通过以上的分析,我们直接可以编写代码了。为了简单,王者荣耀官网数据的抓取,直接使用chrome selenium,而王者营地的则采用request模块。
    官网爬取某一英雄详细信息:

    def get_one_hero_detail(hero_url, gok_hero):
       proxy = get_proxy()
       chrome_options.add_argument('--proxy-server=http://' + proxy)
       browser.get(hero_url)
    
       tmp1 = wait.until(
           EC.presence_of_element_located(
               (By.XPATH, '/html/body/div[3]/div[2]/div/div[2]/div[1]/div[2]/p[1]/span'))).text
       tmp2 = browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[2]/div[1]/div[2]/p[3]/span').text
       gok_hero.skill = ['主:' + tmp1, '副:' + tmp2]
    
       zh_skill = browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[2]/div[1]/div[2]/p[5]/span').text
       gok_hero.zh_skill = zh_skill
    
       mingwen1 = browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[1]/div[3]/div[2]/ul/li[1]/p[1]/em').text
       mingwen2 = browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[1]/div[3]/div[2]/ul/li[2]/p[1]/em').text
       mingwen3 = browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[1]/div[3]/div[2]/ul/li[3]/p[1]/em').text
       gok_hero.mingwen = [mingwen1, mingwen2, mingwen3]
    
       browser.implicitly_wait(5)
       builds = browser.find_elements_by_xpath('//*[@id="Jname"]')
       list_tmp = []
       for item in builds:
           list_tmp.append(item.get_attribute("innerHTML"))
       gok_hero.first_build = list_tmp[:6]
       gok_hero.second_build = list_tmp[6:12]
    
       time.sleep(1)
       return gok_hero
    

    王者营地APP根据位置爬取数据及解析的代码:

    all_hero_msg = []
    
    
    def get_hero_rank(lu):
        retry_count = 5
        proxy = get_proxy()
        while retry_count > 0:
            try:
                # 获取英雄列表
                proxies = {
                    "http": "http://" + proxy
                }
                data_tmp = gok_interface_log['post_data_20190623']
                data_tmp.update({'position': lu})
                herohtml = requests.post(url=gok_interface_log['post_url_20190623'],
                                         data=data_tmp,
                                         proxies=proxies).text
                return herohtml
            except urllib.error.URLError as e:
                if isinstance(e.reason, socket.timeout):
                    retry_count -= 1
                    if retry_count == 2:
                        # 出错3次, 删除代理池中代理
                        delete_proxy(proxy)
                        proxy = get_proxy()
            except Exception as e:
                log.logger.error('get_hero_rank爬取失败!' + str(e)+lu)
                if retry_count == 3:
                    delete_proxy(proxy)
                    proxy = get_proxy()
        return None
    
    
    def parse_hero_rank(rank_data, version, position):
        rank_data = ast.literal_eval(rank_data)
        hero_rank_list = str(rank_data.get('data').get('list'))[1:-1]
        hero_items = ast.literal_eval(hero_rank_list)
        for item in hero_items:
            gok = GokClass()
            gok.version = version
            gok.day = gok_config['GOK_INSERT_TIME']
            gok.heroid = item['heroId']
            gok.heroname = item['heroInfo'][0]['heroName']
            gok.herotype = position  # 英雄走哪路
            gok.herotypename = item['heroInfo'][0]['heroCareer']
            gok.tRank = item['tRank']
            gok.winpercent = item['winRate']
            gok.gameactpercnt = item['showRate']
            gok.banRate = item['banRate']
            all_hero_msg.append(gok)
    

    为了不报错,请各位还是直接查看仓库的完整代码吧~~

redis维护IP代理池

可以查看上一篇博文,里面有完整的操作。https://blog.youkuaiyun.com/luoz_java/article/details/92741358

pymongo

mongodb的可视化,我发现了一款很好的工具,就是 robo3t ,百度搜索即可,免费版的。
官网地址:https://docs.mongodb.com/
pymongo的操作主要为以下内容:

  • 创建集合
 #!/usr/bin/python3
  
 import pymongo
  
 client = pymongo.MongoClient(mongo_config['MONGO_URL'])
 db = client[mongo_config['MONGO_DB']]

在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

  • 判断集合是否已存在
 #!/usr/bin/python3
  
 import pymongo
  
 client = pymongo.MongoClient(mongo_config['MONGO_URL'])
 db = client[mongo_config['MONGO_DB']]
 collist = db. list_collection_names()
 if "sites" in collist:   # 判断 sites 集合是否存在
   print("集合已存在!")
  • 插入集合

    • insert_one()
    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
    search_set = db[mongo_config['USER_FIND_TYPE']]
    tmp = search_set.insert_one({'user_id': user_id, 'game_type': type})
    # insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
    print(tmp.inserted_id) # 5b2369cac315325f3698a1cf
    if tmp:
        return 'success'
    return None
    
    • insert_many()
    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
        search_set = db[mongo_config['USER_FIND_TYPE']]
        mylist = [
      { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
      { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
      { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
      { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
      { "name": "Github", "alexa": "109", "url": "https://www.github.com" }
    	]
     
    x = search_set.insert_many(mylist)
    	 
    # 输出插入的所有文档对应的 _id 值
    print(x.inserted_ids)
    # [ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]
    # insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。
    
    • 插入指定 _id 的多个文档
    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
    search_set = db[mongo_config['USER_FIND_TYPE']]
        mylist = [
    	  { "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"},
    	  { "_id": 2, "name": "Google", "address": "Google 搜索"},
    	  { "_id": 3, "name": "Facebook", "address": "脸书"},
    	  { "_id": 4, "name": "Taobao", "address": "淘宝"},
    	  { "_id": 5, "name": "Zhihu", "address": "知乎"}
    	]
    	 
    x = mycol.insert_many(mylist)
    	 
    # 输出插入的所有文档对应的 _id 值
    print(x.inserted_ids)
    # [1, 2, 3, 4, 5]
    
  • 查询

    • find_one()
    • find()
    • 查询指定字段的数据
    • 根据指定条件查询
    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
    mycol = mydb[mongo_config['USER_FIND_TYPE']]
    
    x = mycol.find_one()
    
    list_col = mycol.find()
    
    # 将要返回的字段对应值设置为 1
    # 除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
    for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
    	print(x)
    
    # 同时指定了 0 和 1 则会报错
    for x in mycol.find({},{ "name": 1, "alexa": 0 }):
    	print(x)
    
    # 根据条件查找
    mydoc = mycol.find_one({'user_id': user_id, 'game_type': type})
    
    • 高级查询
      与或非,与不用说了。下面说或、非
      limit()
      排序
    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
    mycol = mydb[mongo_config['USER_FIND_TYPE']]
    
    # 或
    x = mycol.find_one({"$or": [{"name": hero_another_name}, {"another1": hero_another_name}]})
    
    # 非
    # 读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^R"} :
    x = mycol.find({ "name": { "$regex": "^R" } })
    
    # $in,常用于判断列表name是否存在luozheng元素
    x = mycol.find_one({"name": {'$in':['luozheng']}})
    
    # $regex,也可以写正则
    # 适用于匹配,如果字段a的值为'abc',如果我们想知道name的值是否包含‘b’,可以这样做find({'name':{'$regex':'b'}})
    x = mycol.find_one({"name": {'$regex':['luo']}})
    
    
    # limit()
    myresult = mycol.find().limit(3)
    
    # 同时指定了 0 和 1 则会报错
    for x in mycol.find({},{ "name": 1, "alexa": 0 }):
    	print(x)
    
    # sort  升序:pymongo.ASCENDING ( 1 ) 、 降序:pymongo.DESCENDING ( -1 )
    mydoc = mycol.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])
    
  • 更新
    update_one()
    update_many()

    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
    mycol = mydb[mongo_config['USER_FIND_TYPE']]
    
    # update_one 该方法第一个参数为查询的条件,第二个参数为要修改的字段。
    mycol.update_one({ "alexa": "10000" }, { "$set": { "alexa": "12345" } })
    
    # 实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123:
    myquery = { "name": { "$regex": "^F" } }
    newvalues = { "$set": { "alexa": "123" } }
     
    x = mycol.update_many(myquery, newvalues)
    
  • 删除
    delete_one()
    delete_many()
    drop()

    #!/usr/bin/python3
     
    import pymongo
     
    client = pymongo.MongoClient(mongo_config['MONGO_URL'])
    db = client[mongo_config['MONGO_DB']]
    mycol = mydb[mongo_config['USER_FIND_TYPE']]
    
    # delete_one
    mycol.delete_one({ "name": "Taobao" })
    
    # delete_many
    myquery = { "name": {"$regex": "^F"} }
    
    x = mycol.delete_many(myquery)
    
    # delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档
    x = mycol.delete_many({})
    
    # 删除集合
    # 如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。
    mycol.drop()
    

日志记录功能

参照博文: https://www.cnblogs.com/nancyzhu/p/8551506.html

  • 介绍
    logging提供了一组便利的函数,用来做简单的日志。它们是 debug()、 info()、 warning()、 error() 和 critical()。

    默认等级是WARNING,这意味着仅仅这个等级及以上的才会反馈信息,除非logging模块被用来做其它事情。
    logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适用性描述如下(以严重程度递增排序):

级别何时使用
DEBUG详细信息,一般只在调试问题时使用。
INFO证明事情按预期工作。
WARNING某些没有预料到的事件的提示,或者在将来可能会出现的问题提示。例如:磁盘空间不足。但是软件还是会照常运行。
ERROR由于更严重的问题,软件已不能执行一些功能了。
CRITICAL严重错误,表明软件已不能继续运行了。
  • 代码实例
import logging
from logging import handlers

class Logger(object):
 level_relations = {
     'debug':logging.DEBUG,
     'info':logging.INFO,
     'warning':logging.WARNING,
     'error':logging.ERROR,
     'crit':logging.CRITICAL
 }#日志级别关系映射

 def __init__(self,filename,level='info',when='D',backCount=3,fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
     self.logger = logging.getLogger(filename)
     format_str = logging.Formatter(fmt)#设置日志格式
     self.logger.setLevel(self.level_relations.get(level))#设置日志级别
     sh = logging.StreamHandler()#往屏幕上输出
     sh.setFormatter(format_str) #设置屏幕上显示的格式
     th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount,encoding='utf-8')#往文件里写入#指定间隔时间自动生成文件的处理器
     #实例化TimedRotatingFileHandler
     #interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
     # S 秒
     # M 分
     # H 小时、
     # D 天、
     # W 每星期(interval==0时代表星期一)
     # midnight 每天凌晨
     th.setFormatter(format_str)#设置文件里写入的格式
     self.logger.addHandler(sh) #把对象加到logger里
     self.logger.addHandler(th)
if __name__ == '__main__':
 log = Logger('all.log',level='debug')
 log.logger.debug('debug')
 log.logger.info('info')
 log.logger.warning('警告')
 log.logger.error('报错')
 log.logger.critical('严重')
 Logger('error.log', level='error').logger.error('error')         

centos服务器的定时任务

编辑定时任务:crontab -e
查看定时任务:crontab -l
如果是命令需要先后执行,可以使用 &&
如果是后台运行并且多命令,记得先运行命令在nohup。
例如以下是先杀进行,在启动进程:

  #定时重启服务
  2 0 * * * ps -ef | grep wxWeb.py | grep -v grep | awk '{print $2}' | xargs kill -9
  4 0 * * * cd /home/LOLGokSpider/Web && nohup /home/LOLGokEnv/bin/python /home/LOLGokSpider/Web/wxWeb.py > /home/LOLGokSpider/Web/wxRun.log 2>&1 &

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

app抓包-突破【单向证书验证&代理检测&模拟器检测】 问题描述:app抓包存在证书校验,常规抓包拦截网卡无法获取到数据,而证书校验分为单项证书校验,和双向证书校验。在终端模拟器执行下面命令,这里注意模拟器的版本选择7.1,9.0的版本SDK不兼容。2.科来协议分析,可以获取模拟器进程的网络通讯信息,目标通讯的ip地址。3.封包监听工具,同科来一致,监听的进程即可获取到服务器腾通讯ip信息。1.模拟器开启本地以太网代理,设置端口,bp监听以太网系统端口即可。开启外部代理工具,取消本地代理,密码为空,代理类型选择https。2.模拟器内改变配置,尝试突破。 阅读详情

相关推荐

Python如何爬取《王者荣耀盒子》APP_python 爬取王者荣耀盒子对战数据(2)

运行平台WindowsPython版本Python3.xIDE什么是Fiddler?Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一。它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是web调试的利器。利用可以设置代理的这个特点,我们就可以对手机APP进行抓包了。怎么设置?不急不急,让我先把Fiddler安装上吧!

2301_82244514的博客 1200

python 王者营地查询战绩api

python相关学习资料:https://edu.51cto.com/video/4102.htmlhttps://edu.51cto.com/video/1158.htmlhttps://edu.51cto.com/video/3832.htmlPython 王者营地查询战绩API开发指南 作为一名刚入行的开发者,...

weixin_36053084的博客 4761

​说了你可能不信,这是一份王者荣耀接口文档

文章目录 前言 使用说明 王者荣耀相关接口 一、英雄列表接口 二、英雄列表接口(2) 三、装备接口 四、召唤师技能接口 五、铭文接口 六、英雄详细资料,语音接口 七、英雄壁纸接口 前言 有的同学在学习中需要使用到一些接口做实验,既然是实验,那我们就要用最厉害的,于是乎,我整理了一份接口文档​给大家使用。本文档仅供参考和学习​使用。 要问这些接口怎么来的,别问,问就是F12. 使用说明 ​小编也是一名王者荣耀的老手,非常喜欢这款游戏,既然喜欢,那就要了解它的全部,于是找到

大家一起学编程(python) 3万+

小白通过Fiddler爬取手机app的数据并提取出来(详细版)

我们就以爬取安卓端上的王者营地上英雄热度榜为例: 前期准备工作:下载安装Fiddler,并配置好相关连接选项 1.下载: https://www.telerik.com/fiddler,进入网站点击Download now 再填写好相关信息,点击红色的Download for Windows,即可完成下载。 2.安装 基本是往下点就行,确定好安装路径即可。 这里,我是选择在我的E盘 3.配...

weixin_41098099的博客 2万+

使用Python爬虫抓取游戏网站玩家数据、成绩和排名

通过本篇文章,我们展示了如何使用 Python 编写一个爬虫抓取游戏网站上的玩家数据、成绩和排名。我们使用了 Scrapy 和 Selenium 等工具来应对静态和动态页面的抓取需求,并讲解了如何通过设置反爬虫机制来绕过常见的限制。最后,我们还介绍了如何存储数据并进行简单的分析与可视化,为进一步的数据挖掘奠定基础。

2201_76125261的博客 1235

python+re正则表达式匹配指定10位整数 \ 小数 \ 整数

python+re正则表达式匹配整数和小数 re匹配整数可指定位数 re匹配小数

weixin_42636075的博客 2363

【Python实战】Python采集王者最低战力信息

王者新赛季马上就要开始了,大家都开始冲榜了,准备拿一个小省标,那么,本文,就来练习获取各地最低战力的爬虫采集实战。确定好我们的目标网址之后,我们要找到我们需要的数据源,通过开发者工具分析,我们不难发现其数据地址。

z099164的博客 1823

基于python王者荣耀脚本

基于python的王者荣耀自助脚本,供大家学习交流使用。

实现动态封禁 IP,干死爬虫

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。完成以上步骤后,重新加载 nginx,配置便开始生效了。3、动态配置,可以手工或者通过某种自动化的方式设置 Redis 中的黑名单。Nginx 配置,其中。

m0_57472099的博客 739

小程序源码:最牛王者荣耀装逼神器助手

这是一款以王者荣耀为主的一款装逼生成工具 支持王者营地战绩DIY生成(支持新旧两种营地版本) 支持王者荣耀游戏首页DIY制作生成 支持王者荣耀个人主页界面DIY制作生成 支持天梯界面DIY制作生成 另外还有王者贴图,壁纸那些等等功能组合而成的 另外支持多种流量主模式,比如激励视频,插屏广告,banner等等

vaptcha手势验证码逆向分析:从行为识别到轨迹模拟的完整实战

验证码是网络安全中常见的人机识别机制,其核心原理在于区分人类用户与自动化脚本的交互行为。行为验证码通过分析用户操作过程中的轨迹、速度、加速度等生物特征来提升安全性,这为自动化测试和爬虫开发带来了技术挑战。其技术价值在于平衡安全性与用户体验,广泛应用于登录、注册、防刷等关键业务场景。本文聚焦于vaptcha手势验证码,深入剖析其前端加密逻辑与行为模拟的对抗策略。通过结合网络抓包和AST(抽象语法树)分析,逆向出数据加密流程,并利用轨迹生成算法模拟人类滑动特征,最终实现自动化绕过。文章提供了从环境搭建、逆向分析

weixin_33721427的博客 357

JAVA根据营地号获取王者荣耀数据(王者荣耀战绩及王者荣耀对局详情查询)网页源码下载

根据营地号获取王者荣耀数据,并对数据进行解析处理(战绩及对局详情查询)

云下的你 1万+

Nexus3国内高速下载指南:多版本全平台资源汇总

本文针对国内开发者从官网下载Nexus 3速度慢、易失败的问题,提供了详尽的解决方案。汇总了Windows、Linux、macOS等多个平台的Nexus 3历史及最新版本(如3.31.1)的国内高速下载链接,并附有版本选择建议与Linux环境下的快速启动指南,帮助用户高效获取和部署这一流行的仓库管理工具。

jwt8token的博客 436

Python爬取王者荣耀盒子APP数据:从抓包到数据分析实战

网络爬虫是数据采集的核心技术,其原理是通过模拟客户端请求与服务器进行通信,从而获取结构化数据。在移动互联网时代,APP数据抓取成为重要的数据来源,其技术价值在于能够获取网页端不易获得或未公开的实时、结构化数据。对于游戏行业而言,玩家行为数据、英雄使用率、装备搭配等信息的分析,是进行用户画像、运营策略优化和内容创作的基础。通过抓包工具(如Charles)分析APP的HTTP/HTTPS接口,理解其请求参数、签名(Sign)和令牌(Token)机制,是技术实现的关键。本文以热门游戏《王者荣耀》的第三方数据聚合平

weixin_33046983的博客 358

vue 插件vue-awesome-swiper实现 三张图片,左右两边显示一半的效果的示例

希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~

weixin_50450473的博客 3256

zabbix6.0.4拓扑图链路显示流量

1. 背景介绍 网络流量监控是网络管理员必备功课,以前研究cacti的weathermap插件,网络流量大小和拥塞情况一清二楚,随着cacti的没落,weathermap插件也不能再继续使用,此时就需要学习了解新的替代方案。 经过研究和实际测试,发现zabbix的拓扑图有这个功能。 以下验证了zabbix的拓扑图显示线路流量的功能。 2. Zabbix 6显示拓扑图流量过程 选择监测-拓扑图 点进Local ne...

u013930899的博客 8489

用技术手段找王者隐藏战绩,求帮忙

在线急,帮忙成功给红包

m0_70149312的博客 1万+

爬虫面试:关于爬虫破解验证码的13个经典面试题

​解释:验证码是一种用于区分人类用户和自动化程序(如爬虫)的技术,通常通过显示图形、文字或音频等方式,要求用户完成特定任务(如识别扭曲的字母、点击特定区域等)。​作用:防止恶意爬虫滥用网站资源、进行批量注册、登录破解等行为,保护网站的安全性和数据的完整性。

数据知道的博客 1万+

Python爬虫实战:从王者荣耀盒子抓取对战数据的技术解析

网络爬虫作为数据采集的核心技术,通过模拟浏览器行为与服务器交互获取结构化信息。其工作原理基于HTTP协议,通过解析请求响应实现数据提取。在技术价值层面,爬虫能够自动化获取公开数据,为个人数据分析、趋势研究提供基础。在应用场景上,常见于竞品分析、市场研究和个人数据复盘等场景。本文以王者荣耀对战数据抓取为例,深入探讨了如何通过分析数据接口、处理反爬机制来构建稳定爬虫。其中涉及requests库的请求模拟和JSON数据解析等关键技术点,并强调了在数据抓取过程中需遵循合规性原则,合理控制请求频率。

weixin_30621959的博客 388

YOLO26优化:AAAI2026 | 融合PartialNet Block的C3k2-YOLO高效目标检测网络 | 轻量化涨点设计

PartialNet Block 结合YOLO26的C3k2模块,进行二次创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 597

Mac版 Android Studio自带模拟器无法联网解决方案

前言 作为一枚安卓开发者,免不了使用模拟器来开发调试(毕竟它比手机方便太多)。但是因为适配需要,我们会更多的使用真机开发调试,那么当模拟器遇到这样那样的问题,我们往往会无从下手,其中最烦的就是网络问题。 我最近图方便,又重新用起了模拟器,但是发现联网失败,用模拟器内置的浏览器也打不开网页,于是百度上一通找,毫无效果,各种说用cmd命令行设置模拟器dns的都没用,显示没有什么dns文件啥的,后来...

陈万洲的专栏 1万+

王者营地 Token获取:从 SSL Pinning 绕过到 Frida 动态插桩

文章摘要 本文记录了通过Frida动态插桩技术绕过王者营地App的SSL Pinning防护,成功抓取英雄战力数据接口的技术过程。作者首先尝试使用Fiddler和HttpCanary抓包失败,发现应用采用了SSL Pinning技术拦截中间人攻击。随后选择Frida方案,详细介绍了环境搭建步骤,包括安装frida-tools、部署frida-server到手机设备、处理权限问题等关键环节。通过这一系列技术操作,最终成功获取了王者荣耀官方战力查询接口所需的UserID和Token参数,为后续调用官方API获取

yxn4065的博客 1163

3060台式机 Ubuntu 双系统部署 LingBot-Map 完整指南

摘要: 本文详细介绍了在配备RTX 3060显卡的台式机上部署Ubuntu双系统并安装LingBot-Map 3D重建模型的完整流程。LingBot-Map作为蚂蚁灵波科技开源的Transformer架构模型,在流式3D场景重建中展现出高效性能(20 FPS)和卓越精度(ATE仅6.42米)。指南涵盖关键准备步骤、UEFI分区原理、Ubuntu安装流程(推荐150GB空间及手动分区方案),以及后续驱动配置说明,特别强调RTX 3060需12GB显存支持,并提供了数据备份、Secure Boot处理等实用建议

huanghm88的专栏 315
上一篇: 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据
下一篇: 关于7-10月的总结及2019年技能大赛回顾
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值