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

题外话

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

附上地址:琅琊榜高清下载地址,坑,就在整个网页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-spider-code


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 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运行主程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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文件中)

效果图如下:

Python-spider-run


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 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代码清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 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()

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

Python-spider-rename

最后,附上本爬虫源代码: 项目 github 地址

END!


0%