Python数据分析之糗事百科

最近一直忙着写材料,没给大家写作业的案例,第二期同学很厉害,都是抢着要作业做,哈哈,今天我就给大家写点爬虫的扩展和数据分析,让厉害的同学学起来。

代码

这次除了爬取老师的作业布置的字段外,还爬取了用户的一些信息,如图所示。



之前的作业亮同学已经详细讲解了,我今天就贴下我的代码:

import requests
from lxml import etree
import pymongo
import time

client = pymongo.MongoClient('localhost', 27017)
qiushi = client['qiushi']
qiushi_info = qiushi['qiushi_info']
user_info = qiushi['user_info']

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

def get_info(url):
    html = requests.get(url,headers=header)
    selector = etree.HTML(html.text)
    infos = selector.xpath('//div[@class="col1"]/div')
    base_url = 'https://www.qiushibaike.com'
    for info in infos:
        id = info.xpath('div[1]/a[2]/h2/text()')[0] if len(info.xpath('div[1]/a[2]/h2/text()'))==1 else '匿名用户'
        jug_sex = info.xpath('div[1]/div/@class')
        if len(jug_sex)==0:
            sex = '不详'
            age = '不详'
        elif jug_sex[0]=='articleGender manIcon':
            sex = '男'
            age = info.xpath('div[1]/div/text()')[0]
        else:
            sex = '女'
            age = info.xpath('div[1]/div/text()')[0]
        content = info.xpath('a[1]/div/span[1]/text()')[0]
        laugh = info.xpath('div[2]/span[1]/i/text()')[0]
        comment = info.xpath('div[2]/span[2]/a/i/text()')[0] if info.xpath('div[2]/span[2]/a/i/text()') else None
        user_url = base_url + info.xpath('div[1]/a[2]/@href')[0] if info.xpath('div[1]/a[2]/@href') else None
        data ={
            'id':id,
            'sex':sex,
            'age':age,
            'laugh':laugh,
            'comment':comment,
            'user_url':user_url,
            'content':content
        }
        qiushi_info.insert_one(data)
        if user_url == None:
            pass
        else:
            get_user_info(user_url)
    time.sleep(1)

def get_user_info(url):
    html = requests.get(url,headers=header)
    selector = etree.HTML(html.text)
    if selector.xpath('//div[@class="user-block user-setting clearfix"]'):
        pass
    else:
        fans = selector.xpath('//div[2]/div[3]/div[1]/ul/li[1]/text()')[0] if selector.xpath('//div[2]/div[3]/div[1]/ul/li[1]/text()') else None
        topic = selector.xpath('//div[2]/div[3]/div[1]/ul/li[2]/text()')[0] if selector.xpath('//div[2]/div[3]/div[1]/ul/li[2]/text()') else None
        qiushi = selector.xpath('//div[2]/div[3]/div[1]/ul/li[3]/text()')[0] if selector.xpath('//div[2]/div[3]/div[1]/ul/li[3]/text()') else None
        comment_1 = selector.xpath('//div[2]/div[3]/div[1]/ul/li[4]/text()')[0] if selector.xpath('//div[2]/div[3]/div[1]/ul/li[4]/text()') else None
        favour = selector.xpath('//div[2]/div[3]/div[1]/ul/li[5]/text()')[0] if selector.xpath('//div[2]/div[3]/div[1]/ul/li[5]/text()') else None
        handpick = selector.xpath('//div[2]/div[3]/div[1]/ul/li[6]/text()')[0] if selector.xpath('//div[2]/div[3]/div[1]/ul/li[6]/text()') else None
        martial_status = selector.xpath('//div[2]/div[3]/div[2]/ul/li[1]/text()')[0] if selector.xpath('//div[2]/div[3]/div[2]/ul/li[1]/text()') else '不详'
        constellation = selector.xpath('//div[2]/div[3]/div[2]/ul/li[2]/text()')[0] if selector.xpath('//div[2]/div[3]/div[2]/ul/li[2]/text()') else '不详'
        profession = selector.xpath('//div[2]/div[3]/div[2]/ul/li[3]/text()')[0] if selector.xpath('//div[2]/div[3]/div[2]/ul/li[3]/text()') else '不详'
        home = selector.xpath('//div[2]/div[3]/div[2]/ul/li[4]/text()')[0] if selector.xpath('//div[2]/div[3]/div[2]/ul/li[4]/text()') else '不详'
        qiushi_age = selector.xpath('//div[2]/div[3]/div[2]/ul/li[5]/text()')[0] if selector.xpath('//div[2]/div[3]/div[2]/ul/li[5]/text()') else '不详'
        # print(fans,topic,qiushi,comment_1,favour,handpick,martial_status,constellation,profession,home,qiushi_age)
        data ={
            'fans':fans,
            'topic':topic,
            'qiushi':qiushi,
            'comment_1':comment_1,
            'favour':favour,
            'handpick':handpick,
            'martial_status':martial_status,
            'constellation':constellation,
            'profession':profession,
            'home':home,
            'qiushi_age':qiushi_age,
            'user_url':url
        }
        user_info.insert_one(data)


