用python来抓取qq空间好友星座和年龄等信息

news/2024/12/4 17:13:41/

############## 绘制星座信息图表 + 获取性别信息、绘制图表 #########

import json
import requests
from lxml import etree
import pandas as pd
import pygal
import pickle

#################################################################
################  part 1.  获取qq好友里全部星座信息  ################ 

# 获得字典形式的cookies,每次用都要更新
cookiestext = 'pgv_pvid=8421545856; RK=/EacH6zzXV; ptcz=5562ef870b5a86ab3a6ee817db01bca1973c511919d7decdac6924b88b2215a8; qq_openid=A49C2D4464E954D8D27D06644439A1FE; qq_access_token=C8FF150AFE6B70A2F36A8871C09250D1; qq_client_id=101487368; pac_uid=3_A49C2D4464E954D8D27D06644439A1FE; xw_main_login=qq; QZ_FE_WEBP_SUPPORT=1; pgv_pvi=1478334464; __Q_w_s__QZN_TodoMsgCnt=1; zzpaneluin=; zzpanelkey=; pgv_si=s8951654400; _qpsvr_localtk=0.9695429788606436; pgv_info=ssid=s2563789480; uin=o0491034714; skey=@ZMdxmEa8M; p_uin=o0491034714; pt4_token=mUbXZv02QSdr1gzI122eB3WwikSgfIPIO7PCGmHLJRE_; p_skey=UNiliWfKlnqmP4z8R5oldkGo4ivWsIHwPvr91vLPrkQ_; Loading=Yes; qz_screen=1920x1080; cpu_performance_v8=11; rv2=80FCF86B57AC3075464BA7A58FE385705EF8FA69EE4122D91D; property20=5E7748B355BAAFB11193770860DDE1D37A6697A98692E853FB22298E35A511937AD80B3AD0DA6C3C'


def dictcookies(cookiestext): # 把字符串格式的cookies转化为字典格式
    cookies = {} # 目标字典
    cookiespure = cookiestext.replace(' ','')
    cookieslist = cookiespure.split(';')
    for i in cookieslist:
        key,value = i.split('=',1)
        cookies[key] = value
    # print(cookies) # 需要的话可以打印一下观察结果
    return cookies
def savetofile(filename,content):
    save_file = open(filename,'wb')
    pickle.dump(content,save_file)

def readfile(filename):
    load_file = open(filename,'rb')
    data_file = pickle.load(load_file)
    return data_file

cookies = dictcookies(cookiestext)

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}

# 获得好友空间的url地址列表,先要获得储存好友信息的json文件
frdjsurl = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=491034714&do=1&rd=0.7684480696337077&fupdate=1&clean=1&g_tk=1578640073&qzonetoken=6b459c18d1ed1f360ddf1f19cf3b2ec8ffa91df433aea503381f8ac7d67f312178b2304d498f41d6c8f3&g_tk=1578640073'
frdjspage = requests.get(frdjsurl, headers=headers, cookies=cookies)

# 解析json文件
temp = json.loads(frdjspage.text[10:-2])
a = temp['data']['items_list']
# 生成存储好友昵称和qq号的字典
friends = {}
for i in a: 
    friends[i['uin']] = {'name':i['name']}
for k in friends.keys():
    friends[k]['link'] = 'https://user.qzone.qq.com/'+str(k)


#获取年龄相关信息
for v in friends.values():

    frdpage = requests.get(v['link'], headers=headers, cookies=cookies)
    a = etree.HTML(frdpage.text)
    title = a.xpath('/html/head/title')[0].text
    if title != 'QQ空间-分享生活,留住感动':
        print(str(title) + '的空间打得开')
        v['open'] = True
        info = a.xpath('//*[@id="profile-detail"]/div/div[2]/ul/li[1]/div[2]/h4')
        info1 = a.xpath('//*[@id="profile-detail"]/div/div[2]/ul/li[2]/div[2]/h4')
        if info:
            if info[0].text:
                if info[0].text.find('岁') != -1:
                    itemp = info[0].text.find('岁')
                    xingzuo = info[0].text[itemp-2:itemp+1]
                    print(xingzuo)
                    v['xingzuo'] = xingzuo
                elif info1:
                    if info1[0].text:
                        if info1[0].text.find('岁') != -1:
                            itemp = info1[0].text.find('岁')
                            xingzuo = info1[0].text[itemp-2:itemp+1]
                            print(xingzuo)
                            v['xingzuo'] = xingzuo                 

#################################################################
################  part 2.  做成表格,方便可视化处理  ################ 

''' 
#分别使用 isin( )和~isin( )删选数据
starlist = ['白羊座','金牛座','双子座', '巨蟹座','狮子座','处女座','天秤座','天蝎座','射手座','摩羯座','水瓶座','双鱼座']
xz = fr['xingzuo'][fr['xingzuo'].isin(starlist)]
xzc = xz.value_counts()

starlist = ['无法打开主页获取','没有相关信息']
xz = fr['xingzuo'][~fr['xingzuo'].isin(starlist)]
xzc = xz.value_counts()
'''

