python之爬虫神器selenium:猫眼电影榜单并进行数据可视化

article/2025/9/29 14:17:25

如果你在学习爬虫,那么你一定爬取过豆瓣或猫眼电影的榜单,但大多数教程都是用的requests+正则,但对于很多新手来讲,requests获取网页容易,但是用正则表达式解析网页就难的多了。那么,让我们告别看不懂,也写不好的正则吧,本文通过HTML解析器来爬取猫眼榜单电影,并基于爬取的数据做一个简单的数据分析。

 

1.爬虫


如果你看过网易云音乐上万首hiphop歌曲解析rapper们的最爱(爬虫篇)一文,那么selenium你一定熟悉,然而,那篇文章用到的PhantomJS已经被抛弃了,所以在使用的时候会显示warning。所以,本文需要用webdriver.Chrome()直接模拟浏览器。在开始之前,请确保已经正确安装好Chrome浏览器并配置好了ChromeDriver;另外,还需要正确安装Python的Selenium库。配置部分直接百度,就有大量文章介绍。

第一步呢,肯定是分析网页啦。

我们要爬取就是该部分的内容,通过翻页,观察一下url的变化。

第二页:

第三页:

聪明的你一定发现了,变化只是offset后面的值,也就是每页都加了10,倒推回第一页,对应的是offset=0。那么我们爬取页面的时候,只需要变换该部分就OK了。

网页分析的常规操作,看元素:

我们想要的就在<dl class="board-wrapper">下面的<dd>里面。在具体分析其中一个<dd>:

那么接下来就非常简单了。直接上代码:

 1from tqdm import tqdm2import time3from selenium import webdriver4from selenium.common.exceptions import TimeoutException, WebDriverException5import pandas as pd67def get_one_page(url):8    try:9        #打开浏览器窗口
