内容简介:当今社会,速度已经深入人心了,“快”成了大家默认的办事境界,看机器上一件件飞一般传递着的产品,听办公室一族打电话时那种无人能及的语速......休闲的概念已日渐模糊,大家似乎都变成了在“快咒”控制下的小人儿,似乎连腾出点时间来松口气的时间都没有了,看得见的、看不见的规则约束着我们;有形的、无形的的鞭子驱赶着我们,我们马不停蹄追求事业、爱情、地位、财富,似乎自己慢一拍,就会被这个世界抛弃工作仅仅是生活的一部分,千万不要忽略了其他乐趣,人生本是一幅美丽的风景画,不必对所有的事情都抱有强烈的目的性,人的一生总有做
当今社会,速度已经深入人心了,“快”成了大家默认的办事境界,看机器上一件件飞一般传递着的产品,听办公室一族打电话时那种无人能及的语速......休闲的概念已日渐模糊,大家似乎都变成了在“快咒”控制下的小人儿,似乎连腾出点时间来松口气的时间都没有了,看得见的、看不见的规则约束着我们;有形的、无形的的鞭子驱赶着我们,我们马不停蹄追求事业、爱情、地位、财富,似乎自己慢一拍,就会被这个世界抛弃
工作仅仅是生活的一部分,千万不要忽略了其他乐趣,人生本是一幅美丽的风景画,不必对所有的事情都抱有强烈的目的性,人的一生总有做不完的事情,只要我们有一个平和之心,就不会错过沿途风景。
一个阳光明媚的早晨,手拿一杯咖啡,翻开一本喜欢的书,也不失为一种人生乐趣,作为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 请求头(一般可以放入Cookie,Referer,User-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浏览器)
经过上面的几行代码,我能就可以抓取页面的内容了
2.分析网页,抓取数据
这次我们要抓取的信息包括:
书名,链接,作者,出版社,出版日期,价格,评分,评论数,评论内容 复制代码
我们下面看看怎么获取信息
我们可以选择我们想要抓取的信息,下面显示在 div class='article' 这个标签下,到这里先别急写代码,我们可以继续往下看几层,是不是可以搜小我们选择的范围
我们向下看了几层,发现其实我们想要的数据都在 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" 标签
下面所有要的信息,以及标签我在图上做了标识
下面看代码
#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.根据评论数量和评分,分析大家对那些书敢兴趣,评分比较高
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.各年份出版的书籍数量
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.各大出版的发行书籍数据占比
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网络爬虫与文本数据分析
- Python网络爬虫与文本数据分析(视频课)
- 腾讯课堂 | Python网络爬虫与文本数据分析
- 倒计时 | Python网络爬虫与文本数据分析
- 一次即兴的爬虫经历:A站B站数据分析实战
- Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。