文章目录

  • 一、小说数据的获取(含有csv文件和MySQL的写入方法)
  • 二、数据的分析与可视化
    • 2.1、Python读取数据表时,有时候会发生一个很顽固的错误
    • 2.2、查看表的统计信息
    • 2.3、可视化图分析

作者有话说:
1、本文虽然是一篇技术性文章,但是分析的数据可以给喜欢看小说的人提供参考
2、本文涉及的是Python爬虫精进的知识(含有csv文件和MySQL的写入方法)
3、作者想通过分享,让许多正在学习Python爬虫的提供帮助。
4、如果你对代码很反感,那就直接看数据分析吧!
5、文章若有不足之处,请指教。可以在评论区自由发表观点以及提出问题,作者会及时回应。

一、小说数据的获取(含有csv文件和MySQL的写入方法)

获取的数据为起点中文网的小说推荐周榜的所有小说信息。
网址为:https://www.qidian.com/rank/recom

源代码对所有想要获取的数据都有注释。

# -*- coding: utf-8 -*-
"""
Created on Mon Jan  4 22:59:11 2021
"""
import requests
from bs4 import BeautifulSoup
import os.path
import csv
import time
import pymysql
import random
class DrawBookMessage():def __init__(self):"""定义构造函数,初始化最初网址,方便后面调用,不必重复写"""self.baseUrl='https://www.qidian.com/rank/recom';#定义baseurl目标网址def User_Agent(self):"""定义5个代理IP隐藏身份,用5个IP随机选取,以防止被检测到链接对象而终止访问"""user_agent1 = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'user_agent2 = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'user_agent3 ='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'#user_agent4 ='Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0'#这个代理在我的开发环境中会发生访问错误,作者注释在这里,便于提醒自己user_agent5 ='Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'lst = [user_agent1,user_agent2,user_agent3,user_agent5]return random.choice(lst)#返回随机IPdef getHtml(self,url):"""通过随机IP访问网页获取网页的内容"""user_agent = self.User_Agent()#获取随机IPheaders = {"User-Agent":user_agent}request = requests.get(url,headers=headers).text#通过IP访问网页,并且获取网页内容请求return request #返回def commonsdk(self,url):""" 把文本类型转换为<class 'bs4.BeautifulSoup'>类型,之后还会用BeautifulSoup库来提取数据,如果这不是一个BeautifulSoup对象,我们是没法调用相关的属性和方法的,所以,这是非常重要。"""html = self.getHtml(url)doc=BeautifulSoup(html,'lxml')#转换为BeautifulSoup对象return docdef get_page_size(self,url):'''获取页面总数'''doc = self.commonsdk(url)self.pageNum = doc.find("div",class_="pagination fr")['data-pagemax']return int(self.pageNum)def draw_base_list(self,url):'''初级网页内容'''doc = self.commonsdk(url)listt=doc.find('div',class_ = "book-img-text").find_all('div',class_ = 'book-mid-info')for x in listt:self.bookName = x.find('h4').text.strip()#书名self.bookUrl ='https:'+x.find('h4').find('a')['href']#书的二级网址self.bookAuthor = x.find('p').find(class_='name').text.strip()#self.bookType = x.find('p').find('a',class_='').text.strip()#小说的类型self.bookStatus = x.find('p').find('span').text.strip()#小说更新的状态self.draw_Second_list()#调用获取二级网页内容self.dict_data()#调用生成字典的函数def draw_Second_list(self):'''获取二级网页内容'''doc = self.commonsdk(self.bookUrl)listt1 = doc.find('div',class_="book-info")self.bookIntrodaction = listt1.find(class_="intro").text.strip()#获取小说简介listt2 = doc.find(class_="fans-interact cf")if listt2.find(class_ ='ticket rec-ticket')==None:#ticket rec-ticket为空,ticket rec-ticket hidde不为空,有月票的标签self. monthTickets = listt2.find(class_ ='ticket month-ticket').find(class_ = 'num').text#小说月票self. weekTickets =  listt2.find(class_ ='ticket rec-ticket hidden').find(class_ = 'num').text#小说周票if listt2.find(class_ ='ticket rec-ticket hidden')==None:#ticket rec-ticket不为空,ticket rec-ticket hidde为空,没有有月票的标签self. monthTickets=0#没有月票标签时,月票为0self. weekTickets =  listt2.find(class_ ='ticket rec-ticket').find(class_ = 'num').text #小说周票self.weekWardNum = listt2.find(class_= 'rewardNum').text#小说本周打赏人数def dict_data(self):"""定义一个人方法生成需要存入数据的字典"""ctime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime());#当前爬取时间data={'书名':self.bookName,'作者':self.bookAuthor,'类型':self.bookType,'状态':self.bookStatus,'月票':int(self. monthTickets),'周票':int(self.weekTickets),'本周打赏人数':int(self.weekWardNum),'本书简介':self.bookIntrodaction,'爬取时间':ctime   }print(data)print("="*50)self.write_to_MySQL(data,"spiders","bookMessage")#写入数据库self.write_to_scv(data,'bookMessage.csv')#写入.CVS文件passdef write_to_scv(self,dic,filename):"""写入csv文件"""file_exists = os.path.isfile(filename)#判断是否为文件with open(filename, 'a',encoding='gb18030',newline='') as f: #a表示追加模式不覆盖原文件中的内容,newline = "" 表示读取的换行符保持不变,原来是啥,读出来还是啥headers=dic.keys()w =csv.DictWriter(f,delimiter=',',lineterminator='\n',fieldnames=headers)#创建一个对象if not file_exists :w.writeheader()w.writerow(dic)#单行写入print('当前行写入csv成功!')passdef write_to_MySQL(self,dic,database,table_name): """ 写入数据库"""keys = ', '.join(dic.keys())values = ', '.join(['% s'] * len(dic))#动态的构造占位符db = pymysql.connect(host='localhost', user='root', password=(自己的数据库密码), port=3306, db=database)#连接数据库cursor = db.cursor()#数据库连接对象sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table_name, keys=keys, values=values)#插入语句try:if cursor.execute(sql, tuple(dic.values())):print('Successful')db.commit()#commit是把查询语句提交到数据库内except:print('Failed')db.rollback()cursor.close()#关闭对象db.close()#关闭数据库释放资源if __name__ == '__main__':"""主函数"""drawBook = DrawBookMessage()page = drawBook.get_page_size(drawBook.baseUrl)for x in range(1,page+1):drawBook.draw_base_list(drawBook.baseUrl+'?page='+str(x))

