躁动不安的年代,你需要读几本好书(python爬虫及数据分析)

栏目: Python · 发布时间: 6年前

内容简介:当今社会,速度已经深入人心了,“快”成了大家默认的办事境界,看机器上一件件飞一般传递着的产品,听办公室一族打电话时那种无人能及的语速......休闲的概念已日渐模糊,大家似乎都变成了在“快咒”控制下的小人儿,似乎连腾出点时间来松口气的时间都没有了,看得见的、看不见的规则约束着我们;有形的、无形的的鞭子驱赶着我们,我们马不停蹄追求事业、爱情、地位、财富,似乎自己慢一拍,就会被这个世界抛弃工作仅仅是生活的一部分,千万不要忽略了其他乐趣,人生本是一幅美丽的风景画,不必对所有的事情都抱有强烈的目的性,人的一生总有做

当今社会,速度已经深入人心了,“快”成了大家默认的办事境界,看机器上一件件飞一般传递着的产品,听办公室一族打电话时那种无人能及的语速......休闲的概念已日渐模糊,大家似乎都变成了在“快咒”控制下的小人儿,似乎连腾出点时间来松口气的时间都没有了,看得见的、看不见的规则约束着我们;有形的、无形的的鞭子驱赶着我们,我们马不停蹄追求事业、爱情、地位、财富,似乎自己慢一拍,就会被这个世界抛弃

工作仅仅是生活的一部分,千万不要忽略了其他乐趣,人生本是一幅美丽的风景画,不必对所有的事情都抱有强烈的目的性,人的一生总有做不完的事情,只要我们有一个平和之心,就不会错过沿途风景。

一个阳光明媚的早晨,手拿一杯咖啡,翻开一本喜欢的书,也不失为一种人生乐趣,作为IT一族,我们不能只是局限于IT类的数据,要广大自己的视野,提升自己的内在,今天这篇文章我们会给你推荐几本不错的文学书籍,大家一起来看下。

作为一名程序猿,我们不用为该读什么书发愁,因为我们有python,一个号称除了生孩子,什么都可以做的语言。下面进入正题。

本文大概涉及两个方法:

1.书籍信息爬取

​ 1.1 requests 抓取网页

​ 1.2 BeautifulSoup ,re正则分析网页结构

2.信息分析

​ 2.1 pandas 处理文件

​ 2.2 pyecharts 可视化分析

1.网页抓取

目标URL : book.douban.com/tag/文学?star… 注意start=0,网页的offset是20,后面代码里有体现

我们还是用requests 库来抓取网页信息,下面说下requests 库大致用法

1.常用方法

​ requests.get()

​ requests.post()

​ requests.put()

​ requests.delete()

2.参数

method  提交方式(一般就是get ,post
        url     提交地址
        params  GET请求中在URL中传递的参数,如http://xxxx?parameter=xxx 这种方式
        data:    在请求体里传递的数据        
      	json     在请求体里传递的数据         
        headers   请求头(一般可以放入CookieRefererUser-Agent
        cookies  Cookies
        files    上传文件       
        auth     headers中加入加密的用户名和密码,是另一种身份验证方法,账号密码在请求时候传过去直接验证,				 这种方式用的比较少        
        timeout  请求和响应的超时时间         
        allow_redirects  是否允许重定向    
        proxies  代理        
        verify   是否忽略证书         
        cert     证书文件        
        stream   一部分一部分的获取数据,不用一次性获取数据,放入内存     
        session: 用于保存客户端历史访问信息
                      
复制代码

下面正式开始抓取网页信息

#伪装浏览器请求,User-Agent和Cookie 可以用你自己的,怎么取看下面的图
headers = {
'User-Agent': '*******',
'Cookie': '*******'
}


res = requests.get(url,headers=headers,timeout =20) # 获取网页信息,timeout要设置,不然可能因为超时导致抓取信息失败
# print(res.status_code,res.apparent_encoding,res.content,res.encoding) #response响应的一些信息
res.encoding = res.apparent_encoding #设置请求头的编码
response = res.text #获取网页的内容
复制代码

右击网页----->检查------->network------->按F5刷新网页 就会出现下面的界面(我用的Chrome浏览器)

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)

经过上面的几行代码,我能就可以抓取页面的内容了

2.分析网页,抓取数据

这次我们要抓取的信息包括:

书名,链接,作者,出版社,出版日期,价格,评分,评论数,评论内容
复制代码

我们下面看看怎么获取信息

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)

