一个微博热搜引发的故事

  • 一、故事从这里开始
  • 二、搞事情第一步:搜集图片
  • 三、搞事情第二步:展示图片
  • 四、搞事情第三步:推广链接
  • 五、搞事情第四步:统计分析
    • 1.数据处理
    • 2.数据筛选
    • 3.统计各天的频率
    • 4.统计星座的频率
    • 5.统计月份的频率
    • 6.数据可视化(3个条形图)
  • 写在最后

一、故事从这里开始

3月29日那晚,我正在厕所蹲坑来着,大概就是边蹲边刷手机的那种…突然发现一条微博热搜#你出生那天的宇宙#
在评论区,发现大家都有一个同样的疑惑:无法访问NASA官网(可能是因为访问量过大,导致网络极高延时)。作为一个社会主义正直青年,我怎么能放着不管呢?
于是,我决定搞事情!!

二、搞事情第一步:搜集图片

一个简单的想法油然而生:既然大家没法从官网上下载图片,那我就帮大家集齐图片,然后发给大家就好啦。(搜集数据嘛,写个爬虫不就好了?)
于是,我直接冲进NASA官网准备分析一波请求。结果…好叭,我也是大家中的一员,我也加载不出图片。
这点困难我怎么能退缩呢,再于是,我就去微博评论下面苦苦寻找,果然功夫不负有心人,发现豆瓣上有个大佬已经为找齐了所有图片:
秉承“拿来主义”的作风,我决定这里就是我的数据源(某豆瓣相册)
简单分析了一下,发现可以通过一个m_start的参数进行翻页,每页20张图片(如m_start=0为第一页,m_start=20为第二页),那么写一个循环便可:

import re
import queue
import requests
import threading
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsheaders = {'Host': 'www.douban.com',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
'Sec-Fetch-Dest': 'document',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': 'bid=rb_kUqiDS6k; douban-fav-remind=1; _pk_ses.100001.8cb4=*; ap_v=0,6.0; __utma=30149280.1787149566.1585488263.1585488263.1585488263.1; __utmc=30149280; __utmz=30149280.1585488263.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __yadk_uid=HNoH1YVIvD2c8HrQDWHRzyLciFJl1AVD; __gads=ID=a1f73d5d4aa31261:T=1585488663:S=ALNI_MafqKPZWHx0TGWTpKEm8TTvdC-eyQ; ct=y; _pk_id.100001.8cb4=722e0554d0127ce7.1585488261.1.1585488766.1585488261.; __utmb=30149280.10.6.1585488263'
}# driver初始化
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)# 下载图片
def downimg():while not img_queue.empty():img = img_queue.get()img_name = img[0]url = img[1]res = requests.get(url)data =res.contentwith open('./img/%s.webp'%img_name,'wb') as f:f.write(data)print(img_name)# 网站参数
url_o = 'https://www.douban.com/photos/album/1872547715/?m_start=%d'# 爬取连接
img_queue = queue.Queue()
for i in range(0,21):url = url_o%(18*i)driver.get(url)es = driver.find_elements_by_class_name('photo_wrap')for e in es:img_e = e.find_element_by_tag_name('img')img_url = img_e.get_attribute('src')img_url = img_url.replace('photo/m/public','photo/l/public') # 替换为大图text_e = e.find_element_by_class_name('pl')img_date = text_e.textimg_queue.put((img_date,img_url))print('%d页爬取完成'%(i+1))
driver.close()# 下载图片
thread_list = []
N_thread = 5
for i in range(N_thread):thread_list.append(threading.Thread(target=downimg))
for t in thread_list:t.start()
for t in thread_list:t.join()

代码简单来说就是:webdriver访问页面并获取图片地址,然后通过多线程利用requests下载并保存图片。
至此,图片搜集的工作基本完成!

三、搞事情第二步:展示图片

有了图片,接下来就是如何让大家获得图片呢?去给每个人私发?机智的我当然不会这么干,我决定写一个小网页来让大家访问。作为很不专业的我,东平西凑,效果大概就是这样(你生日那天的宇宙):

四、搞事情第三步:推广链接