看到这里不知道是否对你有所帮助?看不懂的可以评论区留言,顺便点个赞。嘻嘻嘻嘻嘻嘻!

二、数据的分析与可视化

相信大家对pandas都有了解吧,我就直入主题——数据分析。

2.1、Python读取数据表时,有时候会发生一个很顽固的错误


在这里一般性如果表中有中文的话,读表的时候就会报这个错误,这里把默认编码改为gbk一般就能解决这个问题。即encoding=‘gbk’。

2.2、查看表的统计信息

(1)describe()查看表的相关信息信息

data.describe()# count:数量统计,此列共有多少有效值#std:标准差#min:最小值#25%:四分之一分位数#50%:二分之一分位数#75%:四分之三分位数#max:最大值#mean:均值


通过这个结果可以得出各票数的情况和打赏的人数。
(2)根据周票数对小说排序
我们通过排序可以筛选出周票数前5的小说

data.sort_values(by = '周票',ascending = False).head(5)


可以知道当前这5本小说人气很高。很多人还喜欢看完结的小说,毕竟一次性看完的感觉特别爽。我们也把几本完结的小说获取出来

data.loc[data['状态']=='完本'].sort_values(by = '周票',ascending = False)


可以得出最近100流行小说中只有2本是完结的。

2.3、可视化图分析

(1)折线图
对于读者,都有不同的喜好都市、有的喜好玄幻、有的喜欢轻小说……让我们看一下最近这些小说各票数综合情况。通过下面打代码可以得出折线图情况。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决横坐标不能显示中文的况
plt.rcParams['axes.unicode_minus'] = False#解决横坐标不能显示中文的情况
#三条纵坐标的值
y1 = data.groupby('类型').sum()['本周打赏人数']#求和
y2 = data.groupby('类型').mean()['周票']#求平均值
y3 = data.groupby('类型').mean()['月票']#求平均值
x=list(dict(y1).keys())#横坐标值
fig = plt.figure(figsize=(8,6), dpi=100)#指定画布大小
plt.plot(x,y1,c='red',label='打赏票和')#指定折线的颜色和标签
plt.plot(x,y2,c='green',label='周票均值')
plt.plot(x,y3,c='blue',label='月票均值')
plt.legend(loc='upper left')#标签靠左
plt.ylabel('周票平局值、月票平局值、打赏票和',fontsize=15)#改变定横坐标名称以及字体大小。
plt.title("小说票数折线图")#图名
plt.xlabel('小说类型',fontsize=15)
plt.show()


