想看游戏视频吗?点这,这里应有尽有

原标题:运用python爬虫下载好看视频

前言

之所以标题上写着游戏视频,有两个原因:1.是希望能吸引读者的眼球,但愿是我希望的吧!2.是我这次下载的视频也是有关游戏的。

1.完成这个项目需要的模块

 1.1 必须要模块

 既然是爬虫就少不了urllib模块,当然也少不了解析模块,这里我用的是bs4,

这两个模块都是第三方模块,需要额外下载。

 1.2 其他模块

这里我还用到了json模块,主要是用来处理json格式的数据的。
另外,我也用到了sys和time模块,用来制作一个进度条,使最后结果更加fashion。

 2. 实现过程

首先,我们要来到这个网址:[好看视频](https://haokan.baidu.com/)
通过输入一个视频主题,我们可以搜索得到下面结果:(我输入的是 和平精英,因为我也是一个和平精英的游戏迷)

通过对上面的那个网址进行分析,我们可以发现,
https://haokan.baidu.com/videoui/page/search?query=%E5%92%8C%E5%B9%B3%E7%B2%BE%E8%8B%B1
我们只需要改变 query后面的视频名称,就可以匹配到相应的视频了。
现在,我们要做的就是得到这些视频的链接和名称了。
我们可以按电脑键盘上的F12建,也可以鼠标右键,然后在弹出来的窗口上点击检查。
然后,我们就可以看到下面结果了。

 只不过这个视频链接好像是动态加载出来,根本爬不到,我们查看一下网页源代码就知道了。尽管这样,我们继续往这个界面下看,可以发现,这里有这些视频的链接和名称,但是是一个json数据,并且还是进行了编码的。

我们只需得到这些数据,并解码即可。

开始我是直接这样

text.read().decode()

的,可是,这样根本不能解码;于是,我就这样

text=response.read().decode('unicode-escape')

,虽然解了码,但是有警告。

 查了一下资料,提示'\/'是一个无效的转义字符。

我想了想,不如先解码,然后将‘\/’替换,再编码,再解码即可。

text=response.read().decode()
text=text.replace('\/','/')
text=text.encode('utf-8').decode('unicode-escape')

这样,我们就可以得到这些链接和名称了。
我们选择其中一个视频进行播放。

 可以发现这个视频的下载链接在一个 video标签下

这里我定义了一个方法,用来下载视频。

def Downlad(url,name): # 定义一个方法,通过传进来的参数url下载视频
    response=request.urlopen(url=url)
    text=response.read().decode('utf-8')
    src=text[text.find('<video'):text.find('</video>')]
    url=src[src.find('src=')+4:src.find('>')]
    request.urlretrieve(url=url,filename='./{}.mp4'.format(name))

传入第一个参数进入这个视频的链接,第二个参数是给下载的视频起的名称。

3.最终代码和运行结果

from urllib import request
from urllib import parse
from bs4 import BeautifulSoup
import json
import time
import sys



def Time_1():     # 进度条函数
    for i in range(1,101):
        sys.stdout.write('\r')
        sys.stdout.write('{0}%|{1}{2}'.format(i,int((i%101)/2)*'-','>'))
        sys.stdout.flush()
        time.sleep(0.05)
    sys.stdout.write('\n')

def Downlad(url,name): # 定义一个方法,通过传进来的参数url下载视频
    response=request.urlopen(url=url)
    text=response.read().decode('utf-8')
    src=text[text.find('<video'):text.find('</video>')]
    url=src[src.find('src=')+4:src.find('>')]
    request.urlretrieve(url=url,filename='./{}.mp4'.format(name))



if __name__ == '__main__':

    name=input('请输入你想看的视频名:')
    query=parse.urlencode({'query':name})
    url='https://haokan.baidu.com/videoui/page/search?{}'.format(query)
    headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400'}
    response=request.Request(url=url,headers=headers)
    response=request.urlopen(response)
    text=response.read().decode()
    text=text.replace('\/','/')
    text=text.encode('utf-8').decode('unicode-escape')
    soup=BeautifulSoup(text,'lxml')
    str1=str(soup.select('script#_page_data')[0])
    str2=str1[str1.find('window.__PRELOADED_STATE__ =')+len('window.__PRELOADED_STATE__ ='):str1.rfind(';')]
    dict1=json.loads(str2)
    for i in range(len(dict1['list'])):
        print('-->【{}】'.format(dict1['list'][i]['title']))
        Downlad(url=dict1['list'][i]['url'],name=i+1)
        Time_1()
    print('所有视频下载完毕!')

运行结果:

运行完毕之后,你会发现在同一个文件夹下面多出几个.mp4文件,这些就是下载的视频了,就可以观看了。

 

 

 4.总结

这个程序代码还可以更新一下,比如做一个ip代理池,这样就不会被封ip了吧!如果大家觉得我这个做的还可以,记得点赞;没给我点赞也可以,我会继续努力的。

猜你喜欢

转载自www.cnblogs.com/liuze-2/p/12735636.html