赞
踩
本文将实现利用Python爬取并简单地可视化分析当当网的图书数据。
详细的exe、源代码、程序解析等文件请关注公众号 行歌 知否,
回复关键词 当当网小爬虫 获取。
更多精彩内容请关注公众号
转载请注明出处
根据给定的关键字,爬取与该关键字相关的所有图书数据。以关键字为matlab为例,我们要爬取的图书数据的网页页面是这样子的:
因此,我们只需要分析网页的链接格式,通过循环构造url链接去请求,然后提取我们关注的信息即可。
同样,为了方便大家的使用,我也将程序打包成了可执行文件(exe),因此本文也只执行基于可执行文件的演示。
单击可执行文件 craw_data.exe
,如下,
等待数秒钟,会弹出一个控制台界面 ,提示你输入图书的关键词,这个关键词可以是C、python、matlab等等都可以。在这里,我输入了matlab,如下所示,
按下回车,程序开始进行爬取当当网上的信息,如下所示,
等待大概两分钟吧,会弹出一个对话框,请输入用于保存数据的文件名,如下所示,
这个时候我们打开生成的 result.csv
文件,可以看到里面的信息如下所示,
该表格总共有五列,第一列是图书的书名,第二列是图书的价格,第三列是图书的评分,第四列是评论数量,第五列是图书封面图片的下载链接。当然,我们可以根据自己的需求在程序里面设置需要保存的信息。
上一节我们爬取了图书封面的链接以后,我们需要批量的把它们下载下来,这部分的实现代码如下所示,
''' 批量下载图片 ''' import os import time import math import requests from tkinter import * import tkinter.filedialog import pandas as pd def download_pictures(urls_list, savedir): ''' 本函数用于自动图片下载, 1)urls_list是一个嵌套的列表,每个元素都是一个含有一个字符串的列表, 因此,想取第一张照片的链接,语法是:urls_list[0][0]。 2)savedir是保存照片的文件夹名字 ''' # 创建存储图片的文件夹 if not os.path.exists(savedir): os.mkdir(savedir) # 遍历每一个图片下载链接,下载并保存下来 for index, pic_url_list in enumerate(urls_list): res = requests.get( pic_url_list[0], headers=headers) with open(os.path.join(savedir, '%d.jpg' % index), 'wb') as f: f.write(res.content) #print(res.content) time.sleep(0.5) if __name__ == '__main__': # 获取图片的下载链接 root = Tk() # 创建一个Tkinter.Tk()实例 root.withdraw() # 将Tkinter.Tk()实例隐藏 file_path = tkinter.filedialog.askopenfilename(title=u'选择文件' ) # 以对话框的形式选择文件,并返回其绝对路径 categories = ['picture'] fd = open(file_path) urls_list = pd.read_csv(fd, usecols=categories).values.tolist() fd.close() headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/72.0.3626.119 Safari/537.36',} root_path = 'pictures' download_pictures(urls_list, root_path)
代码中有两个知识点,需要留意下,在工作中经常用得到,如下,
res = resquests.get(url) 方法,在获取网页的html代码时常常使用res的text属性:
html = res.text,而在下载图片或文件时常常使用res的content属性。
注意,
resp.text返回的是Unicode型的数据。
resp.content返回的是bytes型也就是二进制的数据。、
获取文本一般使用res.text, 获取图片或文件一般使用res.content
text是content经过编码之后的字符串,那编码方式是什么呢?
在返回text时requests会基于 HTTP 头部对响应的编码作出有根据的推测,
但不一定准确,有可能出现乱码,
而我们可以手动指定一种编码方式:res.encoding = ‘需要的编码方式’。
numerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为
一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
例子如下所示,
>>>seasons = [‘Spring’, ‘Summer’, ‘Fall’, ‘Winter’]
>>> list(enumerate(seasons))
[(0, ‘Spring’), (1, ‘Summer’), (2, ‘Fall’), (3, ‘Winter’)]
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始
[(1, ‘Spring’), (2, ‘Summer’), (3, ‘Fall’), (4, ‘Winter’)]
运行程序后,同样会弹出对话框,让你选择存放有数据的csv文件,如下,
在脚本所在的目录下,会生成一个pictures文件夹,里面保存了自动爬取的图片,如下所示,
这样,图片就批量下载好了,整个过程不过几分钟而已。
有了数据以后肯定就是要可视乎分析了。现在就简单地可视化分析一波我们爬取到的100页 matlab 相关的图书数据吧~
首先先介绍下我们用于可视化的神器——pyecharts模块,pyecharts是一款将python与echarts结合的强大的数据可视化工具。我们都知道python上的一款可视化工具matplotlib,而本文用的是Echarts与Python结合的轮子:pyecharts。
话不多说,直接上代码,
# -*- coding: utf-8 -*- from tkinter import * import tkinter.filedialog import pandas as pd import pyecharts def base_price_draw_bar(dataset): columns = [] data = [] price_series = dataset['price'] for i in range(11): if i == 10: column = '>{}'.format(i*20) data_filter = (price_series >= i*20) else: column = '{}-{}'.format(i*20,(i+1)*20) data_filter = (price_series >= i*20) & (price_series < (i+1)*20) filted_data = dataset.loc[data_filter] num = filted_data.shape[0] columns.append(column) data.append(num) bar = pyecharts.Bar('柱状图','图书价格在各个区间的分布') bar.use_theme('dark') bar.add('价格',columns,data,mark_line=['average'],xaxis_name='价格区间',yaxis_name='数量') bar.render(r'price_bar.html') def base_comment_draw_pie(dataset): columns = [] data = [] comment_num_series = dataset['comment_num'] for i in range(7): if i == 6: column = '>{}'.format(i*20) data_filter = (comment_num_series > (i-1)*20) elif i==0: column = str(0) data_filter = (comment_num_series == 0) else: column = '{}-{}'.format((i-1)*20,i*20) data_filter = (comment_num_series > (i-1)*20) & (comment_num_series <= i*20) filted_data = dataset.loc[data_filter] num = filted_data.shape[0] columns.append(column) data.append(num) pie = pyecharts.Pie('饼状图','评论数量在各个区间的分布') pie.add('评论数量',columns,data,is_legend_show=False,is_label_show=True) pie.render(r'comment_pie.html') if __name__ == '__main__': root = Tk() # 创建一个Tkinter.Tk()实例 root.withdraw() # 将Tkinter.Tk()实例隐藏 file_path = tkinter.filedialog.askopenfilename(title=u'选择文件' ) # 以对话框的形式选择文件,并返回其绝对路径 categories = ['price', 'star','comment_num'] fd = open(file_path) dataset = pd.read_csv(fd, usecols=categories) fd.close() base_price_draw_bar(dataset) base_comment_draw_pie(dataset)
让我们先看看图书的价格在各个区间的分布吧:
再来评论数量?
看来买matlab 书籍的热情不是很高,没有多少人评论,大部分都是零评论的啊。
好啦,本章就到这里啦,下期再会!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。