爬虫自学宝典——使用pygal可视化处理

编程入门 行业动态 更新时间:2024-10-26 06:26:50

<a href=https://www.elefans.com/category/jswz/34/1770264.html style=爬虫自学宝典——使用pygal可视化处理"/>

爬虫自学宝典——使用pygal可视化处理

前文回顾

准备条件:使用pygal模块,应该先装pygal包,最简单的方法就是pip了。


win+R——>cmd打开dos窗口,输入:

pip install pygal

等待数据连接后,模块加载成功后,自然会出现successfully字符的。


使用爬虫爬取数据后,前文我们已经介绍了如何将数据信息写入文件和存入数据库,但是这两者都是建立在干巴巴的数据上的操作;那么如何直观的展示这些信息呢?最好的办法就是将这些数据可视化。可视化的思路是什么?将数据先存入文件中,然后将这些数据通过的读的方法进行分类,最后利用pygal处理这些数据。

首先查看我的博客分类栏,其分类如下:

上述分类得知,总计十一类,所以我们需要新建是一个字典,字典键名为这十一类的名称,字典的键值为发布博客的数量。下面就是我们本次教学的步骤,请仔细阅读。

步骤一:修改spider文件

修改spider文件的目的是让虫子爬取我们想要的信息,修改后的demo_spider.py文件如下:

# -*- coding: utf-8 -*-
import scrapy
from demo.items import DemoItem
class DemoSpiderSpider(scrapy.Spider):name = 'demo_spider'allowed_domains = ['csdn.net']start_urls = ['']def parse(self, response):for info in response.xpath('//div[@class="article-list"]/div[@class="article-item-box csdn-tracking-statistics"]'):item = DemoItem()item['name'] = info.xpath('./h4/a/text()').extract()[1].strip()#爬取到博客的name信息item['read_number'] = info.xpath('./div[@class="info-box d-flex align-content-center"]/p[3]/span/span/text()').extract_first().strip()#爬取到博客的阅读次数item['publish_date'] = info.xpath('./div[@class="info-box d-flex align-content-center"]/p[1]/span/text()').extract_first().strip()#爬取博客的发布日期yield item

上述去掉了爬取下一页的代码,原因是CSDN博客中,我发的较少,没有翻页按钮。更重要的是,为了防止出现数据错乱。

步骤二:修改pipeline文件

修改pipeline文件的目的是让我们爬取的信息输出到json文件夹中,方便后面的pygal操作。
修改后的pipeline文件如下:

# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: .html
import jsonclass DemoPipeline(object):def __init__(self):self.filename = open(file="demo2.json", mode="w", encoding='utf-8')self.dict_list = []# 存储读取的博客信息def close_spider(self, spider):print('————————————————————关闭我的小虫子——————————————————————')json.dump(self.dict_list, self.filename, ensure_ascii=False)# 将博客信息列表存入json文件;ensure_ascii=False表示不以ascii形式存储,方便看得懂json文件self.filename.close()def process_item(self, item, spider):p = dict(item)# 博客信息集转换成字典,方便存入列表self.dict_list.append(p)# 将博客信息存入列表

步骤三:运行虫子,查看爬取结果

在dos命令行中,定位到项目目录下,然后输入如下命令:

scrapy crawl demo_spider

运行后查看项目目录,如果成功的话会出现demo2.json文件,如下图:

打开文件,文件内容如下:

这证明我们的数据已经爬取结束了,并且成功了。接下来就是利用pygal处理这些数据了,我有两个思路,一个思路是画柱状图,列出每类博客发布数量以及访问量;第二种思路是画一个圆饼图,列出每类博客发布数量所占总博客的比例,还有就是再画一个圆饼图,列出每类博客访问量所占总访问量的比例。


第一种思路:柱状图

思路很简单,将json中的数据导出,然后归类就行了。代码如下:

import json
import re
import pygalblogs = {'python': [0, 0], 'java': [0, 0], 'http': [0, 0], 'scrapy': [0, 0], '牛客': [0, 0], 'web': [0, 0],'html': [0, 0], 'eclipse': [0, 0], 'tomcat': [0, 0], 'mysql': [0, 0], 'xpath': [0, 0], 'other': [0, 0]}
# 创建一个字典,让其key为类型名,value为一个两列列表,第一列表示访发布量,第二列表示访问量
filePath = 'demo2.json'def classify(string):"""缺陷很大的一个函数,只能进行一次分类,但是有些博客属于多种类型。:param string::return:"""if len(re.findall('py', string, flags=re.I)) > 0:return 'python'elif len(re.findall('java', string, flags=re.I)) > 0:return 'java'elif len(re.findall('http', string, flags=re.I)) > 0:return 'http'elif len(re.findall('scrapy', string, flags=re.I)) > 0:return 'scrapy'elif len(re.findall('牛客', string, flags=re.I)) > 0:return '牛客'elif len(re.findall('web', string, flags=re.I)) > 0:return 'web'elif len(re.findall('html', string, flags=re.I)) > 0:return 'html'elif len(re.findall('eclipse', string, flags=re.I)) > 0:return 'eclipse'elif len(re.findall('tomcat', string, flags=re.I)) > 0:return 'tomcat'elif len(re.findall('mysql', string, flags=re.I)) > 0:return 'mysql'elif len(re.findall('xpath', string, flags=re.I)) > 0:return 'xpath'else:return 'other'with open(filePath, mode='r', encoding='utf-8') as f:file_list = json.load(f)for i in file_list:p = classify(i['name'])blogs[p][0] += 1blogs[p][1] += int(i['read_number'])
# json文件的数据进行分类,并记录数据值
blogs_class = list(blogs.keys())  # x轴分类名称
blogs_Number = []  # 博客发布量
blogs_readNumber = []  # 博客阅读量
for i in blogs_class:blogs_Number.append(blogs[i][0])blogs_readNumber.append(blogs[i][1])bar = pygal.Bar()
bar.x_labels = blogs_class
bar.add('发布量', blogs_Number)
bar.add('阅读量', blogs_readNumber)
bar.title = '博客发布量分析图'
bar._x_title = "博客类型"
bar._y_title = "数量"
bar.render_to_file('drawing.svg')

