PYTHON 视频网站爬虫下载器

疫情期间,过着朝十一晚十一的生活,so,打开PyCharm,编写了此爬虫。
首先,编写该爬虫的初衷是勤(you)奋(qiong)好(you)学(lan),话说宅家期间老婆一直让我下三生三世枕上书这部剧,而这部剧每周四又在腾讯视频VIP持续更新。因为没有VIP账号,就找了一个爬虫相对友好并支持VIP视频下载的网站,这样就实现软件自动查询解析并下载视频。
爬虫思路,进入这个视频网站的首页,在首页中查询对应视频的名称,之后自动进入这个视频对应的一级子页面,解析子页面里对应整部电视剧的网页地址二级子页面,再自动进入页面解析每集的下载地址并保存成列表,最后就通过requests.get下载对应的文件。
通过该爬虫get的技能:
1、使用CHROME的无痕模式,破解网站对爬虫访问的限制(之前一直不知道无痕模式是干嘛的);(该视频网站对老用户有访问限制,只能以新用户的request header来进入才不会被封)
2、加深了开发者工具下network功能的解析能力,并对HTML内容、标签、正则表达式等基础知识进行了又一次的强化;加深认识了request库的get和post功能的基础原理;
未来爬虫改善的空间:
1、目前的下载只是用了单线程,未来考虑多线程及调用下载软件(如IDM)等,加快下载的速度及链接的可靠性;
2、用户界面可以优化得友好一些:运行过程中其实程序在执行,但可能因为网速的关系会比较慢,未来还可以在中间增加用户提示信息;
3、解决部分BUG;
4、打包成可执行exe文件,并可设置文件保存目录等信息;
5、使用request.urlretrieve功能下载,一直会报远程连接错误,以后需研究下原因。

使用说明:

1.程序开始运行
1.程序开始运行
2.解析的一级子网页页面地址
2.解析的一级子网页页面地址
3.爬取二级子网页中每集视频的网址
PYTHON 视频网站爬虫下载器_第1张图片
4.选择需要下载的集数,直接打数字就行
PYTHON 视频网站爬虫下载器_第2张图片
5.下载完成后的视频保存在D盘MOVCRAW文件夹下
PYTHON 视频网站爬虫下载器_第3张图片
代码编程环境:
1.PyCharm 2019.1.3 x64
2.Python 3.7.6 64位
3.需要预先在D盘新建一个MOVCRAW文件夹,保存爬取的视频。

因本人纯Python爱好者,毫无编程经验,代码很乱,各位CSDN网友轻拍。

import requests
from bs4 import BeautifulSoup
import re
#from urllib import request
#from urllib.parse import quote
import time
import sys

def getHTMLText(url):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Cookie': '__cfduid=d1d1427e02a712d32a07dfbaf86dd47a21581431228; PHPSESSID=6q3sji6vo4chsq5f72guu8qcf7; __51cke__=; __tins__19534235=%7B%22sid%22%3A%201581859108786%2C%20%22vd%22%3A%206%2C%20%22expires%22%3A%201581861615220%7D; __51laig__=6',
        'Host': 'www.kuyunzyw.tv',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
    try:
        r = requests.post(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

def download_file(url, file_pname, chunk_size=1024*4):
    """
    url: file url
    file_pname: file save path
    chunk_size: chunk size
    """
    # 第一种
    response_data_file = requests.get(url, stream=True)
    with open(file_pname, 'wb') as f:
        for chunk in response_data_file.iter_content(chunk_size=chunk_size):
            if chunk:
                f.write(chunk)


'''
 urllib.urlretrieve 的回调函数:
def callbackfunc(blocknum, blocksize, totalsize):
    @blocknum:  已经下载的数据块
    @blocksize: 数据块的大小
    @totalsize: 远程文件的大小
'''


def Schedule(blocknum, blocksize, totalsize):
    speed = (blocknum * blocksize) / (time.time() - start_time)
    # speed_str = " Speed: %.2f" % speed
    speed_str = " Speed: %s" % format_size(speed)
    recv_size = blocknum * blocksize

    # 设置下载进度条
    f = sys.stdout
    pervent = recv_size / totalsize
    percent_str = "%.2f%%" % (pervent * 100)
    n = round(pervent * 50)
    s = ('#' * n).ljust(50, '-')
    f.write(percent_str.ljust(8, ' ') + '[' + s + ']' + speed_str)
    f.flush()
    time.sleep(0.1)
    f.write('\r')


# 字节bytes转化K\M\G
def format_size(bytes):
    try:
        bytes = float(bytes)
        kb = bytes / 1024
    except:
        print("传入的字节格式不对")
        return "Error"
    if kb >= 1024:
        M = kb / 1024
        if M >= 1024:
            G = M / 1024
            return "%.3fG" % (G)
        else:
            return "%.3fM" % (M)
    else:
        return "%.3fK" % (kb)

if __name__ == "__main__":
    mov_name = str(input("请输入下载视频名称:(回车确认)\n"))
    url = 'http://www.kuyunzyw.tv/index.php?m=vod-search&wd=' + mov_name
    #print(url)
    print("查询到的资源信息如下:")
    html = getHTMLText(url)
    title_naumber = 1
    # print(html)
    soup = BeautifulSoup(html, "html.parser")
    gather = []
    for k in soup.find_all(href=re.compile('\?m=vod\-detail\-id\-(\d*)\.html')):
        # print(k)
        # print(k['class'])  # 查a标签的class属性
        # print(k['id'])  # 查a标签的id值
        try:
            link = k['href']  # 查a标签的href值
            s = k.string
            title = "".join(s.split())  # 查a标签的string
            print('%d、%s http://www.kuyunzyw.tv/%s' % (title_naumber, title, link))
            title_naumber = title_naumber + 1
            url2 = 'http://www.kuyunzyw.tv/' + link
            a = {'title': title,
                 'link': url2}
            gather.append(a)
            #print(url2)
            #html2 = getHTMLText(url2)
            #print(html2)
        except:
            continue
    menu = int((input('\t你要进入第几个视频?\n')))
    #path = input('请输入下载路径:(请确保文件夹存在 防止出错)')
    #for download_index in range(menu - 1, len(gather)):
        #h = download_index + 1
    names = gather[menu-1]['title']
    v_url = gather[menu-1]['link']
    html2 = getHTMLText(v_url)
    downgather = []
    soup2 = BeautifulSoup(html2, "html.parser")
    for h in soup2.find_all('a' ):
        try:
            downlink = h.string
            if downlink.endswith('.mp4'):
                print(downlink)
                finalink = re.findall(r'http:\/\/.*\.mp4',downlink)
                #print(finalink)
                downgather.append(finalink[0])
            else:
                continue
        except:
            continue

    #print(downgather)
    #print(len(downgather))
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36" }
    #root = "D:/MOVCRAW/"
    down_epi = int(input("你要下载第几集?"))
    data_url = downgather
    base_url = downgather[down_epi-1]
    filename = base_url.split('/')[-1]
    start_time = time.time()
    print('下载进行中,文件保存在D盘MOVCRAW文件夹下')
    download_file(base_url,'D:/MOVCRAW/'+ filename )
    print(time.time() - start_time)
    #request.urlretrieve(quote(base_url, safe='/:?='), filename, Schedule)

你可能感兴趣的:(爬虫,PYTHON)