下载今日头条西瓜小视频,新手难度系数×××××
由于视频一直在持续更新,所以示例的网页图片会不一样
首页接口URL="https://www.365yg.com"
这个网页所有的链接都是动态加载的,都需要获取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数据里面
研究发现通过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]
本地视频:
都尝试过点击可播放....
附上完整的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()
网友评论