Python爬虫之小说信息爬取与数据可视化分析
文章目录
- 一、小说数据的获取(含有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爬虫之小说信息爬取与数据可视化分析相关推荐
- python爬虫和数据可视化论文_Python爬虫之小说信息爬取与数据可视化分析
一.小说数据的获取 获取的数据为起点中文网的小说推荐周榜的所有小说信息. 源代码对所有想要获取的数据都有注释. http://dxb.myzx.cn/grandmal/ # -*- coding: u ...
- Python 爬虫 中国行政区划信息爬取 (初学者)
Python 爬虫 中国行政区划信息爬取 (初学者) 背景 环境准备 代码片段 1.定义地址信息对象 2.地址解析对象 2.1 获取web信息 2.2 web信息解析 2.3 区划信息提取 2.4 省 ...
- 数据采集与存储案例——基于Python爬虫框架Scrapy的爬取网络数据与MySQL数据持久化
此案例需要预先安装pymsql python3.7.4 scrapy2.7.1 一.安装scrapy框架 1.使用pip命令安装scrapy pip install scrapy 在这里下载太慢可以使 ...
- 基于Python的网络爬虫爬取天气数据可视化分析
目录 摘 要 1 一. 设计目的 2 二. 设计任务内容 3 三. 常用爬虫框架比较 3 四.网络爬虫程序总体设计 3 四. 网络爬虫程序详细设计 4 4.1设计环境和目标分析 4 4.2爬虫运行流程 ...
- python爬虫下载小说_python 爬取小说并下载的示例
代码 import requests import time from tqdm import tqdm from bs4 import BeautifulSoup """ ...
- easyui datalist 不显示数据_爬虫练习——豆瓣电影信息爬取及数据可视化
最近自学了简单的爬虫项目,简单记录下自己的小白学习路径. 本次爬取的是豆瓣电影TOP250数据,主要用到beautifulsoup.re.urllib库.SQLite包,数据可视化方面主要用到flas ...
- Python实现淘宝爬取——奶粉销售信息爬取及其数据可视化
简介 双十一刚过,TB的销售额又创下了新高,我也为2000+亿做出了贡献 恰巧买了一袋德运奶粉,味道还不错.我就在想,接触爬虫也有两个多月了,还没有爬过TB这种经典的网站,借着劲头就爬取了一下TB上奶 ...
- python数据可视化字段_python数据爬取及数据可视化分析
电影网站数据分析及可视化研究 本博客是一篇集数据爬取,存储为excel表格,将数据可视化为一体的博文,数据爬取采用request等方法,数据可视化会使用图表进行展示,有改进的地方还请大家多多指教. 数 ...
- python数据爬取及数据可视化分析
电影网站数据分析及可视化研究 本博客是一篇集数据爬取,存储为excel表格,将数据可视化为一体的博文,数据爬取采用request等方法,数据可视化会使用图表进行展示,有改进的地方还请大家多多指教. 目 ...
- 学透这10个Python爬虫框架,轻松爬取一切数据
这是本文的目录 前言 1.Scrapy 3.Cola 4.Portia 5.Newspaper 6.Beautiful Soup 7.Grab 8.Crawley 9.Selenium 10 .Pyt ...
最新文章
- php采集 纠正一下
- War包与配置文件分离
- RecyclerView控件的基本使用(增强版的ListView)
- Linux 网络子系统之NAPI书签
- 资深Android开发带你入门Framework,架构师必备技能
- hibernate oracle clob 注解,Hibernate3.X实现基于CLOB字段类型的注解方式:
- OSPF邻接关系的建立步骤
- C#/VB.NET与西门子PLC进行ModbusTcp通信
- ERP实施--常见问题
- linux安装neo4j
- solidworks图纸模板添加_solidworks工程图模板制作(大全).doc
- ios设备管理 iMazing官方免费激活电脑版下载v2.11.6.0
- 计算机使用了休眠 怎么唤醒,电脑睡眠模式怎么唤醒?
- 高性能服务器龙头,中国服务器的龙头企业:在全球市场中排第三,超越了华为联想...
- java如何生成api文档_api文档自动生成工具
- Actions as Moving Points复现
- Jackson Western印迹检测分析物丨比色免疫印迹
- NetConf Brower使用
- IDEA下使用maven配置Spark开发环境
- springboot redis cluster集群 Cannot determine a partition for slot xxx.
热门文章
- 二层交换配置完ping失败_在三层交换机和二层交换机做怎么配置使这两台主机ping通...
- 【线性代数·浅学】(一)行列式——n阶行列式定义,行列式性质,行列式展开定理,拉普拉斯定理,范德蒙德行列式,克拉默法则
- 杭州电子科技大学acm--2012
- matlab三维网格绘图函数mesh、meshc、mesh、zmeshgrid、surf【matlab图行绘制五】
- 计算机应用基础个人简历制作,计算机应用基础信息技术基础《项目3-4制作个人简历》教案...
- win10如何退出微软账户
- 解决WIN10本地账号绑定微软账号后无法解绑的方法
- 布鲁特-福斯算法(字符串匹配)
- python大纲图_干货!!python自学大纲!
- 计算机专业拜年语,适合拜年发的朋友圈祝福语:过年拜年的说说