我们可以选择我们想要抓取的信息,下面显示在 div class='article' 这个标签下,到这里先别急写代码,我们可以继续往下看几层,是不是可以搜小我们选择的范围

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)
躁动不安的年代,你需要读几本好书(python爬虫及数据分析)

我们向下看了几层,发现其实我们想要的数据都在 li class = "subject-item" 这样的标签下,下面我们就可以用BeautifulSoup来分析了

#用lxml方法来解析网页,默认是html.parse
soup = BeautifulSoup(response,'lxml')

#找到所有<li class = "subject-item">这样的标签,注意find_all方法返回的是list类型,下面使用的时候要用for循环,find是只找到第一个符合条件的标签,返回的是bs4.element类型,可以直接调用方法
artiche = soup.find_all('li','subject-item')
复制代码

下面分别看下我们想要的数据的具体位置,选择第一个 li class = "subject-item" 标签

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)

下面所有要的信息,以及标签我在图上做了标识

下面看代码

#artiche是列表类型,循环操作每个元素
    for item in artiche:
        for i in item.find_all('div','info'): #书名和链接信息
            try:
                if i.find('a').string:  #防止存在没有书名的情况,string是获取a标签的内容
                    book_name = i.find('a').string.strip()  找到第一个a标签
                else:
                    book_name='NULL'
                if  i.find('a').attrs: #获取a标签的的属性
                    book_url = i.find('a').attrs.get('href').strip() #属性时字典方式,用get取数据
                else:
                    book_url =url

                pub_info = i.find('div','pub').string.strip() #出版社信息
                book_info_list = pub_info.split('/')
                #下面都是根据实际情况判断写的内容
                if len(book_info_list)==5:
                    book_auth = book_info_list[0]+','+book_info_list[1]
                    book_publish = book_info_list[2]
                    book_pub_date = book_info_list[3]
                    book_price = re.findall('\d+',book_info_list[4])[0]
                elif len(book_info_list)==4:
                    book_auth = book_info_list[0]
                    book_publish = book_info_list[1]
                    book_pub_date = book_info_list[2]
                    book_price = re.findall('\d+',book_info_list[3])[0]
                else:
                    book_auth = 'NULL'
                    book_publish = book_info_list[0]
                    book_pub_date = book_info_list[1]
                    book_price = re.findall('\d+', book_info_list[2])[0]
			   #评分
                rating_nums = i.find('span','rating_nums').string
			   #评论数信息
                comment_nums = i.find('span','pl').string.strip()
                comment_nums = re.findall('\d+',comment_nums)
                comment_nums = comment_nums[0]
			  #评论内容
                if i.find('p'):
                    comment_content = i.find('p').string.strip().replace('\n','')
                else:
                    comment_content= 'NULL'

                print(book_name,
                      book_url,book_auth,book_publish,
                      book_pub_date,book_price,rating_nums,
                      comment_nums,comment_content)
复制代码

抓取完信息我们要用pandas的to_csv方法把数据存入csv文件里方便后续分析

data_dict = {}
                data_dict['书名'] = book_name
                data_dict['链接'] = book_url
                data_dict['作者'] = book_auth
                data_dict['出版社'] = book_publish
                data_dict['出版日期'] = book_pub_date
                data_dict['价格'] = book_price
                data_dict['评分'] = rating_nums
                data_dict['评论数'] = comment_nums
                data_dict['评论内容'] = comment_content


                data_list.append(data_dict)
                
                df = pandas.DataFrame(data_list_all)
    		   df.to_csv('book.csv', encoding='utf_8_sig')  # encoding解决乱码问题
复制代码

这样我们的数据抓取就算大功告成了。

3.数据分析

数据分析这段我们使用pyecharts工具,我们大概分析几个方面,自我感觉分析的不是太到位,哈哈,大家主要还是用来学习下怎么使用pyecharts和pandas。

首先我们用pandas分析上面的csv文件,处理下等到我们想要的格式

from pyecharts import Bar,Pie
import pandas as pd

df = pd.read_csv('book.csv')
# print(df.loc[1:10,['书名','评论数']])
dfn = df.dropna(axis=0,subset=['书名'])  #删除书名为空的记录
dfn_comment = dfn.sort_values('评论数',ascending=False).head(20) #根据评论数排序,取前20本书信息
dfn_score = dfn[dfn['评论数']>200000].sort_values('评分',ascending=False).head(20) #根据评分排序,取前20本书信息
# print(dfn['书名'],dfn['评论数'])
# print(dfn.loc[:,['书名','评论数']])

