2019-06-16 今日头条西瓜小视频下载

2019-06-16  本文已影响0人  hcc_9bf4

下载今日头条西瓜小视频,新手难度系数×××××
由于视频一直在持续更新,所以示例的网页图片会不一样

首页接口URL="https://www.365yg.com"

image.png
这个网页所有的链接都是动态加载的,都需要获取API接口再来访问

第一步获取标题的URL,通过‘查看网页原代码‘发现标题的URL是通过URL+href获得----》如下图href

image.png

但是通过python requests‘查看网页原代码’发现找不到关于href的链接,后来通过抓包发现是动态加载过来的,如下图


image.png

再看接口的response发现,src在json数据里面


tu3

第二步,分析API接口了

URL: https://www.365yg.com/api/pc/feed/?min_behot_time=0&category=video_new&utm_source=toutiao&widen=1&tadrequire=true&as=A115FD5086E14FD&cp=5D06A114DFBD3E1&_signature=kp.DGBAWz6Y4sIOYnL.AY5Kfww
这个接口响应的内容就是json内容,其中包含href

复制response内容,通过json在线解析(https://www.json.cn)查看,很明显在这个json数据里面

image.png

研究发现通过widen的 数值变化可以加载出不一样的主题,次数由自己定,次数多加载的视频更多

for widen in range(1,5):#四次
        #解析首页返回所有的标题连接
        spidder_content(widen)
def spidder_content(widen):
    #首页https://www.365yg.com是通过json动态加载视频链接所以需要通过抓包获取的url,根据widen数值不一样,获取的url不一样
    url='https://www.365yg.com/api/pc/feed/?min_behot_time=0&category=video_new&utm_source=toutiao&widen={}&tadrequire=true&as=A1454DE084FE1AD&cp=5D043E416A5D2E1&_signature=4a4SWhAfvLaYPOPM2JBHReGuEk'
    #url=https://www.365yg.com/api/pc/feed/?max_behot_time=1560602856&category=video_new&utm_source=toutiao&widen=1&tadrequire=true&as=A1E5ED30E46E7F8&cp=5D048EE73FD82E1&_signature=rywnhRAS8jfWvtYTY.0ejq8sJ5
    url_page=url.format(widen)
    r=requests.get(url=url_page,headers=headers)
    # print(r.text)
    #创建json对象
    content=json.loads(r.text)
    # print(content)
    for json_dict in content['data']:
        #获取标题
        title=json_dict['title']
        # print('video_id:',json_dict['video_id'])
        # print('behot_time:',json_dict['behot_time'])
        #获取播放视频的那页url
        json_url= 'https://www.365yg.com' + json_dict['source_url']
        # print('视频链接:',json_url)
        # print('group_id:',json_dict['group_id'])
        #解析url获取视频url
        hand_url(title,json_url)

第三步,找到tittle的URL后再来找视频的URL(这个地方对新手有点难度,对我就有难度....T_T,弄了好久)

如图进入拼接好了后的URL怎么办?如何获得这个视频链接.....


image.png

查看源代码,找不到关于视频的url
通过审查元素找到视频的url在src中,但是这个src也是动态加载过来的


image.png

通过抓包,通过HXR查找json数据都找不到它的URL
·······

最后还是通过headless用谷歌浏览器自动加载才获取到的

def hand_url(title,json_url):
    #使用headlesschrome来进行解决
    path=r'E:\gugedriver\chromedriver.exe' #注意你的谷歌浏览器驱动路径
    browser = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)#浏览器设置
    browser.get(json_url)
    js='document.body.scrollTop=10000' #浏览器自动下滑加载
    browser.execute_script(js)  #浏览器自动下滑加载
    time.sleep(3)
    
    #获取源码,生成查找video里面的src属性
    tree=etree.HTML(browser.page_source)
    # with open('lalaa.html','w',encoding='utf8') as fp:
    #     fp.write(browser.page_source)
    # exit()
    video_src=tree.xpath('//video[@mediatype="video"]/@src')[0]
    print('%s开始下载.....' % title)
    video=requests.get(video_src,headers=headers)
    #创建文件夹
    dirpath='shipin'
    if not os.path.exists(dirpath):
        os.mkdir(dirpath)
    #创建文件名
    filename=title +'.mp4'
    #创建文件路径
    filepath=os.path.join(dirpath,filename)
    #filepath='shipin/'+title+'.mp4'
    with open(filepath,'wb') as fp:
        fp.write(video.content)
    print('%s结束下载.....' % title)

怎么查看这个src在这个页面里的,可以把上面代码中下面的代码打开本地查看,我已经试过......

# with open('lalaa.html','w',encoding='utf8') as fp:
    #     fp.write(browser.page_source)
    # exit()