if __name__ == '__main__':
    urls = ['https://www.qiushibaike.com/text/page/{}/'.format(str(i)) for i in range(1,36)]
    for url in urls:
        get_info(url)

数据存储到mongodb数据库中,如图:



数据预处理

  • 首先,导入库和数据:
import pandas as pd
import pymongo
import jieba.analyse
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
client = pymongo.MongoClient('localhost',port = 27017)
qiushi = client['qiushi']
qiushi_info = qiushi['qiushi_info']
data = pd.DataFrame(list(qiushi_info.find()))
data
  • 字段类型转化
    由于有些字段没有,填充了“不详”或None,所以age,comment字段都是文本类型的,需转化为整形,但有None这些东西没法转,需要把这些内容替换为“0”才能转,以下就是转化代码。(怎么就管不住我这双手呢,填空值可以直接转化,而且填充缺失值也很简单)
data['age'].replace('不详','0',inplace=True)
data['comment'].replace([None],'0',inplace=True)
data['age'] = data['age'].astype('int64')
data['comment'] = data['comment'].astype('int64')
data['laugh'] = data['laugh'].astype('int64')
data.dtypes
  • 填补缺失值
    我把一些值都替换成了0,我们通过列的平均值进行填充即可。
data['age'].replace(0,int(data[data['age']!=0]['age'].mean()),inplace=True)
data['comment'].replace(0,int(data[data['comment']!=0]['comment'].mean()),inplace=True)

玩糗事的人年龄

通过describe看下:

data.describe()

可以看出平均年龄为34,话说不是我们才是段子手的主力军么,我回头看了下数据,有很多人填写的年龄为100以上,为虚假信息,由于数据量少,拉高了平均值,段子手是属于我们的!!!!(我不会告诉你我才17)

谁是段子手

通过排序,找出前十评论和前十好笑的段子的用户,看看谁才是真正的段子手。

data1 = data.sort_values(['comment'],ascending=False)[0:10]
plt.figure(figsize=(20,10),dpi=80)
lables=list(data1['id'])
plt.bar(range(len(lables)),data1['comment'],tick_label=lables)

data2 = data.sort_values(['laugh'],ascending=False)[0:10]
plt.figure(figsize=(20,10),dpi=80)
lables=list(data1['id'])
plt.bar(range(len(lables)),data1['laugh'],tick_label=lables)

段子手性别比例

看下段子手男女比例:

plt.figure(figsize=(8,6),dpi=80)
labels = list(data3.index)
sizes = list(data3)
colors = ['red','yellowgreen','lightskyblue']

explode = (0.05,0,0)

patches,l_text,p_text = plt.pie(sizes,explode=explode,labels=labels,colors=colors,
                                labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,
                                startangle = 90,pctdistance = 0.6)
plt.axis('equal')
plt.legend()


男生比较多,哈哈,污污的女生最可爱!!!

段子词云

词云制作讲过很多次了,放上代码和图。

duanzi = ''  #初始化字符串
for i in range(360):   #数字为数据的行数
    index = data.ix[i,:]   #取每行
    content = index['content']  #取每行的question
    duanzi = duanzi + content
jieba.analyse.set_stop_words('停用词表路径')
tags = jieba.analyse.extract_tags(duanzi, topK=50, withWeight=True)
for item in tags:
    print(item[0]+'\t'+str(int(item[1]*1000)))

段子嘛,无非是男生聊女生,女生聊男生。

总结

放假了,作业写完的同学,数据分析来一波,还有用户的详细信息没分析,我们下次分析咯!!端午快乐。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容