Python 爬取 3 万条游戏评分数据,找到了程序员最爱玩的游戏(附代码)

本文主要是介绍Python 爬取 3 万条游戏评分数据,找到了程序员最爱玩的游戏(附代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文爬取了游戏网站上所有可见的游戏评分数据进行分析,全文包括以下几个部分:
 

  • 数据获取
  • 数据总览
  • 游戏类型分析
  • 游戏平台分析
  • 游戏名称分析
  • 高分游戏汇总
  • 代码汇总



全文数据获取及分析均基于python3.6完成。

数据获取过程
 


页面内一条游戏数据展示如下,显示出来的一条评论是游戏的点赞数最多的评论,我们分析需要的数据包括游戏名称、游戏类型、游戏平台、游戏评分、游戏评价人数及最热评价。
 


浏览器中按F12打开开发者工具,选择NetWork-XHR,页面拉倒底部点显示更多,可以看到获取到的数据文件。
 


右键打开后看到是游戏的信息,通过改变网址中more后面的数字,可以获取更多数据。但尝试之后发现,每次可以获取20条数据,more后面的数字最大可以设置为500,超过500后获取不到数据,也就是说最多能获取10000条数据,但底部total字段显示总的游戏数据有52049条。
 


所以为了获取更多数据,我们分类型爬取数据,每次选中一个类型,重复上述过程,可以得到数据,观察后发现每个类型下的游戏数据都不超过10000条,这样每个类型的数据都能全部获取,最后把所有数据拼到一起即可。
 


以动作类游戏为例:

多尝试几次之后能看出规律:genres后面是游戏类型,动作类型对应的genres=1,platforms后面是平台类型,q后面的是游戏名称关键字,sort后面是排序方式,默认是按评分排序,more后面是页码。

所以我们需要知道每个游戏类型对应的数字,可以在开发者工具中选Element,用小箭头进行定位,快速获取所有游戏类型对应的数字:
 


定位后发现,每种类型包含在一个class内,动作类型对应的数字在values里。
 


依次点开每个class,获取每个类型对应的数字,整理如下:

{1:"动作",5:"角色扮演",41:"横版过关",4:"冒险",48:"射击",32:"第一人称射击",2:"策略",18:"益智",7:"模拟",3:"体育",6:"竞速",9:"格斗",37:"乱斗/清版",12:"即时战略",19:"音乐/旋律"}

之后就可以用python中的request+json包循环获取数据了,代码附在最后。爬到的一条游戏数据样式如下:
 


需要的数据包括:
 

  • n_ratings:评分人数
  • platforms:平台
  • rating:评分
  • star:星级
  • title:游戏名称
  • content:最热评论



游戏类型因为已经我们已经分类型爬取,所以每次爬完之后用代码加上对应的类型即可,但能看到一个游戏可能对应多种类型,或者在多个平台上同时发布,所以在后面的分析中需要处理,其他字段分析中用不到。

数据总览

最终爬下来数据有31574条,还是没拿到所有5万条,这已经是最大可见数据条数了,数据样式如下:
 


genres是网站上给的类型,type是爬取过程中加上去的类型,后文的分析都用type。

简单统计后发现,31574条数据中有17751条数据都是没有评分的,此外,由于一种游戏可能属于多个类别,所以一部分游戏是重复出现的,只有type不同。

首先对数据整体做一个统计描述,对于没有评分的数据采用两种方法处理,视为评分为0和删除数据。

视为评分为0时:
 


删除没有评分的数据:
 


两幅图的5个变量(从左往右、从上至下)均为:星级、评分、评分人数、游戏名称长度、游戏发行平台数,加入游戏名称长度和发行平台数是想探究游戏名称的长度以及发行的平台数是否和游戏评分有一定的关系。

从这两幅分布图能得到一些结论:
 

  • 星级(star)和评分(rating)是严格单调关系的,星级是分级靠档后的评分,所以之后的分析中只考虑星级不考虑评分。
  • 两种评分处理方法下,各变量的分布基本不变,大部分游戏评分集中在7.5左右,评分跟发行平台数、游戏名称长度关系不是非常明显。



游戏类型分析

各类型游戏数:

豆瓣给出的游戏共有15类,各类型游戏数统计如下:
 


动作、冒险、角色扮演、益智、策略类的游戏数量排到前5,第一人称射击、即时战略、音乐、乱斗/清版、射击类排到后5。

豆瓣把第一人称射击、射击分成两类,乱斗跟冒险、动作的区别似乎不是很大?这里不是很理解。

不过射击类的游戏模式太过单一,数量确实比较少,高质量的射击游戏不外乎这两年火起来的吃鸡游戏,还有很早之前的CS系列。
 


而动作、冒险、角色扮演类的游戏从世界观设定、剧情设计上都可以有很多新意,时不时会有一些让人眼前一亮的新作品,也很容易做成一个系列。
 


各类型游戏平均评分人数:

评分人数最多的是第一人称射击类游戏,冒险、即时战略类也较多。
 


各类型游戏均分:

各类型游戏的均分如下,无评分视为0时,由于各种游戏数量的差别,导致游戏数较少的类型平均分更高,但删掉无评分数据后,各种类型的评分基本是持平的,在7.5分上下波动。
 


总体来看,各种类型游戏的平均质量基本是一样的,只是各种类型的用户基数差别大一些。

游戏类型关联分析:

之前提到,一个游戏可能属于多个类别,比如仙剑同时属于角色扮演和冒险。对所有的游戏类别进行交叉分析,统计同时属于两个类别的游戏个数,结果如下:
 


可以看到,动作+冒险,角色扮演+动作/冒险、横版过关+动作/冒险、益智+冒险组合的游戏都是非常多的,动作、冒险大概是万能类别了。

音乐旋律、竞速类的游戏跟其他类别交叉几乎没有,这两种类型游戏形式比较单一,大部分都是拼手速操作,各种游戏同质性比较高。侠盗飞车是其中少有的融合了动作冒险的经典竞速类游戏,但当年玩罪恶都市的快感似乎跟竞速没啥关系。
 


游戏平台分析

游戏平台类型非常多,整体分为手机、电脑、游戏机三类,游戏机大部分是任天堂(Wii,GB)、索尼(PS)、微软(Xbox)的产品。
 


之前提到,一款游戏可能同时在多个平台上发布,这给分析过程带来了一定难度,观察后发现,豆瓣的平台分布是越靠前的平台越大众化,所以对于有多个平台的游戏,取第一个平台,视为他的主要发布平台进行分析。

各平台游戏数:

鉴于平台数太多,我们把所有游戏数目小于100的平台汇总,记为“其他”,各个平台游戏数分布如下:
 


PC游戏数超过总数的50%,除此外,大部分游戏在iphone,PS2,PS3上,没有Android的原因在于豆瓣上对于游戏平台把iphone放在Android前面,大部分手游是在这两个操作系统上同时发布的,之前的处理方法导致Android数目非常少归到了“其他”中去。

各平台均分:
 


删除无评分数据游戏后,各平台均分基本一致。其中均分最高的GB是任天堂1989年推出的Game Boy游戏机,GBA是任天堂2001年推出的Game Boy Advanced游戏机。你可能没有用过这两款设备,但当中的经典游戏你一定玩过。
 


各平台平均评分人数:
 


各平台评分总人数来说,PC占据绝对优势,但平均人均数来看,人数最多的是PS4和Nintendo Switch。

游戏名称分析

一个有意思的问题是,游戏都是怎样命名的呢?有没有什么规律?

爬取下来的游戏名称中大部分同时包含中文、英文,这里我们只分析中文,将所有游戏名称拼到一起用正则提取其中的中文,去掉长度为1的词,和词频小于10的词,对剩下的高频词按词频做词云如下:
 


词语能反映出游戏的世界观,大部分的游戏会用到战争、战士、传奇、联盟、幻想这样一些虚构的有奇幻色彩的词语,同时也不乏三国、火影等等一些源于历史、动漫、小说、电影作品的词。还有一些开门见山直接说明游戏形式的词语,比如迷宫、格斗、大战、足球等等。

高分游戏汇总

对游戏的整体分析只是统计分析的需要,但对一个游戏迷来说,只需要告诉他哪些游戏好就ok了,不好的游戏并不关注,我们提取所有游戏中评分超过9.5的部分,游戏类型分布如下:
 


考虑到评分人数太少时,手机号出售平台评分结果不一定具有代表性,所以我们只选择其中评分人数超过100的部分,共84款游戏汇总如下,看看有没有你玩过or你想玩的呢?


代码汇总

爬虫代码:
 

  1. # -*- coding: utf-8 -*-
  2. import urllib
  3. import requests
  4. from fake_useragent import UserAgent
  5. import json
  6. import pandas as pd
  7. import time
  8. import datetime
  9. import os
  10. # 发送get请求
  11. """
  12. genres : 游戏类别
  13. n_ratings: 评分人数
  14. platforms: 平台
  15. rating : 评分
  16. content : 最热评论
  17. star : 星数
  18. title : 游戏名称
  19. """
  20. def getDoubanGame(genres):
  21.     id_all1 = {1:"动作",5:"角色扮演",41:"横版过关",4:"冒险",48:"射击",32:"第一人称射击",
  22.     2:"策略",18:"益智",7:"模拟",3:"体育",6:"竞速",9:"格斗",37:"乱斗/清版",12:"即时战略",
  23.     19:"音乐/旋律"}
  24.     comment_api = 'https://www.douban.com/j/ilmen/game/search?genres={}&platforms=&q=&sort=rating&more={}'
  25.     headers = { "User-Agent": UserAgent(verify_ssl=False).random}
  26.     response_comment = requests.get(comment_api.format(genres,1),headers = headers)
  27.     json_comment = response_comment.text
  28.     json_comment = json.loads(json_comment)
  29.     col = ['name','star','rating','platforms','n_ratings','genres','content']
  30.     dataall = pd.DataFrame()
  31.     num = json_comment['total']
  32.     print('{}类别共{}个游戏,开始爬取!'.format(id_all1[genres],num))
  33.     i = 0
  34.     while i < num:
  35.         if i == 0:
  36.             s = 1
  37.         else:
  38.             s = json_comment['more']
  39.         response_comment = requests.get(comment_api.format(genres,s),headers = headers)
  40.         json_comment = response_comment.text
  41.         json_comment = json.loads(json_comment)        
  42.         n = len(json_comment['games'])
  43.         datas = pd.DataFrame(index = range(n),columns = col)
  44.         for j in range(n):        
  45.             datas.loc[j,'name'] = json_comment['games'][j]['title']
  46.             datas.loc[j,'star'] = json_comment['games'][j]['star']
  47.             datas.loc[j,'rating'] = json_comment['games'][j]['rating']
  48.             datas.loc[j,'platforms'] = json_comment['games'][j]['platforms']
  49.             datas.loc[j,'n_ratings'] = json_comment['games'][j]['n_ratings']
  50.             datas.loc[j,'genres'] = json_comment['games'][j]['genres']
  51.             datas.loc[j,'content'] = json_comment['games'][j]['review']['content']
  52.             i += 1
  53.         dataall = pd.concat([dataall,datas],axis = 0)
  54.         print('已完成 {}% !'.format(round(i/num*100,2)))
  55.         time.sleep(0.5)
  56.     dataall = dataall.reset_index(drop = True)
  57.     dataall['type'] = id_all1[genres]
  58.     return dataall
  59. id_all = {"动作":1,"角色扮演" :5,"横版过关" :41,"冒险" :4,"射击": 48,"第一人称射击":32,
  60. "策略":2,"益智":18,"模拟":7,"体育":3,"竞速":6,"格斗":9,"乱斗/清版":37,"即时战略":12,"音乐/旋律":19}
  61. id_all1 = {1:"动作",5:"角色扮演",41:"横版过关",4:"冒险",48:"射击",32:"第一人称射击",
  62. 2:"策略",18:"益智",7:"模拟",3:"体育",6:"竞速",9:"格斗",37:"乱斗/清版",12:"即时战略",
  63. 19:"音乐/旋律"}
  64. for i in list(id_all.values()):
  65.     dataall = getDoubanGame(i)
  66.     filename = '游戏类别_' + id_all1[i] +'.xlsx'
  67.     filename = filename.replace('/','')
  68.     dataall.to_excel(filename)
复制代码


数据总览:

  1. dataall['n_platforms'] = dataall.platforms.apply(lambda x:len(str(x).split('/')))
  2. dataall['platform'] =  dataall.platforms.apply(lambda x:str(x).split('/')[0].strip())
  3. sns.pairplot(dataall,diag_kind = 'kde')   
  4. plt.show()
  5. data2 = dataall.dropna()
  6. sns.pairplot(data2,diag_kind = 'kde')   
  7. plt.show()
复制代码


游戏类型分析:

  1. """
  2. 各类型游戏分析
  3. """
  4. # 各类型游戏数
  5. num = len(dataall.name.unique())
  6. result = dataall.groupby('type').count()['name'].reset_index().sort_values('name',ascending = False)
  7. attr = list(result.type)
  8. v  = list(np.round(result.name/num,3))
  9. pie = Pie()
  10. style = Style()
  11. pie_style = style.add(
  12.     label_pos="center",
  13.     is_label_show=True,
  14.     label_text_color=None,
  15.     is_legend_show = False
  16. )
  17. pie.add("",[attr[0],"其他"],[v[0],1-v[0]],radius=[18, 24],center = [10,20],**pie_style)
  18. pie.add("",[attr[1],"其他"],[v[1],1-v[1]],radius=[18, 24],center = [30,20],**pie_style)
  19. pie.add("",[attr[2],"其他"],[v[2],1-v[2]],radius=[18, 24],center = [50,20],**pie_style)
  20. pie.add("",[attr[3],"其他"],[v[3],1-v[3]],radius=[18, 24],center = [70,20],**pie_style)
  21. pie.add("",[attr[4],"其他"],[v[4],1-v[4]],radius=[18, 24],center = [90,20],**pie_style)
  22. pie.add("",[attr[5],"其他"],[v[5],1-v[5]],radius=[18, 24],center = [10,50],**pie_style)
  23. pie.add("",[attr[6],"其他"],[v[6],1-v[6]],radius=[18, 24],center = [30,50],**pie_style)
  24. pie.add("",[attr[7],"其他"],[v[7],1-v[7]],radius=[18, 24],center = [50,50],**pie_style)
  25. pie.add("",[attr[8],"其他"],[v[8],1-v[8]],radius=[18, 24],center = [70,50],**pie_style)
  26. pie.add("",[attr[9],"其他"],[v[9],1-v[9]],radius=[18, 24],center = [90,50],**pie_style)
  27. pie.add("",[attr[10],"其他"],[v[10],1-v[10]],radius=[18, 24],center = [10,80],**pie_style)
  28. pie.add("",[attr[11],"其他"],[v[11],1-v[11]],radius=[18, 24],center = [30,80],**pie_style)
  29. pie.add("",[attr[12],"其他"],[v[12],1-v[12]],radius=[18, 24],center = [50,80],**pie_style)
  30. pie.add("",[attr[13],"其他"],[v[13],1-v[13]],radius=[18, 24],center = [70,80],**pie_style)
  31. pie.add("",[attr[14],"其他"],[v[14],1-v[4]],radius=[18, 24],center = [90,80],**pie_style)
  32. pie.render('各类型游戏数.html')
  33. # 各类型游戏均分
  34. c_schema= [( "乱斗/清版",10),
  35.            ( "体育",10),
  36.            ( "冒险",10),
  37.            ( "动作",10),
  38.            ( "即时战略",10),
  39.            ( "射击",10),
  40.            ( "格斗",10),
  41.            ( "模拟",10),
  42.            ( "横版过关",10),
  43.            ( "益智",10),
  44.            ( "竞速",10),
  45.            ( "第一人称射击",10),
  46.            ( "策略",10),
  47.            ( "角色扮演",10),
  48.            ( "音乐/旋律",10)]
  49. result1 = dataall.rating.fillna(0).groupby(dataall.type).mean().reset_index()
  50. result2 = dataall.rating.dropna().groupby(dataall.dropna().type).mean().reset_index()
  51. v1 = [result1.rating.apply(lambda x:round(x,1)).tolist()]
  52. v2 = [result2.rating.apply(lambda x:round(x,1)).tolist()]
  53. radar = Radar()
  54. radar.config(c_schema)
  55. radar.add("游戏均分(无评分视为0)", v1, is_splitline=True, is_axisline_show=True,is_label_show = True)
  56. radar.add("游戏均分(删除无评分)", v2, label_color=["#4e79a7"],item_color="#f9713c",is_label_show = True)
  57. radar.render('各类型游戏评分.html')
  58. # 各类型游戏评分人数
  59. result1 = dataall.n_ratings.fillna(0).groupby(dataall.type).mean().reset_index()
  60. result2 = dataall.n_ratings.dropna().groupby(dataall.dropna().type).mean().reset_index()
  61. attr = result1.type.tolist()
  62. v1 = np.round(result1.n_ratings.tolist(),1)
  63. v2 = np.round(result2.n_ratings.tolist(),1)
  64. line = Line()
  65. #line.add(x_axis = attr,y_axis = xaxis_type = 'category')
  66. line.add("包含无评分", attr, v1, mark_point=["max"],is_label_show = True)
  67. line.add("不包含无评分", attr, v2, is_smooth=True, mark_point=["max"],is_label_show = True,xaxis_rotate  = 30)
  68. line.render('各类型游戏-评分人数.html')
复制代码


游戏平台分析:

  1. """
  2. 游戏平台分析
  3. """
  4. # 各平台游戏数
  5. num = len(dataall.name.unique())
  6. result = dataall.groupby('platform').count()['name'].reset_index()
  7. name = result.platform.tolist()
  8. value = result.name.tolist()
  9. wordcloud = WordCloud(width=1300, height=620)
  10. wordcloud.add("", name, value, word_size_range=[20, 120])
  11. wordcloud.render('游戏平台.html')
  12. platforms = result.loc[result.name >100,'platform'].tolist()
  13. dataall.platform = dataall.platform.apply(lambda x:x if x in platforms else '其他')
  14. result = dataall.groupby('platform').count()['name'].reset_index().sort_values('name',ascending = False).reset_index(drop = True)
  15. attr = result.platform
  16. v1 = result.name
  17. pie = Pie('各平台游戏数',title_pos = 'center',title_text_size = 20)
  18. pie.add(
  19.     "",
  20.     attr,
  21.     v1,
  22.     radius=[40, 75],center = [50,60],
  23.     label_text_color=None,is_legend_show = False,
  24.     is_label_show=True
  25. )
  26. pie.render('各平台游戏数.html')
  27. # 各平台游戏评分人数
  28. result1 = dataall.n_ratings.fillna(0).groupby(dataall.platform).mean().reset_index()
  29. result2 = dataall.n_ratings.dropna().groupby(dataall.dropna().platform).mean().reset_index()
  30. attr = result1.platform.tolist()
  31. v1 = np.round(result1.n_ratings.tolist(),1)
  32. v2 = np.round(result2.n_ratings.tolist(),1)
  33. line = Line()
  34. #line.add(x_axis = attr,y_axis = xaxis_type = 'category')
  35. line.add("包含无评分", attr, v1, mark_point=["max"],is_label_show = True)
  36. line.add("不包含无评分", attr, v2, is_smooth=True, mark_point=["max"],is_label_show = True,xaxis_rotate  = 70)
  37. line.render('各平台游戏-评分人数.html')
  38. # 各平台游戏均分
  39. result1 = dataall.rating.fillna(0).groupby(dataall.platform).mean().reset_index()
  40. result2 = dataall.rating.dropna().groupby(dataall.dropna().platform).mean().reset_index()
  41. attr = result1.platform.tolist()
  42. v1 = np.round(result1.rating.tolist(),1)
  43. v2 = np.round(result2.rating.tolist(),1)
  44. line = Line()
  45. #line.add(x_axis = attr,y_axis = xaxis_type = 'category')
  46. line.add("包含无评分", attr, v1, mark_point=["max"],is_label_show = True)
  47. line.add("不包含无评分", attr, v2, is_smooth=True, mark_point=["max"],is_label_show = True,xaxis_rotate  = 70)
  48. line.render('各平台游戏-均分.html')
复制代码


游戏名称分析:
 

  1. """
  2. 标题分析
  3. """
  4. # 分词
  5. import re
  6. stopwords = open('中文停用词表(比较全面,有1208个停用词).txt','r').read()
  7. stopwords = stopwords.split('\n')
  8. texts = ''.join(dataall.name.tolist())
  9. texts =''.join(re.findall(r'[\u4e00-\u9fa5]',texts))
  10. result = jieba.cut(texts,cut_all=False)
  11. allwords = [word for word in result if len(word)>1 and word not in stopwords]
  12. result = pd.DataFrame(allwords)
  13. result.columns =['word']
  14. res = result.word.groupby(result.word).count()
  15. res.index.name = 'text'
  16. res = res.reset_index()
  17. res = res.loc[res.word >= 10].reset_index(drop = True)
  18. # 标题词云
  19. name = res.text.tolist()
  20. value = res.word.tolist()
  21. wordcloud = WordCloud(width=1300, height=620)
  22. wordcloud.add("", name, value, word_size_range=[10, 80])
  23. wordcloud.render('游戏名称高频词.html')
复制代码


高分游戏汇总:
 

  1. """
  2. 高rating游戏分析
  3. """
  4. data1 = dataall.loc[dataall.rating>=9.5]
  5. result = data1.groupby('type').count()['name'].reset_index().sort_values('name',ascending = False).reset_index(drop = True)
  6. attr = result.type
  7. v1 = result.name
  8. pie = Pie('9.5分以上游戏',title_pos = 'center',title_text_size = 20)
  9. pie.add(
  10.     "",
  11.     attr,
  12.     v1,
  13.     radius=[40, 75],center = [50,60],
  14.     label_text_color=None,is_legend_show = False,
  15.     is_label_show=True
  16. )
  17. pie.render('高评分游戏-分类型.html')
  18. data1['title'] = data1.name.apply(lambda x:str(x).split(':')[0].split(' ')[0])
  19. # 9.5以上评分,评分人数超过1000
  20. result = data1.loc[data1.n_ratings >= 100,['name','genres','content','platforms','rating','n_ratings']].drop_duplicates().reset_index(drop = True)
  21. result = result.sort_values(by = ['n_ratings','genres'],ascending = False).reset_index(drop = True)
  22. result.to_excel('评分9.5以上游戏.xlsx')

这篇关于Python 爬取 3 万条游戏评分数据,找到了程序员最爱玩的游戏(附代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/317559

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意