短视频下载过程....(如果想获取更多视频请把widen值取的更大.......)

E:\Sublime Text 3\day1\111.py:42: DeprecationWarning: use options instead of chrome_options
  browser = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)
参谋长转业回村,碰上省委书记来了解工作,没想到直接升官当市长开始下载.....
参谋长转业回村,碰上省委书记来了解工作,没想到直接升官当市长结束下载.....
最近这首《来自天堂的魔鬼》太好听了!邓紫棋:老娘,不用调音师开始下载.....
最近这首《来自天堂的魔鬼》太好听了!邓紫棋:老娘,不用调音师结束下载.....
全自动杀猪,很多人没见过!开始下载.....
全自动杀猪,很多人没见过!结束下载.....
女童兴奋给同学发视频,妈妈一看内容吓一跳忙报警,发的啥?开始下载.....
女童兴奋给同学发视频,妈妈一看内容吓一跳忙报警,发的啥?结束下载.....
黄瓜只会生吃?教你一种黄瓜新做法,做法简单又好吃开始下载.....
黄瓜只会生吃?教你一种黄瓜新做法,做法简单又好吃结束下载.....
释迦牟尼菩提树下成佛,眼镜蛇前来护法,西天第一佛诞生!开始下载.....
释迦牟尼菩提树下成佛,眼镜蛇前来护法,西天第一佛诞生!结束下载.....
最绝望的劫匪开始下载.....
最绝望的劫匪结束下载.....
[Finished in 167.8s]

本地视频:
都尝试过点击可播放....

image.png

附上完整的python代码:

import requests #对URL发送请求需要
import json #解析json数据需要
import time #响应延时需要
from lxml import etree 解析短视频网页需要
from selenium import webdriver  #创建谷歌无头浏览器
from selenium.webdriver.chrome.options import Options #谷歌无头浏览器设置需要
import os #创建本地文件需要

#创建谷歌无头浏览器。获取视频连接需要用到
chrome_options=Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}

def spidder_content(widen):
    #首页https://www.365yg.com是通过json动态加载视频链接所以需要通过抓包获取的url,根据widen数值不一样,获取的url不一样
    url='https://www.365yg.com/api/pc/feed/?min_behot_time=0&category=video_new&utm_source=toutiao&widen={}&tadrequire=true&as=A1454DE084FE1AD&cp=5D043E416A5D2E1&_signature=4a4SWhAfvLaYPOPM2JBHReGuEk'
    #url=https://www.365yg.com/api/pc/feed/?max_behot_time=1560602856&category=video_new&utm_source=toutiao&widen=1&tadrequire=true&as=A1E5ED30E46E7F8&cp=5D048EE73FD82E1&_signature=rywnhRAS8jfWvtYTY.0ejq8sJ5
    url_page=url.format(widen)
    r=requests.get(url=url_page,headers=headers)
    # print(r.text)
    #创建json对象
    content=json.loads(r.text)
    # print(content)
    for json_dict in content['data']:
        #获取标题
        title=json_dict['title']
        # print('video_id:',json_dict['video_id'])
        # print('behot_time:',json_dict['behot_time'])
        #获取播放视频的那页url
        json_url= 'https://www.365yg.com' + json_dict['source_url']
        # print('视频链接:',json_url)
        # print('group_id:',json_dict['group_id'])
        #解析url获取视频url
        hand_url(title,json_url)
def hand_url(title,json_url):
    #使用headlesschrome来进行解决
    path=r'E:\gugedriver\chromedriver.exe' #注意你的谷歌浏览器驱动路径
    browser = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)#浏览器设置
    browser.get(json_url)
    js='document.body.scrollTop=10000' #浏览器自动下滑加载
    browser.execute_script(js)  #浏览器自动下滑加载
    time.sleep(3)
    
    #获取源码,生成查找video里面的src属性
    tree=etree.HTML(browser.page_source)
    # with open('lalaa.html','w',encoding='utf8') as fp:
    #     fp.write(browser.page_source)
    # exit()
    video_src=tree.xpath('//video[@mediatype="video"]/@src')[0]
    print('%s开始下载.....' % title)
    video=requests.get(video_src,headers=headers)
    #创建文件夹
    dirpath='shipin'
    if not os.path.exists(dirpath):
        os.mkdir(dirpath)
    #创建文件名
    filename=title +'.mp4'
    #创建文件路径
    filepath=os.path.join(dirpath,filename)
    #filepath='shipin/'+title+'.mp4'
    with open(filepath,'wb') as fp:
        fp.write(video.content)
    print('%s结束下载.....' % title)
def main():
    for widen in range(1,2):
        #解析首页返回所有的标题连接
        spidder_content(widen)

if __name__ == '__main__':
    main()
上一篇下一篇

猜你喜欢

热点阅读