爬虫之豆瓣词云

from urllib import request
from bs4 import BeautifulSoup as bs
import re
import codecs
import jieba  #分词包
import numpy    #numpy计算包
import pandas as pd #分词用到
import matplotlib.pyplot as plt  #绘图包
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10.0,5.0)
from wordcloud import WordCloud #词云包

#爬取豆瓣最受关注图书榜
def gettopchartbook_list():
    
    resp = request.urlopen('https://book.douban.com/chart?subcat=I')
    html_data = resp.read().decode('utf-8')

    #转化为BeautifulSoup对象
    soup = bs(html_data,'html.parser')

    #搜索最受关注的图书列表
    topchart_book =soup.find_all('ul',class_='chart-dashed-list')

    #搜索列表中所有图书
    topchart_book_list = topchart_book[0].find_all('li',class_='media clearfix')

    #新建数组用于存放后续的数据
    topchart_list = []

    #遍历图书馆列表,从中过滤出我们所需的信息
    for item in topchart_book_list:
        #新建字典用于存放我们的图书信息,之后可用class来存储
        topchart_dict = {}

        #搜索到具体信息的位置
        book_item = item.find('a',class_='fleft')

        #得到图书ID
        topchart_dict['id'] = book_item['href'].split('/')[4]   

        #得到图书名称
        topchart_dict['name'] = book_item.getText().replace('\t','').replace('\n','').replace(' ','')  #图书名字
        
        #将图书信息加入到数组中
        topchart_list.append(topchart_dict)
    return topchart_list

#根据图书ID爬取评论函数
def getCommentbyId(bookId,pageNum):
    #新建数组用于存放评论信息
    eachCommentList = []
    if pageNum<0:
        return False
    requrl = 'https://book.douban.com/subject/'+ bookId +'/comments/hot'+'?'+'p='+str(pageNum)
    print(requrl)
    #爬取热门第一页中的评论信息
    resp = request.urlopen(requrl)
    html_data = resp.read().decode('utf-8')
    soup = bs(html_data,'html.parser')
    #搜索到评论所在div
    comment_div_lits = soup.find_all('div',class_='comment')
    for item in comment_div_lits:
        if item.find_all('p')[0].string is not None:
            eachCommentList.append(item.find_all('p')[0].string)
    return eachCommentList
    
def main():
    #循环获取第一本书的前10页评论
    commentList = []
    topchartbook_list = gettopchartbook_list()
    for i in range(10):
        num = i + 1
        commentList_temp = getCommentbyId(topchartbook_list[0]['id'],num)
        commentList.append(commentList_temp)
    
    #为了方便进行数据进行清洗,我们将列表中的数据放在一个字符串数组中
    commits = ''
    for k in range(len(commentList)):
        commits = commits + (str(commentList[k])).strip()

    # print(commits)
    # exit()

    #可以看到所有的评论已经变成一个字符串了,但我们发现评论中还有不少标点符号等
    #这些符号对我们进行词频统计根本就没有用,因此将他们清除,所用的方法是正则表达式
    pattern = re.compile(r'[\u4e00-\u9fa5]+')
    filterdata = re.findall(pattern,commits)
    cleaned_comments = ''.join(filterdata)
    # print('评论数组')
    # print(eachCommentList)
    # print('评论字符串')
    # print(commits)
    # print('去除标点符号的评论')
    # print(cleaned_comments)
    # exit()

    #在这里使用的是结巴分词,如果没有安装结巴分词,可以在控制台用 pip install jieba安装
    segment = jieba.lcut(cleaned_comments)
    # print(segment)
    # exit()
    #可以使用pandas库将分词转化成dataframe格式,head()方法只查看前五项内容
    words_df = pd.DataFrame({'word':segment})
    # print(words_df)
    # print(words_df.head())
    # exit()

    #可以看到我们的数据中有“我”、“很”等虚词(停用词)
    #而这些词在任何场景中都是高频时,并且没有实际含义,所以我们要对他们进行清除
    #把停用词放在一个stopwords.txt文件中,将我们的数据与停用词进行对比即可

    stopwords=pd.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding='gbk')
    # print(stopwords)
    # exit()
    words_df=words_df[~words_df.word.isin(stopwords.stopword)]
    # print(words_df.head())
    # exit()

    #接下来进行词频统计
    words_stat=words_df.groupby(by=['word'])['word'].agg(['count'])
    # print(words_stat.head())

    #对统计结果进行排序
    words_stat=words_stat.reset_index().sort_values(by=["count"],ascending=False)
    # print(words_stat.head())

    #词云展示
    wordcloud = WordCloud(font_path="simhei.ttf",background_color="white",max_font_size=80)    #指定字体类型、字体大小、背景颜色
    word_frequence = {x[0]:x[1] for x in words_stat.head(1000).values}
    # print(word_frequence)
    wordcloud = wordcloud.fit_words(word_frequence)
    # print(wordcloud)
    # exit()

    #matplotlib包对图片进行绘制,绘制成功后,返回一个AxesImage对象,要在窗口上显示这个对象,我们可以用show()函数进行
    #在某些练习环境下可以省略show()函数,也能自动显示出来
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

    wordcloud.to_file('tutorial/Python/images/books/'+str(topchartbook_list[0]['id'])+'.png')