fr = pd.DataFrame(friends).transpose()# 设置一下转置
xz = fr['xingzuo']
xzc = xz.value_counts()
print(xzc)
# 可视化 横柱图
chart = pygal.HorizontalBar()
chart.title = '好友年龄的分布图'
for i in range(len(xzc)):
    chart.add(xzc.index[i],xzc.iloc[i],rounded_bars=5)#可以修改数字5,数字越大,柱状图两头越圆润  
chart.render_to_file('xz.svg')

''' 
以下是获取好友性别信息相关代码
for v in friends.values():
    frdpage = requests.get(v['link'], headers=headers, cookies=cookies)
    # # 解析星座信息(初试)
    a = etree.HTML(frdpage.text)
    title = a.xpath('/html/head/title')[0].text
    # 根据title判断页面打开情况
    if title != 'QQ空间-分享生活,留住感动':
        print('%s的空间打得开' % title)
        v['open'] = True
        info = a.xpath('//*[@id="profile-detail"]/div/div[2]/ul/li[1]/div[2]/h4')
        info1 = a.xpath('//*[@id="profile-detail"]/div/div[2]/ul/li[2]/div[2]/h4')
        if info:
            if info[0].text:
                if info[0].text.find('男') != -1:
                    num = info[0].text.find('男')
                    sex = info[0].text[num]
                    print(sex)
                    v['sex'] = sex
                elif info[0].text.find('女') != -1:
                    num = info[0].text.find('女')
                    sex = info[0].text[num]
                    print(sex)
                    v['sex'] = sex
                elif info1:
                    if info1[0].text:
                        if info1[0].text.find('男') != -1:
                            num = info1[0].text.find('男')
                            sex = info1[0].text[num]
                            print(sex)
                            v['sex'] = sex
                        elif info[0].text.find('女') != -1:
                            num = info1[0].text.find('女')
                            sex = info1[0].text[num]
                            print(sex)
                            v['sex'] = sex
'''      

  


http://www.ppmy.cn/news/433116.html

相关文章

12星座的出生年月日性格_十二星座的日期和性格特点

展开全部 水瓶座(01月e68a84323131333532363134313032313635333133343134633521日─02月19日) 水瓶座的人很有创新精神,思想上很多时候比较大胆,赋予想象所以水瓶座的人大多数比较聪慧,有点刀子嘴豆腐心吧! 双鱼座(02月20日─03月…

java测试输入星座匹配_用java编一个程序能通过用户输入的生日判断用户的星座。请大神们给点提示或者思路吧。规定不能自定义方法...

展开全部 既然不允许用其他的方式,那就直接e69da5e887aa3231313335323631343130323136353331333335303465上代码吧....public static void main(String[] args) { int point -1; String[] str {"白羊","金牛","双子","巨蟹&qu…

地耀日12星座

地耀日12星座 好像大概有下列这些,记不清楚了 壁虎星座 麻雀星座 射水鱼星座(斗鱼) 氢原子星座 水分子星座 COMSCI星座 紫水晶星座 土星神星座 马克思星座 爱因斯坦星座 藤本科植物星座 其它的,好像记不清楚了。。…

【题解】 [JOISC2020] 星座 3

solution: 考虑怎样的一对星星会形成星座。 记 l [ i ] l[i] l[i] 和 r [ i ] r[i] r[i] 分别表示从第 i i i 个星星出发,能扩展到的最左和最右节点。 考虑反悔贪心,尽量使得答案更大。换句话说,当前点覆盖的区间一定比之前 [ l [ i ]…

程序员星座论

2019独角兽企业重金招聘Python工程师标准>>> 射手座 特立独行者,射手也。拿到手的模块,他们会用自己的方法去编写代码,可能先前主程交代的思路和注意事项早就被他们网的一干二净了,他们凡事不会和别人商量&#x…

你信星座么?

一 摩羯座 12月22日-1月19日 魔羯给人外表感觉很冷漠,其实内心是火热的,很善良,不容易拒绝别人, 尤其是自己看重的人,受伤了就会想要逃避,多数是吃软不吃硬! 脾气很大,但是对事不…

十二星座匹配对象_快来看看,准爆了的十二星座恋情分析表

1 白/羊/座 喜欢上的话,就会拼命的去追求,真可谓是超级恋爱型的女孩子,这种人会热情的去追求她所喜欢的男性,而且勇于表现自己,特别是当家人亲友反对,对方又有女友时,更是…

【Python二级等考大题】星座三问

问题描述 代码框中给出的代码是提示代码,你可以局部修改,或者全部删除重写。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪…