题外话
电视剧《琅琊榜》的大热期已过,一直没时间看看究竟演的啥?于是,在度娘上找到下载地址,准备细细品味(强迫症!非要下载下来看)。
附上地址:琅琊榜高清下载地址,坑,就在整个网页54集的电视剧居然没有给一个“全选”按钮,非得点一个链接才能下载一集。这样的事情,就促成了强迫症做下了接下来的事情……
这样学习挺有意思的。
自动化处理的思路
该网页是静态页面,我的目的是使用Python将网页标签中对应的每一集的download链接爬出来,保存在windows剪切板或文本文件中,之后直接把下载链接复制到迅雷或QQ旋风等下来器中,完成下载,这样一看就很简单了, 高手勿喷啊>>。
下面是详细的过程。
开发环境win10 64位, win7以上应该都可以;
Python 2.7.10_x64;
IDE: Pycham Community Edition 5.0.1;
所需要的python库:urllib2、bs4、chardet、python_win32 API等.
代码描述
代码清单包含:clipBoardUtil.py、lybTv_main.py、lybTvSpider_Py2.py、fileRename.py、lyb_urls.txt 五个文件。
整个目录结构如下图所示:
[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):
"获取每集电视相关的网页标签, 特征值的获取:
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文件中)
效果图如下:
[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库需要手动安装一下,下载地址为:
找到自己对应的版本,由于我使用的是Python2.7.10,因此,下载的win32版本为:/Build 219/目录下的pywin32-219.win-amd64-py2.7.exe版本。注意,安装后PyCham不能立即识别,需重启一下IDE。
<>
剧集重命名下载完成后,强迫症又发现默认的剧集名称臭长难视,那就果断改名呗!文件名主要有两类,形如:
[电影天堂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()
最终的效果如下所示(这就清爽多了):
最后,附上本爬虫源代码: 项目 github 地址
END!