二进制记得
【1】
你知不知道,那些交错在互联网上的数据,都以0或1的样貌,真实存在这世界的某个角落。
【2】
小思跟我说她喜欢一个男生十年了。
“啊?”,我一个没稳住,五花肉抱着重力加速度就往下坠。
“其实不确定啦……”,小思突然笑起来,但空气里完全感觉不到令人欣喜的因子,“前几年或许喜欢来着,到后来怎么一回事儿,自己竟也不知道。”
小思不是那种人。我倒并非否定她是“人”的存在,而是认识多年,她对什么都不上心,无意花花草草。我以为她在等意中人——妖出现。听说这类型泰国也多,她死活宅又穷,买不起机票,周边又没遇见过——这我能担保,所以我的“以为”才一直没被打破。新放的五花肉又开始雀跃了,伸展腰肢企图诱我上钩,一会子芳香四溢。竹筷伸了过去。
“嘿我说你这人怎么这样啊,有没有同情心啊,听到这么悲伤的故事还吃得下去?”
“哪里悲伤啦?”
“哪里不悲伤啦?”,小思觉着语气不够强烈,进一步咄咄逼人:“啊?啊?啊?”
五花肉是吃不上了。我伸手持平,一个“请”的姿态;脑袋前驱,侧扬右耳,表示洗耳恭听。
“那时候QQ空间很流行,什么话都在里头说,你是知道的吧?”,我确信刚刚语句里有疑问的成分但小思没为我准备应答的时间,“好友买卖抢车位大家都玩,你知不知道,有次他被人买去了,我没发现,他居然生气了……”
小思越往后说,越眉开眼笑,锁骨拉出一条水平线。她向来黑,又瘦,我一度认为我们之所以能友谊天长地久,是因为看彼此从头到脚都丑。而此刻,我竟觉得她很好看起来。
“……哪里想到他是那样的人嘛。还吃醋,斤斤计较……”
小思心情似乎转好,可我的状态背道而驰。五花肉大概要成油渣了吧,却仍旧挑衅我的嗅觉,迫使我一次次拼命咽口水。真实暴殄天物啊!
突然一丝与上文氛围极不相称的声音降下来,飘渺得仿佛穿山越岭之后,仿佛并非要说与我听。
“……他都不记得了吧,那些我们敲打的字,一行行排布在QQ空间里,我偶尔也去看的……可他不记得了吧……”
我忙拾起目光,视线里是小思垂下的头,将所有线索隐藏在刘海之后。
【3】
他忘了?
没关系,二进制帮他记得。
目标
爬取男/女神QQ空间里的说说。但我女神的说说是没办法爬啦,所以这里找个平时话比较多的朋友来替代吧。
工具
IED:pycharm
模块:selenium,mongodb(负责存储数据)
浏览器:chrome(记得需要下载相关驱动chromedriver.exe)
思路
- 利用selenium操纵谷歌浏览器自动登陆QQ空间获取cookies值
- 利用requests库向QQ说说的API接口请求数据
注意事项
注意QQ空间的登陆地址不是第一图,仔细分析,发现登陆界面是用的iframe框架,这是前端的一个知识。可以这样认为,这是在一个页面上镶嵌了另一个页面的数据
打开chrome开发者工具,注意数据来源,而不是直接对页面解析
最后数据存入MongoDB,以字典类型直接插入,与mysql相比,MongoDB直接爽快
查看网页源码,可以直接找到qzonetoken值
g_tk需要一定的计算,这里我是通过强大网友帮的忙,实现算法
def get_gtk(cookie):
"""
获取QQ空间GTK算法
:param cookie:
:return:
"""
hashes = 5381
for letter in cookie['p_skey']:
hashes += (hashes << 5) + ord(letter)
return hashes & 0x7fffffff
- msglist中content字段一定存在,而pic(图片),video(视频)不一定存在,所以需要做一些判断来处理一下处理
for item in data["msglist"]:
pics = []
videos = []
# 如果说说为空,用内“null”填充,否之则取出
if not item["content"]:
dic["content"] = "null"
else:
dic["content"] = item["content"]
# 用时间戳设置_id字段
dic["_id"] = item["created_time"]
# 将时间戳转换“某年-某月-某日 时:分:秒”格式
dic["time"] = time.strftime("%Y-%m-%d %H:%M:%S", \
time.localtime(int(item["created_time"])))
# 如果照片存在,如果视频存在,取出,否则用“null”填充
if "pic" in item.keys():
for picture in item["pic"]:
pics.append(picture["url3"])
dic["picture"] = pics
else:
dic["picture"] = "null"
if "video" in item.keys():
for video in item["video"]:
videos.append(video["url3"])
dic["video"] = videos
else:
dic["video"] = "null"
yield dic
最后
结果是比较满意的,然而稍微有点问题的是,QQ空间显示的是711条说说,但爬下来只有678,我对照过开头以及结尾数十条说说,都能对得上,估计是中间哪里出错了,抓取率只达到了95.5%。还有需要改进的地方。
完整代码已上传GitHub,点击可查看。