10        driver = webdriver.Chrome()
11        driver.get(url)    
12        data = driver.find_element_by_class_name("board-wrapper").find_elements_by_tag_name("dd")
13
14        for j in range(len(data)):
15            #获取电影名称
16            name.append(data[j].find_element_by_class_name("name").text)
17            #获取主演
18            star.append(data[j].find_element_by_class_name("star").text)
19            #上映时间
20            publish.append(data[j].find_element_by_class_name('releasetime').text)
21            #得分:整数+小数
22            score.append(data[j].find_element_by_class_name('integer').text + data[j].find_element_by_class_name('fraction').text)
23        time.sleep(5)
24        #关闭窗口
25        driver.quit()
26        return data
27    #报错重新获取
28    except TimeoutException or WebDriverException:
29        return get_one_page()
30
31name,star,publish,score=[],[],[],[]
32for i in tqdm(range(0,91,10)):
33    print("\n获取第{}个页信息!".format( (i//10) +1))
34    url = 'http://maoyan.com/board/4?offset='+str(i)
35    get_one_page(url)
36
37movie = {'name': name, 'star': star, 'publish': publish, 'score': score}
38movie = pd.DataFrame(movie, columns=['name', 'star', 'publish', 'score'])
39movie.to_csv("movie_top100.csv",encoding="utf_8_sig")  

非常简单吧。

 

2.数据可视化


由于这次爬取的数据很少,这里也只是做了简单的可视化。

 

主演分布:

第一名是大家心中永远的哥哥:张国荣,100部电影电影,他主演的就有6部,其次是周星驰,梁朝伟。很意外吧,前三都是中国的,而且居然还都是香港的。

 

电影名称长度:

长度为4,5,6占了近3/4,看来电影名称不宜太短,也不宜太长啊。

 

发行国家:

虽然我们爬取的数据,没有发行国家这一项,但是通过观察,发现有一些电影的发行日期后面接了发行国家,所以我们将这部分数据拿出来,简单看看哪个国家的电影更优。

最多的是没有数据的。暂且不考虑它。单独看国家数据,美国遥遥领先,毕竟好莱坞嘛。日本、韩国紧随其后,擅长细腻、写实的电影风格看来很受人欢迎。

 

发现年份:

发行时间数据其实还有蛮多可做的,年份、月份、星期都能做可视化:

2011年左右是好电影的爆发期啊。90年代是港片的巅峰,也是佳片云集。

 

发行月份:

月份的话,简单的看,好像冬季发行的电影好片更多。

 

发行星期:

星期五是电影发行的集中段,可能和该时间段发行,有助于票房的原因吧,同理,没有星期天发行,也是怕影响票房,毕竟接下来大家都上班上学了。(0表示的是没有相关数据)

 

星期和评分:

其实,因为是top100的电影,他们的评分不会有多大的差距,所以可视化没有考虑分数,最后也只是做个简单的展示而已,还是能够看出,星期和评分之间没有什么关系,趋势非常平缓。

代码:

 1import seaborn as sns2import matplotlib.pyplot as plt3plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']#指定默认字体  4plt.rcParams['axes.unicode_minus'] =False # 解决保存图像是负号'-'显示为方块的问题5sns.set(font='SimHei')  # 解决Seaborn中文显示问题67data = pd.read_csv("movie_top100.csv")89#电影明星分布
10data["star"] = data["star"].apply(lambda x: x.replace("主演:",""))
11data["star"] = data["star"].apply(lambda x:x.split(","))
12star=[]
13for i in range(100):
14    star.extend(data["star"][i])
15star = pd.value_counts(star)
16
17sns.set_context('talk')
18fig = plt.figure(figsize=(30, 10))
19ax = sns.barplot(x=star[:30].index, y=star[:30].values)
20ax.set_title('Rate of star')
21ax.set_xticklabels(star.index, rotation=90)    
22
23#电影名字长度分布
24name_len = data["name"].apply(lambda x: len(x))
25name_len = name_len.value_counts()
26fig = plt.figure(figsize=(15, 15)) 
27plt.pie(name_len.values,labels=name_len.index,autopct='%1.2f%%') #画饼图(数据,数据对应的标签,百分数保留两位小数点) 
28plt.title("电影名字长度") 
29plt.show()
30
31#电影发行日期
32#发行国家
33data["country"] = data["publish"].apply(lambda x: x[15:] if len(x)>15 else '')
34#发行年月日
35data["time"] = data["publish"].apply(lambda x: x[5:15])
36data["year"] = data["time"].apply(lambda x: x[0:4])
37data["month"] = data["time"].apply(lambda x: x[5:7] if len(x)> 4 else '')
38data["day"] = data["time"].apply(lambda x: x[8:10] if len(x)> 4 else '')
39
40#新建立星期信息
41from datetime import date
42def getWeekday(row):
43    if len(row) <= 4:
44        return 0
45    else:
46        return date(int(row[0:4]), int(row[5:7]), int(row[8:10])).weekday() + 1
47data['weekday'] = data['time'].apply(getWeekday)
48
49#发行国家
50country = data["country"].value_counts()
51fig = plt.figure(figsize=(15,10))
52sns.barplot(country.index,country.values)  
53fig.show()  
54
55#对出行时间进行可视化
56year = data["year"].value_counts()
57year = year.sort_index()
58fig = plt.figure(figsize=(17,10))
59sns.pointplot(year.index,year.values,alpha=0.5)
60fig.show
61
62month = data["month"].value_counts()
63month = month.sort_index()
64fig = plt.figure(figsize=(15,10))
65sns.barplot(month.index,month.values)  
66fig.show()
67
68weekday = data["weekday"].value_counts()
69weekday = weekday.sort_index()
70fig = plt.figure(figsize=(15,10))
71sns.barplot(weekday.index,weekday.values)  
72fig.show()  
73
74fig = plt.figure(figsize=(15,10))
75sns.boxplot(data["weekday"],data["score"])  
76fig.show()   

 

通过本文学习,是不是发现爬虫很简单啦。胡萝卜酱给大家的建议就是多练,熟能生巧,ヾ(◍°∇°◍)ノ゙!

更多内容,关注:经管人学数据分析


http://chatgpt.dhexx.cn/article/kCwqFxSx.shtml

相关文章

安卓 页面跳转_曲奇影视:支持安卓+苹果,新出来的双端手机看片神器。

重磅&#xff01;下载资源必读&#xff1a; 亲&#xff0c;不知道如何下载我们提供的资源&#xff1f;点这里&#xff0c;让下载资源变得更简单&#xff01; 安卓APP闪退、打不开、无法使用必读&#xff1a; 亲&#xff0c;手机不兼容怎么办&#xff1f;点这里&#xff0c;解决…

万能神器python

Python除了不能帮你生孩子&#xff0c;什么都能做&#xff01; “朋友最近跟师兄学瞭个黑科技&#xff0c;每天鼓捣一下&#xff0c;俩月挣瞭几万块。” 他还趁着挖礦热潮&#xff0c;倒卖瞭一波原价显卡&#xff0c;4张華硕 RTX 3080Ti&#xff0c;挣瞭8k。 這玩意我抢瞭一个月…

宅男福利!程序员周末看片神器,关键还开源

开源最前线&#xff08;ID&#xff1a;OpenSourceTop&#xff09; 猿妹整理 别人眼中的程序员一定是这样的——每天有接不完的需求&#xff0c;写不完的代码&#xff0c;改不完的Bug&#xff0c;但大多数程序员偶尔也是有周末的。 你是否有出现这种情况&#xff0c;连续加了好几…

linux下网络播放器,月亮播放器:Linux无广告看片神器

在 LinuxMint/Ubuntu 系列系统中&#xff0c;使用如下 PPA 安装月亮播放器&#xff1a; sudo add-apt-repository ppa:cos-lyk/moonsoft sudo apt update sudo apt install moonplayer 安装完毕&#xff0c;月亮播放器就在你的主菜单之“影音”类别中等你了。启动月亮播放器&am…

java web打包神器_前端开发人员的桌面应用神器 Electron

原标题:前端开发人员的桌面应用神器 Electron 01 为什么用 Java 来开发桌面应用? 曾经的 Java 脆弱、简陋、甚至有被边缘化的危险,不过 Java 在经过了两次飞跃后(以 V8 为首的 Java 引擎和 Node.js 的问世),不再受人欺负,早已升级为绿博士(复仇者联盟 4 中班纳博士和绿巨人…

最新上架!双端暗含福利,真正的看片神器!

&#xff08;文末有额外福利哦❤️&#xff09; 嗨&#xff0c;小伙伴们你们好呀~ 我经常在后台留言看到 有些小伙伴想要IOS端的看片软件 奈何很多影视资源都是安卓 今后我也会尽量去找支持双端的 希望能满足每一位小伙伴的需求 今天&#xff0c;这不就来了吗 那就拿来吧~ 这是…

程序员看片神器抱回家

近些日子有很多朋友都被迫在家&#xff0c;百般无聊&#xff0c;于是我们决定联合了10个号主送小米VR一体机超级玩家版&#xff0c;让大家可以在家中看影院视觉的电影&#xff0c;玩VR游戏等。这个冬天你不再孤单&#xff0c;祝大家幸福安康~ 赠送规则 本次活动联合了其他 9 个…

苹果安卓最新看片神器各种实用功能,帮你一年省下上千块!

说到看片神器&#xff0c;之前就给大家介绍过很多款&#xff0c;虽然说免费又好用&#xff0c;但是基本上寿命不长&#xff0c;用着用着就阵亡了...... 今天给大家带来一个最新的软件——影迷大院&#xff0c;这个软件目前还是非常好使的&#xff01;&#xff0c;目前基本上是…

精品手机看片神器电影网址导航网站

你是不是想找可以免费在线看电影电视剧的网站&#xff0c;但总是找不到可以正常使用的影视网站。其实要想找可以手机免费看片的电影网站&#xff0c;直接找一些优质的导航网站即可&#xff0c;这些导航网站收录了大量的精品影视资源网站。如果你是自己网上查找&#xff0c;会经…

Oracle 11g DataGuard 搭建笔记(Windows Server 2016)

0.目录 目录 0.目录 1.需求 2.开发环境 3.DataGuard主从库参数环境规划 4.网络环境 5.主库-DataGuard配置 5.1查询及启用强制记录日志 5.3查询及启用归档 5.4主库参数配置 5.4.1查看db_unique_name及修改 5.4.2修改参数log_archive_config 5.4.3修改参数log_archive_dest_1 5.4…

oracle11g dataguard

1. 主库必须处于 归档模式 必须设置数据库强制归档&#xff0c;否则复制到备库有块损坏 1. 确定数据库25是否处于归档模式 SQL> select name,log_mode from v$database; NAME LOG_MODE --------- ------------ ORCL ARCHIVELOG 2. 查看数据库是否强制记录日志…

oracle ogg dataguard,Oracle DataGuard与GoldenGate比较

一、复制方式 • Golden Gate 可提供秒一级的大量数据实时捕捉和投递&#xff0c;无法实现同步复制&#xff1b; • Data Guard 最大保护—Maximum protection 最大可用—Maximum availability 最大性能—Maximum performance 最大保护&#xff0c;最大可用模式都需要同步传输日…

oracle 9i 11g dataguard,Oracle 11g DataGuard使用总结

Oracle 11g的dataguard相比于10g来说&#xff0c;最优越的特性应该算就是active dataguard了&#xff0c;这一点改进在很大意义上促使用户需要把数据库从10g升级到11g,读写分离在这个时候得到了升华&#xff0c;而且在后台会根据需要进行数据的同步&#xff0c;相比于使用10g&a…

mysql可以使用dataguard,DataGuard相关参数

定义数据库唯一名称&#xff0c;因为DB_NAME参数对于物理数据库是必须相同&#xff0c;对于逻辑数据库必须不同&#xff0c;所以在Oracle 10g中引入DB_UNIQUE_NAM DB_UNIQUE_NAME 定义数据库唯一名称&#xff0c;因为DB_NAME参数对于物理数据库是必须相同&#xff0c;对于逻辑数…

oracle dataguard详细,Oracle数据库DataGuard参数配置与参数详解

oracle数据库Data Guard参数配置与参数详解 1. Oracle 11g Dataguard参数详解 就Oracle Data Guard来说&#xff0c;我们只关注如下三种参数&#xff1a; 1 独立于数据库角色的参数 2 数据库角色为primary时的参数 3 数据库角色为standby时的参数 虽然DG有着非常多的配置参数&a…

oracle11 dataguard,探索Oracle之11g DataGuard

1、什么是DataGuard DataGuard是Oracle推出的一项专门针对oracle数据库的高可用技术&#xff0c;在8i之前被称之为Standby Dtabase&#xff0c;从9i开始正式更名为DataGuard。通常情况下至少会有两个数据镜像节点构成的主备关系。通过redo日志的同步技术来保证数据的实时同步&a…

oracle取消dataguard,Oracle Dataguard的强制切换

【前言】Dataguard的从库一般情况下都是出于数据的抽取和查询的作用的&#xff0c;但是万一在主库发生故障的情况下就需要切换到备库了。而这种故障的切换往往又是灾难性的情况&#xff1a;比如主库的服务器根本就起不来了&#xff0c;没有办法进行正常的切换&#xff0c;就需要…

Oracle19c DataGuard

为记录的更详细点&#xff0c;文章经过二次编辑&#xff0c;有几张图的时间对不上&#xff0c;不过不影响查阅。 CSDN排版不太友好&#xff0c;有些代码的进位都给省略了。 文章早就编辑好了&#xff0c;由于一些原因一直没发出来。 根据自己的环境&#xff0c;一定要仔细比对d…

oracle dataguard延迟,dataguard延迟日志应用的问题

本帖最后由 lfree 于 2012-12-11 12:07 编辑 我管的dataguard使用recover managed standby database disconnect from session delay 720。 我发现一个问题&#xff0c;如果使用asm作为存储&#xff0c;会出现"大量“读取操作。 snap.jpg (10 KB, 下载次数: 43) 2012-12-1…

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(01)—— dataguard 服务器安装 Oracle 软件

Oracle Dataguard&#xff08;主库为 Oracle rac 集群&#xff09;配置教程&#xff08;01&#xff09;—— dataguard 服务器安装 Oracle 软件 / 本专栏详细讲解 Oracle Dataguard&#xff08;Oracle 版本为11g&#xff0c;主库为双节点 Oracle rac 集群&#xff09;的配置过程…