#主函数
main()

 

转载于:https://www.cnblogs.com/lsm-boke/p/9940322.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统分为两个两大模块。 第一模块以用户身份进行设定,具有图书查询,下单,加入购物车,,购买,评价,退货,个人信息管理等功能。 第二模块是以管理员身份进行设定,具有用户信息管理,图书的增删改查,用户订单管理等功能。 1. 用户信息管理模块 根据管理员的角色需要, 可以修改用户密码及给用户授予管理员权限.所以他可以修改用户信息中的密码及权限. 首先,管理员通过用户ID或用户登录名查找用户(当管理员一进入用户信息管理页面时,即显示所有用户信息). 其次,管理员通过查找到对应用户,直接修改用户相应信息,在行末的修改按钮点击, 调用CustomAction中的updateCustomPwdandRole()方法,对修改内容进行数据库更新 最后,修改成功后再次挑战到该页面(再次显示所有用户信息). (*需改进:密码不可见) 2. 图书信息显示 图书信息显示分为两大块,其一,按某种顺序显示图书列表,比如说类别,点击率,销售量.其二,显示图书详细信息. 第一个就不多说了(没有负责这块),调用对于的service->dao,按某种顺序显示图书(此块加上分页功能). 第二块,即图书详细信息显示,功能块细分如下 1) 图书基本信息显示 书名,作者,价格,点击量,库存,ISBN等等 2) 顾客对图书评价显示 显示对此书已购读者对该书的评价,数据库设有评价表,有一个图书ID字段,根据此页显示的图书的ID查找出对应的所有评价及评价此书的顾客相应信息(昵称,评价时间) 3) 相关书籍显示 根据图书所属分类,按点击量显示同类型图书 4) 加入购物车 数据库存在购物车表,顾客可将图书放入购物车(相应信息),并不直接加入订单(没有生成订单号),若在查看购物车时下订单,即将信息转入订单表,生成相应的订单编号 5) 立即购买 立即生成一个单一商品的订单. (*注: 1. 无论是加入购物车还是立即购买,检验数量的合法性(用正则检验其为大于0的整数,及小于图书库存) 2.对于加入购物车或立即购买,判断是否登陆,若是没有登陆,显示”请先登陆后购买(从这里控制,防止非登陆用户加入购物车或订单页面)”) 3. 购物车管理 购物车管理这块着重于购物车数量的增减,每当操作数量时,改变相应的库存,在显示栏下方设置空白给予用户填写收货地址的信息,当用户点击确认订单按钮,即生成订单(订单在数据库分为两个表orders,orderbook(订单明细)它们公用同个订单id). (注:判断用户是否登陆) 4. 订单管理 订单管理中,订单orders表设有状态位,其分别为(未付款0,已取消1,已付款(已发货)2, 交易成功3,已退货4). 1) 页面设有订单搜索功能,根据时间段搜索出下单时间符合的订单,根据订单状态查找订单. 2) 对于不同状态的订单有着不同的操作 未付款付款,删除 已付款确认收货,退货 交易成功评价 3) 该页面使用AJAX,实现部分刷新(由其他同学负责) d. 底层代码负责块 编写有关订单的dao层,service层,action层代码 e. 三味书屋设计特色 1) 用户添加订单多样化—设置购物车(批量购买),立即购买 2) 设置点击量字段,标识热门书籍 3) 设置keyword记录,获取用户搜索书籍频率信息,掌握用户动态,对书店进货方向有更好的把握 4) 设置的管理员模块及用户模块,功能丰富,内容详实,符合实际需求 5) 灵活多样的图书展示区, 网站前台图书显视栏目分为以下几种方式: (1)最新图书 (2) 随机图书 (3)推荐图书(按价格) (4) 按照类型分类的书 等等....

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值