一、爬取网页,获取需要内容

我们今天要爬取的是豆瓣电影top250
页面如下所示:

我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西。直接进入主题吧!

知道我们需要的内容在哪里了,接下来就使用我们python强大的request库先获取网页内容下来吧!获取内容后,再使用一个好用的lxml库来分析网页内容,然后获取我们的内容就可以做下一步操作了。
先贴出使用request库和lxml分析的代码

  1. def get_page(i):
  2. url = 'https://movie.douban.com/top250?start={}&filter='.format(i)
  3.  
  4. html = requests.get(url).content.decode('utf-8') # 使用request库获取网页内容
  5.  
  6. selector = etree.HTML(html) # 使用lxml库提取内容
  7. '''
  8. 通过观察页面就能发现内容在<div class="info">下的一部分
  9. '''
  10. content = selector.xpath('//div[@class="info"]/div[@class="bd"]/p/text()')
  11. print(content)
  12.  
  13. for i in content[1::2]:
  14. print(str(i).strip().replace('\n\r', ''))
  15. # print(str(i).split('/'))
  16. i = str(i).split('/')
  17. i = i[len(i) - 1]
  18. key = i.strip().replace('\n', '').split(' ') # 这里的strip和replace的使用目的是去除空格和空行之类
  19. print(key)

通过获取下来的内容我们发现一部电影的各项内容都是用'/'分隔着,我们只需要提取电影分类中的东西,所以我们需要使用

  1. i = str(i).split('/')

来把内容分隔成几项内容,因为电影分类排在最后,所以我们通过

  1. i = i[len(i) - 1]

来获取分隔后的最后一项也就是我们需要的电影分类,还有最后一步我们需要完成的,因为一部电影里面一般都有多个电影分类的标签,所以我们还要继续分隔获取到的电影分类,并且观察可以知道电影分类之间只是用一个空格隔开,所以我们使用下面一行代码就可以分离出各个分类:

  1. key = i.strip().replace('\n', '').split(' ')

二、接下来就是保存到mysql数据库

把电影分类保存在mysql数据库以便下面进行数据分析,这里我们使用到pymysql来连接mysql数据库,首先我们需要在mysql数据库建好表:

然后我们通过pymysql把数据保存到数据库中,代码如下:
首先要连接数据库:

  1. # 连接mysql数据库
  2. conn = pymysql.connect(host = 'localhost', user = 'root', passwd = '2014081029', db = 'mysql', charset = 'utf8')  # user为数据库的名字,passwd为数据库的密码,一般把要把字符集定义为utf8,不然存入数据库容易遇到编码问题
  3. cur = conn.cursor()  # 获取操作游标
  4. cur.execute('use douban')  # 使用douban这个数据库

在保存到数据库之前,我们还有一个需要做得,那就是把250部电影的分类汇总数量,所以我们定义了一个字典来统计电影分类的个数,这里的代码是get_page函数的一部分,代码如下:

  1. for i in content[1::2]:
  2. print(str(i).strip().replace('\n\r', ''))
  3. # print(str(i).split('/'))
  4. i = str(i).split('/')
  5. i = i[len(i) - 1]
  6. key = i.strip().replace('\n', '').split(' ')
  7. print(key)
  8. for i in key:
  9. if i not in douban.keys():
  10. douban[i] = 1
  11. else:
  12. douban[i] += 1

然后定义一个保存函数,执行插入操作,如果出现插入失败,就执行回滚操作,还有记得在操作完成之后,使用conn.close()和cur.close()来关闭数据库连接,代码如下:

  1. def save_mysql(douban):
  2. print(douban) # douban在主函数中定义的字典
  3. for key in douban:
  4. print(key)
  5. print(douban[key])
  6. if key != '':
  7. try:
  8. sql = 'insert douban(类别, 数量) value(' + "\'" + key + "\'," + "\'" + str(douban[key]) + "\'" + ');'
  9. cur.execute(sql)
  10. conn.commit()
  11. except:
  12. print('插入失败')
  13. conn.rollback()

三、使用matplotlib进行数据可视化操作

首先,从数据库中把电影分类和每个分类的数量分别存入一个列表中,然后使用matplotlib进行可视化操作,具体如下:

  1. def pylot_show():
  2. sql = 'select * from douban;'
  3. cur.execute(sql)
  4. rows = cur.fetchall() # 把表中所有字段读取出来
  5. count = [] # 每个分类的数量
  6. category = [] # 分类
  7.  
  8. for row in rows:
  9. count.append(int(row[2]))
  10. category.append(row[1])
  11.  
  12. y_pos = np.arange(len(category)) # 定义y轴坐标数
  13. plt.barh(y_pos, count, align='center', alpha=0.4) # alpha图表的填充不透明度(0~1)之间
  14. plt.yticks(y_pos, category) # 在y轴上做分类名的标记
  15.  
  16. for count, y_pos in zip(count, y_pos):
  17. # 分类个数在图中显示的位置,就是那些数字在柱状图尾部显示的数字
  18. plt.text(count, y_pos, count, horizontalalignment='center', verticalalignment='center', weight='bold')
  19. plt.ylim(+28.0, -1.0) # 可视化范围,相当于规定y轴范围
  20. plt.title(u'豆瓣电影250') # 图表的标题
  21. plt.ylabel(u'电影分类') # 图表y轴的标记
  22. plt.subplots_adjust(bottom = 0.15)
  23. plt.xlabel(u'分类出现次数') # 图表x轴的标记
  24. plt.savefig('douban.png') # 保存图片

下面说明一下matplotlib的一些简单使用,首先我们要导入matplotlib和numpy的包

  1. import numpy as np
  2. import matplotlib.pyplot as plt

这次可视化是柱状图,这里给出brah()函数的定义:

barh()
主要功能:做一个横向条形图,横向条的矩形大小为: left, left + width, bottom, bottom + height
参数:barh ( bottom , width , height =0.8, left =0, **kwargs )
返回类型:一个 class 类别, matplotlib.patches.Rectangle**实例
参数说明:

  • bottom: Bars 的垂直位置的底部边缘

  • width: Bars 的长度
    可选参数:

  • height: bars 的高度

  • left: bars 左边缘 x 轴坐标值

  • color: bars 颜色

  • edgecolor: bars 边缘颜色

  • linewidth: bar 边缘宽度;None 表示默认宽度;0 表示不 i 绘制边缘

  • xerr: 若不为 None,将在 bar 图上生成 errobars

  • yerr: 若不为 None,将在 bar 图上生成 errobars

  • ecolor: 指定 errorbar 颜色

  • capsize: 指定 errorbar 的顶部(cap)长度

  • align: ‘edge’ (默认) | ‘center’:‘edge’以底部为准对齐;‘center’以 y 轴作为中心

  • log: [False|True] False (默认),若为 True,使用 log 坐标

然后就可以显示出图片来了

 

原文地址:爬取豆瓣电影top250提取电影分类进行数据分析

【转】爬取豆瓣电影top250提取电影分类进行数据分析的更多相关文章

  1. Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

    大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(st ...

  2. Python爬虫小白入门(七)爬取豆瓣音乐top250

      抓取目标: 豆瓣音乐top250的歌名.作者(专辑).评分和歌曲链接 使用工具: requests + lxml + xpath. 我认为这种工具组合是最适合初学者的,requests比pytho ...

  3. python3爬取豆瓣排名前250电影信息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : doubanmovie.py # @Author: Anthony.waa # @Dat ...

  4. Python爬虫-爬取豆瓣图书Top250

    豆瓣网站很人性化,对于新手爬虫比较友好,没有如果调低爬取频率,不用担心会被封 IP.但也不要太频繁爬取. 涉及知识点:requests.html.xpath.csv 一.准备工作 需要安装reques ...

  5. 实例学习——爬取豆瓣音乐TOP250数据

    开发环境:(Windows)eclipse+pydev+MongoDB 豆瓣TOP网址:传送门 一.连接数据库   打开MongoDBx下载路径,新建名为data的文件夹,在此新建名为db的文件夹,d ...

  6. 爬取豆瓣音乐TOP250的数据

    参考网址:https://music.douban.com/top250 因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先爬取进入详细页的网址链接,进而爬取数据. 需要爬取的信息有:歌曲名.表演 ...

  7. 实例学习——爬取豆瓣网TOP250数据

    开发环境:(Windows)eclipse+pydev 网址:https://book.douban.com/top250?start=0 from lxml import etree #解析提取数据 ...

  8. Python 爬取豆瓣TOP250实战

    学习爬虫之路,必经的一个小项目就是爬取豆瓣的TOP250了,首先我们进入TOP250的界面看看. 可以看到每部电影都有比较全面的简介.其中包括电影名.导演.评分等. 接下来,我们就爬取这些数据,并将这 ...

  9. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

随机推荐

  1. BroadcastReceiver 翻译

    1. 动态注册与退出 If registering a receiver in your Activity.onResume() implementation, you should unregist ...

  2. linux中执行定时任务对oracle备份(crontab命令)

    执行定时任务对oracle表数据备份: 1.创建sh脚本 [oracle@localhost ~]$ vi bak.sh 2.添加脚本内容 #!/bin/bash #:本脚本自动备份7天的数据库,每次 ...

  3. sdut3140 A*B(math)

    题目:传送门 题目描述 Your task is to find the minimal positive integer number Q so that the product of digits ...

  4. Jmeter+jenkins如何快速搭建接口和性能测试持续集成解决方案-[基于windows篇]

    最近在用Jmeter本来想写一个详细的使用教程,突然看到有前辈已经写好了不错的教程,特此"借花献佛"整理出来分享给大家! Jenkins + Jmeter 构建接口.性能测试持续集 ...

  5. day6-面向对象

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  6. crm 使用stark组件

    # Create your models here. from django.db import models class Department(models.Model): "" ...

  7. dubbo-admin 部署

    上一章主要是谈到zookeeper的安装和部署 因为zookeeper只是一个黑框,我们无法看到是否存在了什么提供者或消费者,这时就要借助Dubbo-Admin管理平台来实时的查看,也可以通过这个平台 ...

  8. JVM内存—堆(heap)栈(stack)方法区(method) (转)

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...

  9. 【转】阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析

    转自:http://www.csdn.net/article/2015-01-23/2823687-geographic-space-base-Hadoop [编者按]交通领域正产生着海量的车辆位置点 ...

  10. lastIndexOf is not a function

    最近在开发的时候遇到了这个问题lastIndexOf is not a function,细心调试发现我传递进去的参数不是字符串类型,而且object类型,导致出现这种错误.把参数修改成字符串传递进去 ...