dfn_book_name = dfn_comment['书名'].values.tolist() #把dataframe类型转成list类型
dfn_comment_nums = dfn_comment['评论数'].values.tolist()

dfn_book_name_score = dfn_score['书名'].values.tolist()
dfn_comment_score = dfn_score['评分'].values.tolist()
# print(dfn_book_name,dfn_comment_nums,dfn_comment_score)
# print(type(df),type(dfn))
# print(dfn.dtypes['出版日期']) #打印列类型

#日期类型转换
# dfn['出版日期'] = pd.to_datetime(dfn['出版日期'],errors='coerce') #转换成日期类型
# dfn['出版日期'] = dfn['出版日期'].dt.year #取年份
dfn_pub_date = dfn
dfn_pub_date['出版日期'] = pd.to_datetime(dfn['出版日期'],errors='coerce') #转换成日期类型
dfn_pub_date['出版日期']= dfn['出版日期'].dt.year #取年份

# print(dfn_pub_date)
#根据出版日期年份分组,取出每年出版书籍数量
dfn_n = dfn_pub_date.groupby(['出版日期'],as_index=False)['书名'].size().reset_index(name='count')

#过滤出版数量在10以下的年份
dfn_n = dfn_n[dfn_n['count']>10]
dfn_n_year = dfn_n['出版日期'].values.tolist()
dfn_n_count = dfn_n['count'].values.tolist()


#最多产的出版社
dfn_n_pub = dfn.groupby(['出版社'],as_index=False)['书名'].size().reset_index(name='count')
dfn_n_pub = dfn_n_pub.sort_values('count',ascending=False).head(10)
dfn_n_pub_name = dfn_n_pub['出版社'].values.tolist()
dfn_n_pub_count = dfn_n_pub['count'].values.tolist()
复制代码

1.根据评论数量和评分,分析大家对那些书敢兴趣,评分比较高

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)
躁动不安的年代,你需要读几本好书(python爬虫及数据分析)
bar = Bar("豆瓣文学类图书", "评价数量")
bar.add("评论数排名", dfn_book_name, dfn_comment_nums, is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('豆瓣文学评论数分析.html')  # 生成本地 HTML 文件
#

bar = Bar("豆瓣文学类图书", "评价数量")
bar.add("评分排名", dfn_book_name_score, dfn_comment_score, is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('豆瓣文学书籍评分分析.html')  # 生成本地 HTML 文件
复制代码

从上面看的出来,<<风筝的人>>,<<活着>>,<<解忧杂货店>>,<<小王子>>,<<白夜行>>等书,还是值得我们一看的,大家也可以上豆瓣读书上看下,网站自己有个综合排名,感觉和我分析的差不多,有兴趣可以自己看下。

2.各年份出版的书籍数量

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)
pie = Pie("各年份出版书籍数量分布饼图", title_pos='center')
pie.add("", dfn_n_year, dfn_n_count, radius=[40, 75],
    label_text_color=None,
    is_label_show=True,
    legend_orient="vertical",
    legend_pos="left")
# pie.show_config()
pie.render('年份出版书籍数量分布饼图.html')
复制代码

我们看随着时间的推进,人们对书籍的需求也越来越大,从1999-2019,书籍的出版数量呈上升趋势。

3.各大出版的发行书籍数据占比

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)
pie = Pie("各出版社出版书籍数量分布饼图", title_pos='center')
pie.add("", dfn_n_pub_name, dfn_n_pub_count, radius=[40, 75],
    label_text_color=None,
    is_label_show=True,
    legend_orient="vertical",
    legend_pos="left")
# pie.show_config()
pie.render('各出版社出版书籍数量分布饼图.html')
复制代码

出版社的分析,大家自己看下就行。

最后还是那句话,工作再忙,也要享受片刻的读书时光,减少焦虑。

大家如果有兴趣可以拿的代码自己执行抓取数据,自己做点自己想要知道的分析。

源代码请关注公众号:pythonislover , 回复 "看书", 即可获取。

躁动不安的年代,你需要读几本好书(python爬虫及数据分析)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言程序设计

C语言程序设计

K. N. King / 吕秀锋、黄倩 / 人民邮电出版社 / 2010-4 / 79.00元

时至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经和最初的时候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强调标准 C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了 C99标准,并与 C89标准进行对照,补充了 C99中的最新特性。本书分为 C语言的基础特性、 C语言的高级特性、 C语言标准库和参考资料 4个部分。每章末尾都有一个“问与......一起来看看 《C语言程序设计》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具