通过折线图可以直观的看书流行的趋势,可以分析到奇幻小说最受欢迎,读者最多。

(2)柱状图

plt.rcParams['figure.figsize']=(8,3)#图形大小
data.groupby(['类型']).mean().plot(kind = 'bar')
plt.xticks(rotation=0)#横坐标的角度
plt.ylabel('票数',fontsize = 15)#纵坐标名
plt.xlabel('小说类型',fontsize = 15)#横坐标名
plt.title("小说票数柱状图")#图名
plt.show()

柱状图可以出月票、周票、以及打赏人数没有很直接的关系。比如奇幻周票高,但是其他两项的票数却非常低。

(3)饼状图

sizes = []
for booktype in x:#x是上文折线图中横坐标,即小说所有的类型。bookTypeNum=len(data[data['类型']==booktype])#获取各种小说的数量sizes.append(bookTypeNum)
plt.figure(figsize=(10,15)) #调节图形大小
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.pie(sizes,labels=x,#指定显示的标签autopct='%1.1f%%'#数据保留固定小数位
)
#plt.axis('equal')# x,y轴刻度设置一致#本文中可以不用
plt.title('小说类型受欢迎的分布图比')
plt.legend(loc='upper left')# 左上角显示
plt.show()


通过饼状图可以得出奇幻、都市、仙侠、轻小说几类小说很受大家追捧。
(4)词云图

import jieba
import wordcloud
string = ''
for i in range(len(x)):string = string + (x[i])*int(sizes[i])
print(string)string=' '.join(string)
w = wordcloud.WordCloud(background_color='white',font_path='simfang.ttf')
#这里指明font_path时的字体一定要是自己电脑C:\windows\Fonts下包含有的字体,不然会报错,或者出现乱码。
w.generate(string)
w.to_file(r"bookMessage.png")


根据词云的字的大小可以看出当下最受大家追捧的小说的类型。
(5)散点图

import matplotlib.pyplot as plt
import numpy as np
a=list(data['月票'])
b=list(data['周票'])
plt.rcParams['figure.figsize']=(12,8)
np.random.seed(0) #执行多次每次获取的随机数都是一样的
colors = np.random.rand(100)
size = np.random.rand(20)*1000#随机大小
plt.scatter(a,b,c=colors,s=size,alpha=0.7,marker='*')
plt.xlabel('月票数',fontsize = 15)#横坐标名
plt.ylabel('周票数',fontsize = 15)#纵坐标名
plt.title("月票和周票散点图")
plt.show()


通过散点图可以得出大部分小说的月票和周票的数目很少,只有少数的小说月票和周票数目多。往往这些小说就是当下最火的小说。
结语:
本文到此结束,不知道屏幕前的你,有收获了吗?
你看过那些很火的小说呢?
你有哪些知识点看不懂或者需要帮助?
或者你只是路过,但相遇即是缘,不妨留下你的足迹哦!
欢迎留言点赞与我一起讨论,我在世界的另一端等你哦!让我们一起共同进步