关于推广,咱也不懂,咱也不敢说。 傻傻的我决定自己发一条微博(心里大概是想:这么方便的工具,肯定会受大家欢迎的,肯定是这样没有错,对,没错…):
现实嘛,总是残酷的。吃瓜群众都猜到了:无人问津,石沉海底~
几经周折,最后呢在一位相关话题的热门博主的鼎力帮助下,最终迎来了一些流量:

五、搞事情第四步:统计分析

虽然这个流量跟我想象的还是相差甚远,毕竟这个话题也是有上亿的阅读量的,但是我还是决定对昨天访问的情况做一个简单的统计:

1.数据处理

在某度统计里拿到网页访问数据的原始csv表格后,进行了简单数据处理,调整为更方便读取的格式。

2.数据筛选

由于表格中并不仅仅包括NASA页面的数据,还有一些其他页面的数据,于是必须进行数据的筛选:

# 读取数据
data = pd.read_csv('./analyze/20200330-20200330.csv',encoding='utf-8')# 筛选数据(和NASA相关且有有效日期的数据)
data_NASA = []
for i in range(len(data)):url = urllib.parse.unquote(data['URL'][i])pv = data['PV'][i] # 浏览量uv = data['UV'][i] # 访客量#if url[-1] == '日' and 'NaN' not in url: # 为NASA访问页面if 'date=' in url and 'NaN' not in url:try:data_NASA.append((re.findall('date=(\d*?月\d*?日)',url)[0],pv,uv))except:pass

3.统计各天的频率

# 统计各个天数的频率
PV_map= {}
UV_map = {}
PV_total = 0
UV_total = 0
for d in data_NASA:if d[0] not in PV_map.keys():PV_map[d[0]] = 0UV_map[d[0]] = 0PV_map[d[0]] +=  d[1] # PVUV_map[d[0]] +=  d[2] # UVPV_total += d[1]UV_total += d[2]
for k in PV_map.keys(): # 计算频率PV_map[k] = PV_map[k]/PV_total*100UV_map[k] = UV_map[k]/UV_total*100
PVs= sorted(PV_map.items(),key=lambda x:x[1],reverse=True) # 排序
UVs= sorted(UV_map.items(),key=lambda x:x[1],reverse=True) # 排序

4.统计星座的频率

# 判断星座
def get_xingzuo(month, date):dates = (21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22)constellations = ("摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座")if date < dates[month-1]:return constellations[month-1]else:return constellations[month]# 统计各星座的频率
xingzuo = ("摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座")
xingzuo_map = {}
for x in xingzuo:xingzuo_map[x] = 0
xingzuo_total = 0
for d in data_NASA:month = int(re.findall('(\d*?)月(\d*?)日',d[0])[0][0])day = int(re.findall('(\d*?)月(\d*?)日',d[0])[0][1])x = get_xingzuo(month,day)#xingzuo_map[x] += d[1] # PVxingzuo_map[x] += d[2] # UVxingzuo_total += d[2]
for k in xingzuo_map.keys():xingzuo_map[k] = xingzuo_map[k]/xingzuo_total*100
xingzuos= sorted(xingzuo_map.items(),key=lambda x:x[1],reverse=True) # 排序

5.统计月份的频率

# 统计各月份的频率
month = [str(i)+'月' for i in range(1,13)]
month_map = {}
for m in month:month_map[m] = 0
month_total = 0
for d in data_NASA:m = d[0].split('月')[0]+'月'#month_map[m] += d[1] # PVmonth_map[m] += d[2] # UVmonth_total += d[2]
for k in month_map.keys():month_map[k] = month_map[k]/month_total*100
months= sorted(month_map.items(),key=lambda x:x[1],reverse=True) # 排序

6.数据可视化(3个条形图)

