当前位置:   article > 正文

数据挖掘 (三)——基于python的当当网小爬虫_爬取当当网数据思维导图

爬取当当网数据思维导图

导语

本文将实现利用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) 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

代码中有两个知识点,需要留意下,在工作中经常用得到,如下,

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) 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

让我们先看看图书的价格在各个区间的分布吧:
在这里插入图片描述

再来评论数量?

在这里插入图片描述

看来买matlab 书籍的热情不是很高,没有多少人评论,大部分都是零评论的啊。

好啦,本章就到这里啦,下期再会!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/809541
推荐阅读
相关标签
  

闽ICP备14008679号