Python爬虫实训课

任务1:爬取猫眼电影信息 一、任务概述 爬取网址:https://maoyan.com/films?showType=3&yearId=13&sortId=3&offset=0 任务目标:爬取2018年猫眼电影信息,获取名称,类型,国家,时长,上映时间,评分,评分人数,累计票房等电影信息,将信息存储到本地并进行数据可视化。 任务框架:

二、任务实施

子任务1:爬取单部电影信息。 爬取单部电影(网址:https://maoyan.com/films/1200486),获取电影的名称,类型,国家,时长,上映时间,评分,评分人数,累计票房。信息存储于字典中如下:

步骤1:导入requests,由get方法获取网址响应(使用请求头),解析网页相应,得到网页文本数据。使用open函数创建html文件,将网页的文本数据写入html文件中,如下:

步骤2:使用open函数打开步骤1保存的html文件,重新读入网页源代码,使用BeatifulSoup来解析网页,获取电影的名称,类型,国家,时长,上映时间。获取电影名称的关键代码如下:

步骤3:破解反爬。由于评分,评分人数,累计票房这三个数据使用了反爬机制,因此无法从源码中直接获取数据,如下:

从网页中找到文字编码的URL,打开该连接,下载字体编码文件(存为base.woff) 通过footTools库可以得到base.woff文件的字符编码,如下:

打开http://blog.luckly-mjw.cn/tool-show/iconfont-preview/index.html 在该地址中可以得到base_unicode_list对应的字符:

从对应关系获取base_unicode_list对应的字符base_num_list;

base_unicode_list和base_num_list用于替换get_number函数中的值。(图中用红框框出) 编码函数get_number来实现解码,代码如下:

调用get_number函数,破解并获得评分,评分人数,累计票房数据。如下:

子任务2:爬取多部电影信息。 由目标网址一次性爬取多部电影,通过子任务1的方法获取每部电影的名称,类型,国家,时长,上映时间,评分,评分人数,累计票房。并将信息存储于CSV文件中如下:

步骤1:从网址:https://maoyan.com/films?showType=3&yearId=13&sortId=3&offset=0 中获取该页面中30部电影的详细页面地址,并打印,如下:

步骤2:遍历html文件中的所有文件名,如下:

将子任务1封装成函数get_message(),返回值为data。 构造for循环来遍历上面打印的列表,打开文件夹中的每个html文件(注意:文件名需要加上根目录),调用get_message()来获取每个html的电影信息 ,并打印,如下:

步骤3:使用pandas库来创建空的数据框,如下:

将步骤2打印的电影信息存到数据框中,数据框的每一行对应一部电影的信息,赋值后的数据框如下:

最后,采用pandas的to_csv方法将数据框存储到movie.csv文件中。 子任务3:数据可视化。 从csv文件中得到电影的票房、观影人数、评分等数据,并进行数据可视化生成2018年电影票房top10统计直方图、2018年电影热度top10以及2018年电影口碑top10统计直方图,以及2018年中外电影票房对比饼状图如下:

步骤1:生成2018年电影票房top10统计直方图 从movie.csv文件中读入数据,并按照票房数据大小进行排序,从排序后的数据中找到票房排名前十的十部电影的名称以及票房数据,分别存于movie_name以及movie_box中。 利用matplotlib中的barh方法来绘制图像,关键代码如下:

给定坐标轴名称以及标题,生成直方图。

步骤2:2018年电影热度top10统计直方图 同步骤1,按照观影人数进行排序,得到观影人数排名前十的十部电影的名称以及对应的观影人数,生成直方图。 步骤3:2018年电影口碑top10统计直方图 同步骤1,按照评分进行排序,得到评分排名前十的十部电影的名称以及相应评分,生成直方图。 步骤4:2018年中外电影票房对比饼状图 从movie.csv文件中读入数据,按照地区属性不同,分别统计2018年国内电影票房以及国外电影票房。使用matplotlib函数中的plt.pie()方法画出饼状图,该函数的用法参考以下网址: https://blog.csdn.net/htuhxf/article/details/86482563

爬虫主要是网站分析思维,网站经常更新的,代码就不适合,要会分析才是硬道理,代码都是死的

私聊

又是达内出来的?