## 生日查询TOP10-按访客量UV
date = []
uv = []
for i in UVs:date.append(i[0])uv.append(i[1])
top10_date = date[:10]
top10_date.reverse()
top10_uv = uv[:10]
top10_uv.reverse()
fig, ax = plt.subplots() # 画图
b = plt.barh(top10_date,top10_uv,color='#6699CC') # 金色#FFFACD 银色#C0C0C0  橙色#FFA500 蓝色#6699CC
i = len(b)
for rect in b: # 画数值if i==3: # 第三名rect.set_facecolor('#FFA500') # 橙色if i==2: # 第二名rect.set_facecolor('#C0C0C0') # 银色if i==1: # 第一名rect.set_facecolor('#FFFACD') # 金色w = rect.get_width()ax.text(w, rect.get_y()+rect.get_height()/2, ' %.2f%%'%w,ha='left', va='center')i -= 1
plt.xticks([]) # 关掉横坐标## 星座查询排名
name = []
v = []
for i in xingzuos:name.append(i[0])v.append(i[1])
name.reverse()
v.reverse()
fig, ax = plt.subplots() # 画图
b = plt.barh(name,v,color='#6699CC') # 金色#FFFACD 银色#C0C0C0  橙色#FFA500 蓝色#6699CC
i = len(b)
for rect in b: # 画数值if i==3: # 第三名rect.set_facecolor('#FFA500') # 橙色if i==2: # 第二名rect.set_facecolor('#C0C0C0') # 银色if i==1: # 第一名rect.set_facecolor('#FFFACD') # 金色w = rect.get_width()ax.text(w, rect.get_y()+rect.get_height()/2, ' %.2f%%'%w,ha='left', va='center')i -= 1
plt.xticks([]) # 关掉横坐标## 月份查询排名
name = []
v = []
for i in months:name.append(i[0])v.append(i[1])
name.reverse()
v.reverse()
fig, ax = plt.subplots() # 画图
b = plt.barh(name,v,color='#6699CC') # 金色#FFFACD 银色#C0C0C0  橙色#FFA500 蓝色#6699CC
i = len(b)
for rect in b: # 画数值if i==3: # 第三名rect.set_facecolor('#FFA500') # 橙色if i==2: # 第二名rect.set_facecolor('#C0C0C0') # 银色if i==1: # 第一名rect.set_facecolor('#FFFACD') # 金色w = rect.get_width()ax.text(w, rect.get_y()+rect.get_height()/2, ' %.2f%%'%w,ha='left', va='center')i -= 1
plt.xticks([]) # 关掉横坐标

最后的结果就长这个样子:

写在最后

如果可以,我亦希望在无数次键盘的敲击声中创造出所谓的“极致浪漫”~

最后,附上本次NASA活动中个人觉得比较好看的一些图片:

