0x01 前言
我和我的家人都喜欢看各种连续剧,但因为各种因素,只能到网上下载资源并存放到家里的媒体服务器中。
要知道下载存有下载链接的网站都有很多广告和弹窗信息,真是太令人厌烦了。同时他们的网站也不支持chrome 浏览器,很难一键获取所有链接以便用于迅雷下载。正好我开始学习python ,以下是我的第一个python 脚本。
0x02 准备
我使用python 3与BeautifulSoup 作为基础,同时使用网站4567.tv 的数据,地址如下:
http://www.4567.tv/film/id19654.html
导入urlopen 与BeautifulSoup 模块并解析网页:
#导入urlopen 模块 from urllib.request import urlopen #导入BeautifulSoup 模块 from bs4 import BeautifulSoup #手动输入id 变量 req_id = 'id19654' #构造链接以便引用 html_req_url = 'http://www.4567.tv/film/' + req_id + '.html' #抓取链接的内容 html_content = urlopen(html_req_url) #解析上面抓取的内容 soup_content = BeautifulSoup(html_content, "lxml")
0x03 获取片名
#在解析过的内容里寻找title 标签 ##输出的内容: ###<title>地球百子 第二季-在线观看-迅雷下载-网盘下载-4567高清视界</title> html_title = soup_content.find('title') #获取title 标签内的文字 ##输出的内容: ###地球百子 第二季-在线观看-迅雷下载-网盘下载-4567高清视界 html_title = html_title.get_text() #将上面文字的空格全替换为- ##输出的内容: ###地球百子-第二季-在线观看-迅雷下载-网盘下载-4567高清视界 html_title = html_title.replace(' ', '-') #以- 为分隔符,将上面替换后的内容分割为列表 ##输出的内容: ###['地球百子', '第二季', '在线观看', '迅雷下载', '网盘下载', '4567高清视界'] html_title_list = html_title.split('-') #获取上面列表的第一项 ##输出的内容: ###地球百子 html_title = html_title_list[0]
将片名赋值给html_title 备用。
0x04 格式化内容框架
#使用findAll 将页面中<div class="mox"> 的内容格式化成列表(list) #下面这段的意思是:在soup_content 这个内容容器里寻找所有值为mox 的class 标签,并将标签及其内容以列表方式赋值给html_dowlload_content_list html_dowlload_content_list = soup_content.findAll(attrs={"class": "mox"})
0x05 寻找有效内容
为了从页面的众多代码中找到有效的下载链接,我对网页结构分析后写出以下函数和循环。
首先定义函数:
#定义一个函数,并以变量download_num 为输入值 def html_function_1(download_num): #获取列表html_dowlload_content_list 的第download_num 项元素以字符串的形式赋值给变量html_dowlload_list_content html_dowlload_list_content = str(html_dowlload_content_list[download_num]) #定义字符串,我发现一般“下载链接2”的内容是高清的。 html_download_str = '下载地址2' #在字符串html_dowlload_list_content 中寻找“下载链接2”,如果不存在则返回-1,其他都返回大于0的数 download_current = html_dowlload_list_content.find(html_download_str) return download_current
通过循环在上面的列表中寻找存在“下载链接2”这几个字符的元素位置
#先定义变量download_num_str 为0 download_num_str = 0 #因为上面说了,如果存在“下载链接2”这几个字符则得到大于0的结果,那么循环设置为如果小于0就继续下去,直到找到大于0的结果 while html_function_1(download_num=download_num_str) < 0: #如果没找到相关字符,则将变量download_num_str +1并赋值回download_num_str download_num_str += 1
提取存在字符串“下载链接2”的内容
#将拥有“下载链接2”的元素以字符串的形式赋值给html_dowlload_content html_dowlload_content = str(html_dowlload_content_list[download_num_str])
0x06 整理下载链接并格式化
#将字符串的变量html_dowlload_content 格式化为html soup_content = BeautifulSoup(html_dowlload_content, 'lxml') 以标签script 为分隔符,将soup_content 的内容分割成列表并赋值给html_dowlload_content_list html_dowlload_content_list = soup_content.findAll('script') #获取列表html_dowlload_content_list 的第二项 html_dowlload_addr = html_dowlload_content_list[1] #从上面的变量html_dowlload_addr 获取字符串并重新赋值给html_dowlload_addr html_dowlload_addr = html_dowlload_addr.get_text() #去除无效字符串并重新赋值给html_dowlload_addr。去掉前17个字符与最后的2个字符,提取中间。 html_dowlload_addr = html_dowlload_addr[16:-2] #将所有"###"替换为"\n","\n"为换行符,方便写入文件 html_dowlload_addr = html_dowlload_addr.replace('###', '\n')
0x07 写入文件
#构造文件名,名为[id].txt 的文本 html_title_2 = req_id + '.txt' #在当前目录新建文件 html_write_to_file = open(html_title_2, 'wt') #将片名写入文件第一行 html_write_to_file.write(html_title) #在片名后换行 html_write_to_file.write('\n') #将所有下载链接写入文件,紧跟着片名 html_write_to_file.write(html_dowlload_addr) #结束文件写入进程,并保存 html_write_to_file.close()
0x08 结语
首先我得承认这网站确实不错,这只是我学习python的一个过程,并没有对这个网站存在任何恶意。
这脚本有不合理的地方,例如:可能“下载链接2”并不是高清的、有可能并不在存在“下载链接2”、为什么要手动输入id?、获取id需要在院网站中寻找等等… …
这只是我学习的一个开始,我相信这会变得更好,甚至适配更多的网站。如果你有什么建议或问题,欢迎与我联系。
以下是存放于Github的全部代码: