《团队-爬取豆瓣电影TOP250-需求分析》
《团队-爬取豆瓣电影TOP250-需求分析》
针对如今高速发展的社会及市场分析,人们的需求更侧重于高端产品及生活体验。而能让人们直观的,快速的了解外面的世界,媒体是最好的选择。
一、爬取页面,获取需求内容
咱们今日要爬取的是豆瓣电影top250(https://movie.douban.com/top250)
页面如下所示:
咱们需求的是里边的电影分类,经过检查源代码查询能够分分出咱们需求的东西。直接进入主题吧!
知道咱们需求的内容在哪里了,接下来就运用咱们python强壮的request库先获取页面内容下来吧!获取内容后,再运用一个好用的lxml库来剖析页面内容,然后获取咱们的内容就能够做下一步操作了。
先贴出运用request库和lxml剖析的代码
def get_page(i):
url = \'https://movie.douban.com/top250?start={}&filter=\'.format(i)
html = requests.get(url).content.decode(\'utf-8\') # 运用request库获取页面内容
selector = etree.HTML(html) # 运用lxml库获取内容
\'\'\'
经过查询页面就能发现内容在<div >下的一有些
\'\'\'
content = selector.xpath(\'//div[@]/div[@]/p/text()\')
print(content)
for i in content[1::2]:
print(str(i).strip().replace(\'\n\r\', \'\'))
# print(str(i).split(\'/\'))
i = str(i).split(\'/\')
i = i[len(i) - 1]
key = i.strip().replace(\'\n\', \'\').split(\' \') # 这儿的strip和replace的运用意图是去掉空格和空行之类
print(key)
下的一有些 ”’ content = selector.xpath(‘//div[@class=”info”]/div[@class=”bd”]/p/text()’) print(content) for i in content[1::2]: print(str(i).strip().replace(‘nr’, ”)) # print(str(i).split(‘/’)) i = str(i).split(‘/’) i = i[len(i) – 1] key = i.strip().replace(‘n’, ”).split(‘ ‘) # 这儿的strip和replace的运用意图是去掉空格和空行之类 print(key)经过获取下来的内容咱们发现一部电影的各项内容都是用’/’分隔着,咱们只需求获取电影分类中的东西,所以咱们需求运用
i = str(i).split(\'/\')
来把内容分隔成几项内容,由于电影分类排在终究,所以咱们经过
i = i[len(i) - 1]
来获取分隔后的终究一项也即是咱们需求的电影分类,还有终究一步咱们需求完结的,由于一部电影里边通常都有多个电影分类的标签,所以咱们还要持续分隔获取到的电影分类,而且查询能够知道电影分类之间仅仅用一个空格离隔,所以咱们运用下面一行代码就能够别离出各个分类:
key = i.strip().replace(\'\n\', \'\').split(\' \')
二、接下来即是保留到mysql数据库
把电影分类保留在mysql数据库以便下面进行数据剖析,这儿咱们运用到pymysql来联接mysql数据库,首要咱们需求在mysql数据库建好表:
然后咱们经过pymysql把数据保留到数据库中,代码如下:
首要要联接数据库:
# 联接mysql数据库
conn = pymysql.connect(host = \'localhost\', user = \'root\', passwd = \'2014081029\', db = \'mysql\', charset = \'utf8\') # user为数据库的姓名,passwd为数据库的暗码,通常把要把字符集界说为utf8,否则存入数据库简略遇到编码疑问
cur = conn.cursor() # 获取操作游标
cur.execute(\'use douban\') # 运用douban这个数据库
在保留到数据库之前,咱们还有一个需求做得,那即是把250部电影的分类汇总数量,所以咱们界说了一个字典来核算电影分类的个数,这儿的代码是get_page函数的一有些,代码如下:
for i in content[1::2]:
print(str(i).strip().replace(\'\n\r\', \'\'))
# print(str(i).split(\'/\'))
i = str(i).split(\'/\')
i = i[len(i) - 1]
key = i.strip().replace(\'\n\', \'\').split(\' \')
print(key)
for i in key:
if i not in douban.keys():
douban[i] = 1
else:
douban[i] += 1
然后界说一个保留函数,履行刺进操作,假定呈现刺进失利,就履行回滚操作,还有记住在操作完结往后,运用conn.close()和cur.close()来封闭数据库联接,代码如下:
def save_mysql(douban):
print(douban) # douban在主函数中界说的字典
for key in douban:
print(key)
print(douban[key])
if key != \'\':
try:
sql = \'insert douban(品种, 数量) value(\' + "\\'" + key + "\\'," + "\\'" + str(douban[key]) + "\\'" + \');\'
cur.execute(sql)
conn.commit()
except:
print(\'刺进失利\')
conn.rollback()
三、运用matplotlib进行数据可视化操作
首要,从数据库中把电影分类和每个分类的数量别离存入一个列表中,然后运用matplotlib进行可视化操作,详细如下:
def pylot_show():
sql = \'select * from douban;\'
cur.execute(sql)
rows = cur.fetchall() # 把表中悉数字段读取出来
count = [] # 每个分类的数量
category = [] # 分类
for row in rows:
count.append(int(row[2]))
category.append(row[1])
y_pos = np.arange(len(category)) # 界说y轴坐标数
plt.barh(y_pos, count, align=\'center\', alpha=0.4) # alpha图表的填充不通明度(0~1)之间
plt.yticks(y_pos, category) # 在y轴上做分类名的符号
for count, y_pos in zip(count, y_pos):
# 分类个数在图中显现的方位,即是那些数字在柱状图尾部显现的数字
plt.text(count, y_pos, count, horizontalalignment=\'center\', verticalalignment=\'center\', weight=\'bold\')
plt.ylim(+28.0, -1.0) # 可视化计划,恰当于规矩y轴计划
plt.title(u\'豆瓣电影250\') # 图表的标题
plt.ylabel(u\'电影分类\') # 图表y轴的符号
plt.subplots_adjust(bottom = 0.15)
plt.xlabel(u\'分类呈现次数\') # 图表x轴的符号
plt.savefig(\'douban.png\') # 保留图画
下面阐明一下matplotlib的一些简略运用,首要咱们要导入matplotlib和numpy的包
import numpy as np
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 坐标
然后就能够显现出图画来了