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的全部代码:

Crawl_download_link_from_4567.tv.py