Python爬虫之小说信息爬取与数据可视化分析相关推荐

  1. python爬虫和数据可视化论文_Python爬虫之小说信息爬取与数据可视化分析

    一.小说数据的获取 获取的数据为起点中文网的小说推荐周榜的所有小说信息. 源代码对所有想要获取的数据都有注释. http://dxb.myzx.cn/grandmal/ # -*- coding: u ...

  2. Python 爬虫 中国行政区划信息爬取 (初学者)

    Python 爬虫 中国行政区划信息爬取 (初学者) 背景 环境准备 代码片段 1.定义地址信息对象 2.地址解析对象 2.1 获取web信息 2.2 web信息解析 2.3 区划信息提取 2.4 省 ...

  3. 数据采集与存储案例——基于Python爬虫框架Scrapy的爬取网络数据与MySQL数据持久化

    此案例需要预先安装pymsql python3.7.4 scrapy2.7.1 一.安装scrapy框架 1.使用pip命令安装scrapy pip install scrapy 在这里下载太慢可以使 ...

  4. 基于Python的网络爬虫爬取天气数据可视化分析

    目录 摘 要 1 一. 设计目的 2 二. 设计任务内容 3 三. 常用爬虫框架比较 3 四.网络爬虫程序总体设计 3 四. 网络爬虫程序详细设计 4 4.1设计环境和目标分析 4 4.2爬虫运行流程 ...

  5. python爬虫下载小说_python 爬取小说并下载的示例

    代码 import requests import time from tqdm import tqdm from bs4 import BeautifulSoup """ ...

  6. easyui datalist 不显示数据_爬虫练习——豆瓣电影信息爬取及数据可视化

    最近自学了简单的爬虫项目,简单记录下自己的小白学习路径. 本次爬取的是豆瓣电影TOP250数据,主要用到beautifulsoup.re.urllib库.SQLite包,数据可视化方面主要用到flas ...

  7. Python实现淘宝爬取——奶粉销售信息爬取及其数据可视化

    简介 双十一刚过,TB的销售额又创下了新高,我也为2000+亿做出了贡献 恰巧买了一袋德运奶粉,味道还不错.我就在想,接触爬虫也有两个多月了,还没有爬过TB这种经典的网站,借着劲头就爬取了一下TB上奶 ...

  8. python数据可视化字段_python数据爬取及数据可视化分析

    电影网站数据分析及可视化研究 本博客是一篇集数据爬取,存储为excel表格,将数据可视化为一体的博文,数据爬取采用request等方法,数据可视化会使用图表进行展示,有改进的地方还请大家多多指教. 数 ...

  9. python数据爬取及数据可视化分析

    电影网站数据分析及可视化研究 本博客是一篇集数据爬取,存储为excel表格,将数据可视化为一体的博文,数据爬取采用request等方法,数据可视化会使用图表进行展示,有改进的地方还请大家多多指教. 目 ...

  10. 学透这10个Python爬虫框架,轻松爬取一切数据

    这是本文的目录 前言 1.Scrapy 3.Cola 4.Portia 5.Newspaper 6.Beautiful Soup 7.Grab 8.Crawley 9.Selenium 10 .Pyt ...

最新文章

  1. php采集 纠正一下
  2. War包与配置文件分离
  3. RecyclerView控件的基本使用(增强版的ListView)
  4. Linux 网络子系统之NAPI书签
  5. 资深Android开发带你入门Framework,架构师必备技能
  6. hibernate oracle clob 注解,Hibernate3.X实现基于CLOB字段类型的注解方式:
  7. OSPF邻接关系的建立步骤
  8. C#/VB.NET与西门子PLC进行ModbusTcp通信
  9. ERP实施--常见问题
  10. linux安装neo4j
  11. solidworks图纸模板添加_solidworks工程图模板制作(大全).doc
  12. ios设备管理 iMazing官方免费激活电脑版下载v2.11.6.0
  13. 计算机使用了休眠 怎么唤醒,电脑睡眠模式怎么唤醒?
  14. 高性能服务器龙头,中国服务器的龙头企业:在全球市场中排第三,超越了华为联想...
  15. java如何生成api文档_api文档自动生成工具
  16. Actions as Moving Points复现
  17. Jackson Western印迹检测分析物丨比色免疫印迹
  18. NetConf Brower使用
  19. IDEA下使用maven配置Spark开发环境
  20. springboot redis cluster集群 Cannot determine a partition for slot xxx.

热门文章

  1. 二层交换配置完ping失败_在三层交换机和二层交换机做怎么配置使这两台主机ping通...
  2. 【线性代数·浅学】(一)行列式——n阶行列式定义,行列式性质,行列式展开定理,拉普拉斯定理,范德蒙德行列式,克拉默法则
  3. 杭州电子科技大学acm--2012
  4. matlab三维网格绘图函数mesh、meshc、mesh、zmeshgrid、surf【matlab图行绘制五】
  5. 计算机应用基础个人简历制作,计算机应用基础信息技术基础《项目3-4制作个人简历》教案...
  6. win10如何退出微软账户
  7. 解决WIN10本地账号绑定微软账号后无法解绑的方法
  8. 布鲁特-福斯算法(字符串匹配)
  9. python大纲图_干货!!python自学大纲!
  10. 计算机专业拜年语,适合拜年发的朋友圈祝福语:过年拜年的说说