运行后,打开文件结果如下:

所有的的思路都在代码注释中,阅读代码,理清别人的思路也是程序员的必备功课。

第二种思路:圆饼图

除就是了,没有那么难的,代码如下:

import json
import re
import pygalblogs = {'python': [0, 0], 'java': [0, 0], 'http': [0, 0], 'scrapy': [0, 0], '牛客': [0, 0], 'web': [0, 0],'html': [0, 0], 'eclipse': [0, 0], 'tomcat': [0, 0], 'mysql': [0, 0], 'xpath': [0, 0], 'other': [0, 0]}# 创建一个字典,让其key为类型名,value为一个两列列表,第一列表示访发布量,第二列表示访问量def classify(string):"""缺陷很大的一个函数,只能进行一次分类,但是有些博客属于多种类型。:param string::return:"""if len(re.findall('py', string, flags=re.I)) > 0:return 'python'elif len(re.findall('java', string, flags=re.I)) > 0:return 'java'elif len(re.findall('http', string, flags=re.I)) > 0:return 'http'elif len(re.findall('scrapy', string, flags=re.I)) > 0:return 'scrapy'elif len(re.findall('牛客', string, flags=re.I)) > 0:return '牛客'elif len(re.findall('web', string, flags=re.I)) > 0:return 'web'elif len(re.findall('html', string, flags=re.I)) > 0:return 'html'elif len(re.findall('eclipse', string, flags=re.I)) > 0:return 'eclipse'elif len(re.findall('tomcat', string, flags=re.I)) > 0:return 'tomcat'elif len(re.findall('mysql', string, flags=re.I)) > 0:return 'mysql'elif len(re.findall('xpath', string, flags=re.I)) > 0:return 'xpath'else:return 'other'filePath = 'D:\Desktop\scrapyWork\demo\demo2.json'
with open(filePath, mode='r', encoding='utf-8') as f:file_list = json.load(f)for i in file_list:p = classify(i['name'])blogs[p][0] += 1blogs[p][1] += int(i['read_number'])
# json文件的数据进行分类,并记录数据值
blogs_class = list(blogs.keys())  # x轴分类名称
blogs_Number = []  # 博客发布量
blogs_readNumber = []  # 博客阅读量
for i in blogs_class:blogs_Number.append(blogs[i][0])blogs_readNumber.append(blogs[i][1])su = sum(blogs_Number)
for i in range(len(blogs_Number)):blogs_Number[i] /= su# 计算各类发布量所占的百分比
su = sum(blogs_readNumber)
for i in range(len(blogs_readNumber)):blogs_readNumber[i] /= su# 计算各类博客阅读量所占百分比
pie = pygal.Pie()
for i, per in enumerate(blogs_Number):pie.add(blogs_class[i], per)
pie.title = "博客数据饼状分析图——发布量"
pie.legend_at_bottom = True
pie.inner_radius = 0.4
pie.half_pie = True
# 以半饼显示
pie.render_to_file('test2_half.svg')pie2 = pygal.Pie()
for i, per in enumerate(blogs_readNumber):pie2.add(blogs_class[i], per)
pie2.title = "博客数据饼状分析图——访问量"
pie2.legend_at_bottom = True
pie2.inner_radius = 0.4
# pie2.half_pie = True
pie2.render_to_file('test2_notHalf.svg')

结果如下:


总结

这一节就是纯粹的数据可视化处理,但是旁敲侧击,所用的知识挺多的,包括python对json的支持,python的pygal可视化处理,还有很多小知识点的应用。
不过博主强力推荐,大家看看这篇番外博客,因为我在这一方面栽了一下午的跟头:如何给json文件中存入多个字典并读取
不过博主强力推荐,大家看看这篇番外博客,因为我在这一方面栽了一下午的跟头:如何给json文件中存入多个字典并读取
不过博主强力推荐,大家看看这篇番外博客,因为我在这一方面栽了一下午的跟头:如何给json文件中存入多个字典并读取

下一节,我们做一个小demo,给大家讲解怎么爬取高清图片。
欲知后事如何,且听下回分解。

更多推荐

爬虫自学宝典——使用pygal可视化处理

本文发布于:2023-07-27 22:08:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1225583.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   宝典   pygal

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!