一个微博热搜引发的故事相关推荐

  1. python热搜排行功能_用Python做一个微博热搜榜的语音播报

    微博是一个社交平台,有高效的信息流,几乎所有人能在这上面找到自己感兴趣的内容.经常使用微博的小伙伴,大家对微博热搜榜应该都不会很陌生.每天发生了什么新闻呢,谁谁谁又上热搜了. 在这个信息社会,每天发生 ...

  2. SpringBoot+Redis 实现一个微博热搜!

    大家好,我是宝哥! 使用java和redis实现一个简单的热搜功能,具备以下功能: 搜索栏展示当前登陆的个人用户的搜索历史记录,删除个人历史记录 用户在搜索栏输入某字符,则将该字符记录下来 以zset ...

  3. 新手开发记录:把ListView、Adapter的逻辑捋顺,做一个微博热搜吧

    首先声明:本人只是一个喜欢钻研的安卓新手,很多地方理解会不到位,欢迎大佬批评指正

  4. 微博热搜榜爬虫2.0

    微博热搜榜爬虫2.0 6月份出了一个微博热搜爬虫,在我电脑上设置了自动化12点爬取,结果到了9月份,执行不了. 一直没时间弄,今天来更新一下: 解决了两个问题, 1 >之前的话请求头比较单一,只 ...

  5. 一个比微博热搜更适合吃瓜的平台——即时热榜

    一个比微博热搜更适合吃瓜的平台--即时热榜.在这个信息爆炸的时代,我们的爱好(吃瓜)越来越多,对于信息量(八卦)的需求越来越大.要说平时,咱们追热点一般最常去的一定是微博,热点及时还有话题性,可参与讨 ...

  6. ig夺冠后服务器不稳定,IG夺冠,王思聪上微博热搜,网友:一个让服务器瘫痪的男人...

    11月3日,LPL等了七年,终于等到了这一天. IG3:0 打败FNC赢得了S8冠军.比赛结束后,IG赢得冠军的消息传遍了整个网络.这次不仅让LOL又火了一把,也让校长王思聪成为大家的终极偶像,正在观 ...

  7. 上映半个月,微博热搜近10次,长歌行的魅力到底在哪 ?

    最近热播的电视剧有很多,可谓是五花八门,在这些电视剧中小编发现一部宝藏剧,那就是<长歌行>.这部剧自从开播以来,就频繁登上微博热搜,小编不禁对这部剧产生了浓浓的兴趣,发现这部剧不管是道画服 ...

  8. 微博数据解析:综艺节目如何频上微博热搜?以《令人心动的offer》为例

    随着经济的发展.互联网的崛起以及精神世界的需求等一系列原因,使得网络综艺顺应时代蕴运而生.如今,网络综艺已经广泛渗透到人们的日常生活当中,潜移默化的影响着观众. 目前综艺节目市场规模庞大,各种综艺节目 ...

  9. 空降微博热搜第一,这款消除游戏有什么新花样?

    9月13日,一款名为<羊了个羊>的游戏登顶了微博热搜榜.而纵观过去几年登上微软热搜的游戏,无疑不是在玩法或交互层面做出了新意.那么<羊了个羊>有又何不同呢?话不多说,赶紧凑个热 ...

  10. 硬核吃瓜!上万条数据撕开微博热搜真相

    作者 | 徐麟 来源 | 转载自数据森麟(ID:shujusenlin) 吃瓜前言 关于新浪微博,向来都是各路吃瓜群众聚集之地,大家在微博中可以尽情吃瓜,各种类型的瓜应有尽有,只有你想不到的,没有你吃 ...

最新文章

  1. LeetCode实战:求众数
  2. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
  3. H.264边缘块进行帧内预测时,上边缘和左边缘块的预测情况。
  4. vue快速复制快捷键_⌨️ Vue项目给应用优雅的绑定快捷键
  5. 从HP收购ArcSight看SIEM/MSS市场现状与格局【9月17日更新】
  6. 20145226夏艺华 Exp6 信息搜集与漏洞扫描
  7. 罗马盘,大力盘,大圣盘等网盘资源搜索免费下载资源教程
  8. SQL内连接和外连接的区别、where和on的区别详细介绍
  9. html特使数字符号,特殊符号大全
  10. java 月份缩写_英文月份简写
  11. 百度地图、高德地图的数据下载
  12. 联想 计算机无线网络设置方法,联想g400如何打开无线_联想G400s笔记本电脑无线开关在哪-win7之家...
  13. 智能控制和计算机控制的区别,智能灯光控制系统与传统灯光系统有哪些区别?...
  14. java人才市场需求分析_人才招聘需求及分析报告.doc
  15. 安卓中发短信的几种方式总结和实现
  16. C++:66---特殊工具与技术之(不可移植的特性:位域、volatile、extern “C“链接提示)
  17. “npm”‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  18. CDeC-Net代码实现
  19. centos(7.9) minikube(v1.28.0) kaniko 构建镜像
  20. BZOJ 1003 [SPFA][DP]

热门文章

  1. 计算机基础——计算机基础知识
  2. 费马小定理(详细证明)
  3. Facebook:Novi数字钱包“已经准备好进入市场”
  4. Found multiple @SpringBootConfiguration annotated classes
  5. install package vif包_Go Lang 开发笔记《Golang的包管理》
  6. 精进1-如何反思 by采铜
  7. InstallShield脚本使用笔记
  8. C++参考手册中文网站
  9. bh1750采集流程图_基于BH1750的光照度检测)报告方案.doc
  10. centos 确定cpu是arm 还是x86_x86,I386,i686, x86_64, x64,amd64、Windows Linux AIX下查看CPU位数和操作系统位数、rpm包名...