前言
本来是爬豆瓣电影 Top250 的,数据都爬下来了,发现后面的数据分析不太好做,然后就去爬猫眼了。
爬虫目标
- 爬取猫眼电影 Top100 的电影名称、人物、时间、评分等,并保存为 csv 文件;
- 对所爬取的数据进行一定的分析。
环境:Win10 + Python3.7 (以及一些第三方库) + SublimeText3
基本步骤
URL 分析
先进入 ( https://maoyan.com/board/4?offset=0 ) ,点击第二页,发现链接变为 ( https://maoyan.com/board/4?offset=10 ),就只有 offset=XXX
参数变了;进一步发现每页只有 10 部电影,所以第一页 offset=0
, 第二页 offset=10
,依次类推,只需要 10 次循环就能爬完 100 部电影了。
获取页面
直接用 requests.get() 来获取页面:
1 | # 获得网页的 html 文本 |
这个页面几乎没有反爬,所以成功获取页面的图片就不上了;接下来就可以开始解析页面了。
页面解析
右键-检查- Elements 选项 (或按 F12
) 进入调试页面,
可以看到要抓取的电影信息都包含在一个 <dl class="board-wrapper">
标签下的 <dd>
标签里,更具体的可以看到:
电影名称在一个 <p class="name">
的标签里;
主演在一个 <p class="star">
的标签里;
上映时间和电影出自哪个地区 (有的电影可能没有写地区) 在一个 <p class="releasetime">
的标签里;
电影评分就在 <p class="score">
的标签里,只是整数和小数部分是分开的,一会儿合起来就行了。
这里采用较为简单的 BeautifulSoup 来解析页面 ;
提一下 find()
和 find_all()
的区别:
find()
选取到的是第一个满足选取条件的标签find_all()
选取到的是所有满足选取条件的标签
强大的 BeautifulSoup 可以越过父节点直接选取;有时间学学其他的,比如什么 xpath、正则啥的。
官网:BeautifulSoup;良心官网啊,有中文文档。
具体代码如下:
1 | # 把上映时间和上映地区分开 |
保存数据
利用 csv 包的 DictWriter()
函数将字典格式的数据写入 csv 文件;
1 | def WriteDictToCSV(csv_file, csv_cols, dict_data) : |
分页爬取
最后就只需要改变 offset 参数的值,代码如下:
1 | if __name__ == '__main__': |
这样就完成了猫眼电影 Top100 的爬取,结果如下:
数据分析
接下来对抓取下来的数据进行简单的数据分析,顺便学一下基础的图表。
评分最高的 10 部电影
这里用柱状图来呈现,代码如下:
1 | # 分析评分最高的 10 部电影 |
结果如图:
呃,,,才看过一半,有机会再看看其他的吧。
参演电影数量最多的 10 位演员
这里也用柱状图来呈现,画图和上面差不多,说一下主要思路和遇到的问题;
思路很简单,对所有演员去重之后分别统计其参演电影数量就行;当然,参演数量为 1 的就不考虑了,不然太多了。
期间遇到一个问题:排序之后的结果不稳定。就是参演电影数量一样的演员,在每次排完序后,姓名的顺序都是不一样的!
搜了一下,用 lambda 函数(叫函数还是表达式我也不知道)解决;还需要学一学啊。
1 | # 先按第 1 维的值排序,再按第 0 维的值排序 |
结果如图:
各国家(或地区)电影数量
用水平柱状图来看一下这 100 部电影都是来自哪些国家或地区,代码如下:
1 | # 分析各国家/地区的电影数量 |
结果如图:
美国电影这么多上榜的倒是一点也不意外,中国的这么少就稍微有点意外了。
各年份的电影数量
用折线图看一下各年份的电影数量,代码如下:
1 | # 分析各年份的电影数量 |
结果如图:
看来 2010、2011 两年出了不少好电影啊,不过那时候在读初中,没什么印象。