Python爬虫程序:电视剧琅琊榜全集的自动化处理

题外话

电视剧《琅琊榜》的大热期已过,一直没时间看看究竟演的啥?于是,在度娘上找到下载地址,准备细细品味(强迫症!非要下载下来看)。

附上地址:[琅琊榜高清下载地址](http://www.dy2018.com/i/95650.html),坑,就在整个网页54集的电视剧居然没有给一个“全选”按钮,非得点一个链接才能下载一集。这样的事情,就促成了强迫症做下了接下来的事情......

这样学习挺有意思的。

自动化处理的思路

查看整个下载地址:http://www.dy2018.com/i/95650.html,该网页是静态页面,我的目的是使用Python将网页标签中对应的每一集的download链接爬出来,保存在windows剪切板或文本文件中,之后直接把下载链接复制到迅雷或QQ旋风等下来器中,完成下载,这样一看就很简单了, 高手勿喷啊>>。

下面是详细的过程。

开发环境

  1. win10 64位, win7以上应该都可以;
  2. Python 2.7.10_x64;
  3. IDE: Pycham Community Edition 5.0.1;
  4. 所需要的python库:urllib2、bs4、chardet、python_win32 API等.

代码描述

代码清单包含:clipBoardUtil.py、lybTv_main.py、lybTvSpider_Py2.py、fileRename.py、lyb_urls.txt 五个文件。

整个目录结构如下图所示:

Python爬虫程序:电视剧琅琊榜全集的自动化处理_第1张图片

[1]. 首先创建lybTvSpider_Py2.py文件,获取网页源码进行解析,是功能实现的主要内容。

# lybTvSpider_Py2.py
# coding=utf-8
# python-version: 2.x

import urllib2
import bs4
import chardet


class LybTvSpider:
    "琅琊榜电视剧爬虫工具类"

    def __init__(self):
        "构造函数"
        self.__headers = ('User-Agent',
                          'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
        self.__opener = urllib2.build_opener()
        self.__opener.addheaders = [self.__headers]

    def open_url(self, url):
        "指定URL,打开链接地址"
        content = self.__opener.open(url).read()
        encoding = chardet.detect(content)['encoding']
        content = content.decode(encoding, 'ignore')

        return content

    def get_tvs(self, content):
        "获取每集电视相关的网页标签, 特征值的获取: <td style='WORD-WRAP: break-word><a></a></td>"
        soup = bs4.BeautifulSoup(content)
        # 查找所有的带属性"style='WORD-WRAP: break-word"的'td'标签,
        tvs_list = soup.findAll('td', style='WORD-WRAP: break-word')

        return tvs_list

    def get_download_url(self, tvs_list):
        "获取每集电视中的下载地址"
        tvs_list_url = []

        for tv in tvs_list:  # 遍历标签
            tvs_list_url.append(tv.a['href'] + "\n")  # 获取所有的下载列表添加到list中

        return tvs_list_url

    def save_download_urls(self, tvs_list_url):
        "将下载链接保存至文件"

        fr = file("lyb_urls.txt", "w+")
        for item in tvs_list_url:
            fr.write(item.encode("utf-8"))
        fr.close()


def main_test():
    "模块测试"

    url = "http://www.dy2018.com/i/95650.html"

    lybTvSpider = LybTvSpider()
    content = lybTvSpider.open_url(url)  # 获取网页源代码,同在浏览器中右键查看源代码内容一致
    # print content

    tvs = lybTvSpider.get_tvs(content)
    print "tvs List---> ", tvs

    tvs_url = lybTvSpider.get_download_url(tvs)
    print "tvs_url ---> ", tvs_url

    lybTvSpider.save_download_urls(tvs_url)


if __name__ == "__main__":
    main_test()

其中用到的Python类库urllib2、bs4、chardet,可使用PyCham快捷键Alt + Enter, 代码提示后自动安装,这个功能很赞!

[2]. lybTv_main.py运行主程序:

# lybTv_main.py
# coding=utf-8
# python-version: 2.x

from lybTvSpider_Py2 import LybTvSpider
from python27.python35 import clipboardUtil

url = "http://www.dy2018.com/i/95650.html"

lybTvSpider = LybTvSpider()
content = lybTvSpider.open_url(url)  # 获取网页源代码,同
tvs = lybTvSpider.get_tvs(content)
tvs_url = lybTvSpider.get_download_url(tvs)

# 将下载地址复制到剪切板,之后就可以用下载器批量下载了
clipboardUtil.setText("".join(tvs_url))
# print str(clipboardUtil.getText()).decode("GBK")

# 同时在文本文件中保存一份下载地址
lybTvSpider.save_download_urls(tvs_url)  

说明:当我们解析到完整的下载地址后并存放到了tvs_url 列表当中,tvs_url 已经格式化了,在每个下载地址后添加了换行符“\n”,这时,我们就可以将下载地址直接保存到windows系统的剪切板中,同时打开迅雷或QQ旋风等下载器将会自动识别windows剪切板中的下载地址,只需点一下下载器的下载按钮就可以开始Downloading了……(代码中为了防止出错,添加了save_download_urls(self, tvs_list_url)函数,可以将所有的下载地址保存在lyb_urls.txt文件中)

效果图如下:

[3]. 使用到clipboardUtil.py代码如下:

# clipBoardUtil.py
# coding=utf-8
# 使用win32 api 操作Windows剪切板

# import sys
# sys.path.append("/to/path/win32clipboard")
# sys.path.append("/to/path/win32con")

import win32clipboard as w
import win32con


def getText():
    "获取windows剪切板内容"
    w.OpenClipboard()
    d = w.GetClipboardData(win32con.CF_TEXT)
    w.CloseClipboard()

    return d


def setText(aString):
    "设置windows剪切板的内容"
    w.OpenClipboard()
    w.EmptyClipboard()

    # 设置Unicode编码格式
    w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
    w.CloseClipboard()


def main():
    "测试程序"
    print getText()
    setText("我在剪切板中")
    print getText()


# 判断是否是在直接运行该.py文件
if __name__ == "__main__":
    main()
Python调用Win32API使用Windows的剪切板功能,win32的Python库需要手动安装一下,下载地址为:

http://sourceforge.net/projects/pywin32/files/pywin32/。

**找到自己对应的版本,由于我使用的是Python2.7.10,因此,下载的win32版本为:/Build 219/目录下的pywin32-219.win-amd64-py2.7.exe版本。注意,安装后PyCham不能立即识别,需重启一下IDE。**

更为具体的win32安装请见博客:http://blog.sina.com.cn/s/blog_523491650100hevh.html

<<至此,程序基本上就搞定了>>

剧集重命名

下载完成后,强迫症又发现默认的剧集名称臭长难视,那就果断改名呗!文件名主要有两类,形如:
[电影天堂www.dy2018.com]琅琊榜_21.720p未删减版.mp4 和
琅琊榜_20.720p未删减版[电影天堂www.dy2018.com].mp4,目标是变成这样的:琅琊榜_20.mp4。具体描述如下:

[4]. fileRename.py代码清单:

# fileRename.py
# coding:utf-8

import os
import sys  # 设置系统默认编码格式:utf-8
reload(sys)
sys.setdefaultencoding('utf8')


def renameFiles(dirPath):
    "指定文件目录,重命名该目录下以.mp4结尾的文件"
    os.chdir(dirPath)  # 切换到当前目录下
    dirContent = os.listdir(dirPath)

    for file in dirContent:
        if file.startswith("[") and file.endswith('.mp4'):
            temp = file.split(']')
            content = temp[1].split(".")
            newName = content[0] + "." + content[len(content) - 1]
            os.rename(file, newName)

            print file + " -> " + newName + " ------> OK!"
        elif file.endswith(".mp4"):
            temp = file.split('.')
            newName = temp[0] + "." + temp[len(temp) - 1]
            os.rename(file, newName)

            print file + " -> " + newName + " ------> OK!"

    return;


def main_test():
    "在当前模块中测试"
    renameFiles("D:\迅雷下载".encode('GBK'))


if __name__ == "__main__":
    main_test()

最终的效果如下所示(这就清爽多了):

END!

你可能感兴趣的:(python,爬虫,自动化,琅琊榜下载)