使用爬虫爬取某电影分享网站最新电影链接 -- 基于Python Requests库

前提:

我弟在搞微信群营销,使用了一个第三方微信机器人软件来群发“最新电影链接”,看着别人群里分享的各种短域名,自己却没有资源,于是来求助我,虽然对爬虫有点了解,但是从来没亲自做过爬虫,只能硬着头皮上了,于是就有了下面这个全过程。

准备工作:

先是理解一下他的需求,就是想要一个最新电影的链接,然后还要可以根据群成员的提问,比如有成员发送“爱情公寓”,那么就要通过机器人返回给“爱情公寓”的在线观看链接,形式必须是短域名,可通过手机在线观看,至于是正版还是TS,无所谓!

我需要做的,只是提供最新的电影链接,后面的工作都是微信群机器人的工作,听上去好像还没那么复杂,我只需要找到一个可以稳定观看最新电影视频的网站,然后将其播放链接爬下来,再通过网上提供的短域名转换API接口,转换为短域名,保存到本地的一个文件,供其使用即可。

说实话,这种想不劳而获,一分钱不花,就观看最新影院电影的方式,无论是通过度娘,还是谷哥,都好难找啊,不是没有,是很多,但是都是各种黑链,非常之不安全,而且这些链接,发送到微信后,都会被微信屏蔽禁止访问。

千辛万苦,总算是找到了一个网站,这里不想被认为有推广嫌疑,所以不写其网站大名了,但是这个分享网站还真是挺好的,各种乱七八糟的东西全都有,里面有个专题,就是专门分享最新电影链接的,而且都是短域名,连转换的步骤都省了,直接爬下来,存储到本地即可。

分析工作:

网站找到了,接下来就是分析一下爬虫具体要做的事情,因为这个网页分享的链接,网页源代码相当粗糙,一步一步来:

  • 第一步,先把指定的分享页面打开,爬取回来;

  • 第二步,将全部的短域名过滤出来,存储在一个列表里;

  • 第三步,再逐一将这些短域名打开,从中获取到这个视频的标题,也就是电影名称;

  • 第四步,将电影名称,对应的短域名,都存储在本地文件里,OK,完成。

这么分析下来,好像比预计的要简单很多哦!

实际编写:

  • 使用requests库,进行页面的爬取,将整个页面存储到变量中;

  • 使用re库,进行指定内容的过滤筛选,将筛选结果存储到变量中;

  • 使用os、logging库进行辅助功能的实现;

完整代码如下:

#!/usr/bin/python
# -*- coding:utf-8 -*


"""
Function: 爬取最新在线电影存储在本地
Create Time: 2018年08月12日 星期日 15时57分06秒
Author: **********@qq.com
"""

import os
import re
import requests
import logging

logging.basicConfig(filename=str(os.getcwd())+'\getmovieurl.log', level=logging.INFO, format='%(asctime)s [%(name)s] %(message)s')
logger = logging.getLogger('getmovieurl')

class GETMOVIEURL():
    """
    通过一个福利巢的一个分享站点抓取最新的在线电影链接
    """

    def __init__(self):
        self.init_url = "https://www.******.com/3971.html"
        self.dir_name = os.getcwd()

    def get_movie_url(self):
        """
        抓取全部在线电影的短域名
        """
        try:
            self.response = requests.get(self.init_url)
            self.movie_urls = re.findall('(.*?)', self.response.text)
        except Exception as e:
            logger.error("电影链接获取异常:%s" % str(e))

    def get_movie_name(self):
        """
        通过短域名链接获取视频名称
        """

        try:
            with open(str(self.dir_name) + '\\result.txt', 'w') as f:
                for i in range(1,len(self.movie_urls)):
                    self.response = requests.get(str(self.movie_urls[i]))
                    self.movie_name = re.findall('(.*?)', self.response.text)
                    if self.movie_name:
                        print "获取到最新电影:%s" % self.movie_name[0].encode('UTF-8')
                        f.write("{} {}\n".format(self.movie_name[0].encode('UTF-8'), self.movie_urls[i]))
                    else:
                        continue
        except Exception as e:
            logger.error("电影名称获取异常:%s %s" % (str(e), str(self.movie_urls[i])))

if __name__ == "__main__":
    print "正在抓取最新电影在线视频链接请等待......"
    movie = GETMOVIEURL()
    movie.get_movie_url()
    movie.get_movie_name()
    print "链接获取完毕请查看文件:result.txt......"

问题分析:

过程中,遇到了很多小问题,在这里和大家逐一分析一下:

首先是第一版的时候,没有加异常捕获,结果导致有些视频网站在打开时遇到异常退出,并没有成功抓取到;

然后是过滤不到想要的内容,先来看一下抓取网页里的源代码:

<strong>一出好戏:strong><span style="color: #333333; text-decoration: underline;">http://t.cn/RDlKmogspan><br />

我要过滤出电影名“一出好戏”,还有后面的短域名链接“http://t.cn/RDlKmog”,但是如果只使用strong关键字来过滤,会过滤出太多杂项,真心不是想要的结果,没办法,只能先过滤短域名,短域名的过滤,也遇到了点问题,就是使用正则表达式没过滤出短域名:"(*?)",这块具体的解释是这样:

  • (.*)第一个匹配分组,.*代表匹配除换行符之外的所有字符

  • (.*?)第二个匹配分组,.*?后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符

  • 后面的一个.*没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中

修改后的代码如下:

re.findall('(.*?)', self.response.text)

这样就能过滤出每个电影的短域名了。

再然后,就是通过直接打开短域名来获取电影标题,也就是这个电影的真正名字,但是吧,居然有的电影没有标题,也就是为空,这个时候又报错了,无奈只能添加if判断,为空的都跳出循环,继续寻找下一个电影;

再然后,就是从网页里爬取回来的电影名,我想一边爬取,一边打印出来,以便于可以实时观察到结果,但是吧,这个名字在我的测试环境Ubuntu 18.04下,控制台里都是乱码,没办法,只能把抓取回来的电影名重新编码一下,这块又是涉及到unicode字符和中文字符的编码问题,修改后的代码如下:

print "获取到最新电影:%s" % self.movie_name[0].encode('UTF-8')

最后,因为程序是要给别人使用的,也不知道他最终会将程序放在哪,所以需要获取脚本所在路径,然后把结果和日志,都存储在当前目录下。

最后的最后,也不知道人家电脑里有没有python程序,所以就想着,要是能打包成exe可执行文件,岂不是很方便了。

转换过程:

参考请教了一下CSDN里的其他人文章,找到一个方法,详情可参考文章:

https://blog.csdn.net/woshisangsang/article/details/73230433

但我在实际过程中,遇到了一些问题:

首先,我的windows 7是64bit的,结果我安装的python 32bit版本,我参考这篇文章安装了32bit对应的版本,结果pyinstaller的安装过程中,会提示环境错误;

然后我卸载了32bit版本,改安装64bit版本,结果最后还是有错误,没办法,我只能连带着把python都卸载了,重新安装一个和系统版本匹配的64bit版本python,再安装pyinstaller、pywin32的64bit版本,最后就正常了。

不过最终转换出来的程序,实际执行过程中,还是会报错,很无语,因为缺少库,requests库不是python默认库,只能通过第三方安装,所以,这个exe的转换不算成功,还得想办法解决库依赖的问题,这个我还在研究,研究好了再来分享。

你可能感兴趣的:(Python,Python,爬虫,Requests,电影)