【一、项目背景】
相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态。
今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来。
![80f504f15c36f7e3f523c8a9918f0d54.png](https://i-blog.csdnimg.cn/blog_migrate/5b5de73000be14b0c9c0bd86215b11ff.jpeg)
【二、项目准备】
首先 我们第一步我们要安装一个Pycharm的软件。Pycharm软件安装可以看这篇教程:Python环境搭建—安利Python小白的Python和Pycharm安装详细教程。
电影天堂网的网址:
https://www.ygdy8.net/html/gndy/dyzz/list_23_1.html
我们需要下载几个库,怎么下载呢?首先打开Pycharm点击File再点开setting。
![e9348a3cab20ff4235d047cd04cac506.png](https://i-blog.csdnimg.cn/blog_migrate/9a0fe25c3ec8cd6e4685f3b27037b70e.jpeg)
打开后会出现这个界面点击你的项目名字(project:(你的项目名字))project interpreter点击加号下载我们需要的库本项目需要(requests,requests,time,re模块),如下图所示。
![ac30fbd93628d81a779768c54966e2b6.png](https://i-blog.csdnimg.cn/blog_migrate/e274057723c9a4dc1529e327f2601b9c.jpeg)
如果不会加载解释器的话,可以参考这篇手把手教程:安装好Pycharm后如何配置Python解释器简易教程。
如果还缺少相应库的话,可以按照如下方式进行下载和安装。
![37d4b625013a1ef14441e6a8542e8eec.png](https://i-blog.csdnimg.cn/blog_migrate/0660e7abd1eeaff292412934e18d7e4a.jpeg)
【三、项目实施】
我们需要(requests,requests,time,re模块 ),如下图所示。
![6edfff2e761dd55b1c032ee81a45f790.png](https://i-blog.csdnimg.cn/blog_migrate/5945a3bd1d9f31d0007b5ead3baa2dd2.jpeg)
用封装方法去实现各个部分功能。首先要写一个框架 :构造一个类FilmSky 然后定义一个—init方法里继承(self),再定义一个主方法(main)。最后实现这个main方法。代码如下:
![51817b7ebdd7035709773d5adc1130ee.png](https://i-blog.csdnimg.cn/blog_migrate/3e7ad1cc0525d272e5b815742e2e251c.jpeg)
这个time是用于防止反爬,设置的时间延时。
首先我们来分析一下这个网址下一页得到特点。
![df1c07f701dbe861f39dbc60ff9dc861.png](https://i-blog.csdnimg.cn/blog_migrate/50ec8030d1e11ba820fc6b7f93a7cb08.jpeg)
通过点击了三页我们会发现地址都是在原有的基础上“23—3,4,5”这样的变化。
我们可以用{}去代替变化的值就像这样:
https://www.ygdy8.net/html/gndy/dyzz/list_23_{}.html
这样我们在inti方法初始化url地址和构造请求头。
![b453e3920ee4bff460b3e03ce2529a4d.png](https://i-blog.csdnimg.cn/blog_migrate/2dcbed1c81f12fc0fddccb361c060046.jpeg)
在主方法main函数里边用for循环实现遍历网址。
![362fc84e5300944768b28b54d8743f2b.png](https://i-blog.csdnimg.cn/blog_migrate/e041c9bbaf6d86b28a2d19e475c01c12.jpeg)
得到下图这样的结果:
![ff1f39de727eda530516834551ec7854.png](https://i-blog.csdnimg.cn/blog_migrate/3aa733da4ac200c6329d868070a6ed44.jpeg)
说明你已经成功一半了加油!!
现在我们需要对这些网址发生请求,为了更直观的看出来,我们用一个类写。
我们用requests发生请求 这个网站的编码是gbk (怎么看网站的编码?)。
打开一个网站右键检查在header的标签,以这个网站为例,可以看到charset=“gb312”。
这个gb2312就是编码 我们常见的编码方式有2种(utf_8, gbk)。
![156da667bc9eca8aed63bfc39b6742f3.png](https://i-blog.csdnimg.cn/blog_migrate/ccaa81a7266dc635f0516563360ac185.jpeg)
![23af2fd1bfae6585978cac1027e080af.png](https://i-blog.csdnimg.cn/blog_migrate/0ffad8a331e00bbe2f4446316bff8d74.jpeg)
我们可以验证一下是不是真的请求到了。使用Print(html)看到这个结果(一个完整的html网页)说明请求成功。
![21258dabde5ce03c418e11771dba8a06.png](https://i-blog.csdnimg.cn/blog_migrate/71acfff347c690ba19b9d14133943793.jpeg)
我们再定义这个方法(对我们的网页代码进行解析)。
我们用正则表达式 来解析数据 我们右键检查可以看到我们要的网站在table里面的
标签的 标签的标签的href。![e62527f22cd67dada1c5859f3ef8f160.png](https://i-blog.csdnimg.cn/blog_migrate/b73f5656639ecd77b7a8abbaa089be45.jpeg)
所以我们可以先找到table,一层一层的去找,可以参考一下下面的图。
![b8318cabc0f56655469a84e8a52a686e.png](https://i-blog.csdnimg.cn/blog_migrate/8a8102773744b49f41ef7f52f7aa3f18.jpeg)
正则表达式就是(.*?)里面就是你想要得到的内容,“.*?”就是可以省略其中的标签,取到你想要地区那一层。for循环遍历得到每个网址,点击这些网址我们要对二级页面发生请求,并解析它。
因为在网页网址上的链接有一些是空的 ,所有这样会导致电影下载的链接不匹配。所以我们要加个判断,如果下载链接的长度大于0那么就照常显示,否则就给它一个空值,这样就不会不对应了。最后返回这个结果,如下图所示。
![7597af829df739b025ee6d26288ba3f2.png](https://i-blog.csdnimg.cn/blog_migrate/b1682cfe13f1adc607635fbdb8b13a55.jpeg)
点开第二级页面如图右键点击下载链接,如下图所示:
![fc890d3c319ca8b346a7b1a94fa6d6af.png](https://i-blog.csdnimg.cn/blog_migrate/c2837b766899f0d9fb782ff1cbe4f247.jpeg)
![fb2f1fb510e84c273a88118c74a1b790.png](https://i-blog.csdnimg.cn/blog_migrate/3a7cedd2572e06a29058e26174c19e56.jpeg)
我们用正则表达式解析 得到我们下载链接地址,如下图所示:
![9d3f44271dc068fdd96b6a0c0cce4a8a.png](https://i-blog.csdnimg.cn/blog_migrate/15a015e0f8566bba54e800a8aa16554b.jpeg)
看去了不是很美观,我们把链接处理一下,如下图所示:
![50c797c8e471b079734e0ab520b52e85.png](https://i-blog.csdnimg.cn/blog_migrate/6840746d352e8ac13b639fe7270b391f.jpeg)
得到结果,如下图所示:
![0ee5575961d4b96812118e806d9f72af.png](https://i-blog.csdnimg.cn/blog_migrate/25fe52ff253986f81f7a34181e62fa9d.jpeg)
最后我们用把数据保存在一个字典加上下载链接和电影名字:
![a0c03b4bbf55396d269675cb4160022a.png](https://i-blog.csdnimg.cn/blog_migrate/4eb072b4ce1338ce1e60995ff7ca9298.jpeg)
最后我们优化一下请求的代码有点重复 我们优化一下;
用一个值去保存说明请求头的内容以后请求我们只有调用这个方法进行请求就好,如下图所示:
![a66403bb8b57085c989f20de9a953de7.png](https://i-blog.csdnimg.cn/blog_migrate/1f1b4bd9e66403ac0285fb2024f79996.jpeg)
程序运行之后可以看到效果图,如下图所示:
![7e8130e1d335fa57167ede3901833011.png](https://i-blog.csdnimg.cn/blog_migrate/68a7d1b12a7039f81e613b18fa606d7f.jpeg)
点击蓝色的链接就可以这个下载(要下载迅雷 迅雷下载更快哇)
这样是不是能够更直观的看出你要电影啦?点击即可下载噢!
【五、总结】
1. 本文基于Python网络爬虫技术,提供了一种更直观的去看自己喜欢的电影并且方便下载的方式。
2. 不建议抓取太多,容易使得服务器负载。
3. 需要本文代码的话,后台回复“电影天堂”四个字即可获取。
想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/