今天给大家介绍python如何虎牙小姐姐并制作心形照片墙,
有兴趣的小伙伴们一起来看看吧!
点击进去
卧槽,这颜值.....
i了i了
需求分析
我们的目标有5个,分别是小姐姐的
房间名称、封面照片、昵称、头像、直播间当前人数
网页分析
浏览器快捷键F12打开开发者模式,可以观察到当前页面120个小姐姐信息都在右边列表里面。
但是大家可以看看我标红处,这是一个非标准格式的json数据集,
所以要想获取到小姐姐的信息
先得获取到标准的数据集
发送请求
url = f'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=2168&tagAll=0&callback=getLiveListJsonpCallback&page={page}' headers = { 'cookie': '__yamid_tt1=0.17768755672559844; __yamid_new=C9662ED452B00001997340851CC8140B; game_did=j7Os0i0Txedw1cLUtP0vmKnalM1x65kO3rE; SoundValue=0.50; alphaValue=0.80; guid=0a42cb71a121c360e701bcfbbdfb20c9; udb_guiddata=b45f59af594a4e83cde65858; udb_anouid=1461170529732; isInLiveRoom=true; Hm_lvt_51700b6c722f5cf39906a596ea41f=1623400798,1624888823,1624928362; udb_passdata=3; __yasmid=0.17768755672559844; _yasids=__rootsid%3DC96BDFA246600001458617807F641C12; Hm_lpvt_51700b6c722f5bb4cf39906a596ea41f=1624928418; huya_web_rep_cnt=137', 'referer': 'https://www.huya.com/g/2168', 'user-agent': str(UserAgent().random) } try: resp = requests.get(url, headers = headers) print(resp.text)
去除非必要信息,构造标准json数据集
text = resp.text[25:-1] # 去除text格式前后无效字符 json_text = json.loads(text) # 转为标准json格式数据集 print(json_text)
接下来我们就可以获取小姐姐信息啦
room_name = item['roomName'] # 房间名称 cover_link = item['screenshot'] # 封面照片 nick = item['nick'] # 昵称 prof_phot = item['avatar180'] # 头像 view_num = item['totalCount'] # 直播间当前人数 print(room_name, cover_link, nick, prof_phot, view_num)
多页数据获取
小姐姐们直播大多集中在晚上,所以晚上爬取的数据有成千个,白天也就几百个,
不管你想获取多少,一个for循环就搞定啦
# 获取10页虎牙小姐姐 for page in range(1, 10+1) url = f'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=2168&tagAll=0&callback=getLiveListJsonpCallback&page={page}'
存入Excel
这里我们使用的是openpyxl来存储在Excel中
# 创建 ws = op.Workbook() wb = ws.create_sheet(index=0) wb.cell(row=1, column=1, value='房间名称') wb.cell(row=1, column=2, value='封面照片') wb.cell(row=1, column=3, value='昵称') wb.cell(row=1, column=4, value='头像') wb.cell(row=1, column=5, value='直播间当前人数') # ---------------------------------------- # 存储 wb.cell(row=count, column=1, value=room_name) wb.cell(row=count, column=2, value=cover_link) wb.cell(row=count, column=3, value=nick) wb.cell(row=count, column=4, value=prof_phot) wb.cell(row=count, column=5, value=view_num) ws.save('虎牙小姐姐.xlsx')
下载图片
重点来了,我要下载小姐姐美照了
for num, (pic_img, pic_name) in enumerate(save_pic): r = requests.get(pic_img) pic = r.content try: with open('./pictures/{}.jpg'.format(pic_name), 'wb') as fin: print(f'正在爬取第{count}张图片') fin.write(pic) print('{}.jpg----下载成功'.format(pic_name)) except: print('下载失败!')
然后就是这样
图片可视化
这么多好看的小姐姐我要给他们将摆它们成一个心形,这样才能表达我满满的爱意
# 设置心性图片矩阵 HEART = [[0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0]] # 定义相关参数 SIZE = 100 # 每张图片的尺寸,越大越清晰 N = 1 # 每个点位上放置1*1张图片 # 计算相关参数 width = np.shape(HEART)[1] * N * SIZE # 照片墙宽度 height = np.shape(HEART)[0] * N * SIZE # 照片墙高度 n_img = np.sum(HEART) * (N ** 2) # 照片墙需要的照片数 filenames = random.sample(os.listdir(save_path), n_img) # 随机选取n_img张照片 filenames = [save_path + f for f in filenames] print('宝宝开始集合!') # 绘制爱心墙 img_bg = Image.new('RGB', (width, height)) # 设置照片墙背景 i = 0 for y in range(np.shape(HEART)[0]): for x in range(np.shape(HEART)[1]): if HEART[y][x] == 1: # 如果需要填充 pos_x = x * N * SIZE # 填充起始X坐标位置 pos_y = y * N * SIZE # 填充起始Y坐标位置 for yy in range(N): for xx in range(N): img = Image.open(filenames[i]) img = img.resize((SIZE, SIZE), Image.ANTIALIAS) img_bg.paste(img, (pos_x + xx * SIZE, pos_y + yy * SIZE)) i += 1 # 保存图片 img_bg.save('love.jpg') print('宝宝集合完毕!')