利用python 批量下载美拍视频
2017-02-07 16:59
826 查看
前些日子写了一个利用Python批量下载微博配图的程序,因为是基于微博的移动端,即weibo.cn
,难度要小很多。而当我面对美拍时却发现,好像有点困难啊。
美拍的页面有很多动态元素,当我们打开某一用户的主页时,你会发现,有些内容会随着滚动条的下拉自动加载。也就是说,当你打算查看页面源代码时,你会发现,这些代码是不完全的,缺少了那些后来自动加载的元素的代码。因为对相关知识缺乏了解,我甚至一度以为是::after这种伪元素在作怪,结果当然是被各路大神无情嘲讽。最后还是从依云那里得到了关键字——Ajax(异步JavaScript和XML)通过在后台与服务器进行少量数据交换,AJAX
可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
凭着这个关键字,在知乎上看到一个回答,思路是找到并筛选类型为text/html的Get请求,最后在模拟这个请求。也就是说,ajax同样是需要发送请求的。在众多请求中,我发现了一个名为crossdomain的请求(每次向下浏览页面,都会发送这个请求,后来猜测它似乎和视频自动播放有关),一度以为找到了目标,后来证实,自己完全被这个请求误导了。后来在 Binuxの杂货铺中,发现了真正的答案。他的文章中说“AJAX
一般是通过 XMLHttpRequest 对象接口发送请求的,XMLHttpRequest 一般被缩写为 XHR。点击网络面板上漏斗形的过滤按钮,过滤出 XHR 请求。” XHR,这三个字母真是太有分量了。
1.随意选取一个用户,进入她的主页,开启我们的开发者工具,审查页面元素。
2.将浏览器右侧滚动条滑到最底端,页面自动加载新内容,观察请求。
3.真相只有一个,类型为json的6个请求便是我们苦苦寻找的真相,是它们导致了这种炫酷的自动加载页面效果。观察参数,和响应。
4.响应类型是json(JavaScript Object Notation) 是一种轻量级的数据交换格式。直接在消息头中,提取请求网址,输入到地址栏中,看一下。建议下载JsonView这个浏览器插件,这样更容易观察数据。例子:http://www.meipai.com/users/user_timeline?page=14&count=12&single_column=1&tid=50756498
5.json的类型是一个字典,字典中有3个键值对,其中的medias是我们想要的,它对应的值是一个列表,列表中包含了我们想要的所有东西。字典真是一个好东西,它意味着我们甚至不需要利用正则表达式来处理我们所获得数据。
6.通过对XHR请求的观察发现,若想获得同一个用户的所有作品,只需要将请求地址中page的值从1开始遍历即可。
例如:http://www.meipai.com/users/user_timeline?page=14&count=12&single_column=1&tid=50756498 这一点也在第3步的参数中体现出来了。
当然也可以像这样,自己设置参数,此时对应的page_url是http://www.meipai.com/users/user_timeline
7.最后,条例已经如此清晰了,下面就让python来替我们解决这不断重复的工作吧。
[python] view
plain copy
# -*- coding: utf-8 -*-
__author__ = 'rqy'
import os
import requests
user_id = '50756498' #user id
videos_count = 167 #user's videos_count
def download(url,name):
print 'Loading ' + name + '.mp4'
f = open(r'./videos/'+ name + '.mp4','wb')
f.write(requests.get(url).content)
f.close()
def main():
if not os.path.isdir(r'./videos/'):
os.mkdir(r'./videos/')
for i in range(1,videos_count + 1):
url = 'http://www.meipai.com/users/user_timeline?page='+ str(i) + '&count=12&single_column=1&tid=' + user_id
html = requests.get(url)
cnt = len(html.json()['medias'])
if cnt == 0:
break
else:
for j in range(0,cnt):
url_mp4 = html.json()['medias'][j]['video']
name_mp4 = str(html.json()['medias'][j]['id'])
download(url_mp4,name_mp4)
main()
总结:整个过程中,最难的就是分析页面元素,寻找页面的提交数据,最后的数据处理反而因为json变得简单了。最开始陷入困境的时候真的只是差个关键字,倘如一早便知道ajax,问题解决起来还会顺利的多。去某社区提问时,因为搞错了方向,被人嘲讽,觉得某些大牛戾气还是蛮大的。我不奢求别人手把手教我,但我希望大牛面对我们这些小白时,能多多体谅一下。最后感谢依云,binux。
,难度要小很多。而当我面对美拍时却发现,好像有点困难啊。
美拍的页面有很多动态元素,当我们打开某一用户的主页时,你会发现,有些内容会随着滚动条的下拉自动加载。也就是说,当你打算查看页面源代码时,你会发现,这些代码是不完全的,缺少了那些后来自动加载的元素的代码。因为对相关知识缺乏了解,我甚至一度以为是::after这种伪元素在作怪,结果当然是被各路大神无情嘲讽。最后还是从依云那里得到了关键字——Ajax(异步JavaScript和XML)通过在后台与服务器进行少量数据交换,AJAX
可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
凭着这个关键字,在知乎上看到一个回答,思路是找到并筛选类型为text/html的Get请求,最后在模拟这个请求。也就是说,ajax同样是需要发送请求的。在众多请求中,我发现了一个名为crossdomain的请求(每次向下浏览页面,都会发送这个请求,后来猜测它似乎和视频自动播放有关),一度以为找到了目标,后来证实,自己完全被这个请求误导了。后来在 Binuxの杂货铺中,发现了真正的答案。他的文章中说“AJAX
一般是通过 XMLHttpRequest 对象接口发送请求的,XMLHttpRequest 一般被缩写为 XHR。点击网络面板上漏斗形的过滤按钮,过滤出 XHR 请求。” XHR,这三个字母真是太有分量了。
1.随意选取一个用户,进入她的主页,开启我们的开发者工具,审查页面元素。
2.将浏览器右侧滚动条滑到最底端,页面自动加载新内容,观察请求。
3.真相只有一个,类型为json的6个请求便是我们苦苦寻找的真相,是它们导致了这种炫酷的自动加载页面效果。观察参数,和响应。
4.响应类型是json(JavaScript Object Notation) 是一种轻量级的数据交换格式。直接在消息头中,提取请求网址,输入到地址栏中,看一下。建议下载JsonView这个浏览器插件,这样更容易观察数据。例子:http://www.meipai.com/users/user_timeline?page=14&count=12&single_column=1&tid=50756498
5.json的类型是一个字典,字典中有3个键值对,其中的medias是我们想要的,它对应的值是一个列表,列表中包含了我们想要的所有东西。字典真是一个好东西,它意味着我们甚至不需要利用正则表达式来处理我们所获得数据。
6.通过对XHR请求的观察发现,若想获得同一个用户的所有作品,只需要将请求地址中page的值从1开始遍历即可。
例如:http://www.meipai.com/users/user_timeline?page=14&count=12&single_column=1&tid=50756498 这一点也在第3步的参数中体现出来了。
当然也可以像这样,自己设置参数,此时对应的page_url是http://www.meipai.com/users/user_timeline
requests.get(page_url,params = paramters)
7.最后,条例已经如此清晰了,下面就让python来替我们解决这不断重复的工作吧。
[python] view
plain copy
# -*- coding: utf-8 -*-
__author__ = 'rqy'
import os
import requests
user_id = '50756498' #user id
videos_count = 167 #user's videos_count
def download(url,name):
print 'Loading ' + name + '.mp4'
f = open(r'./videos/'+ name + '.mp4','wb')
f.write(requests.get(url).content)
f.close()
def main():
if not os.path.isdir(r'./videos/'):
os.mkdir(r'./videos/')
for i in range(1,videos_count + 1):
url = 'http://www.meipai.com/users/user_timeline?page='+ str(i) + '&count=12&single_column=1&tid=' + user_id
html = requests.get(url)
cnt = len(html.json()['medias'])
if cnt == 0:
break
else:
for j in range(0,cnt):
url_mp4 = html.json()['medias'][j]['video']
name_mp4 = str(html.json()['medias'][j]['id'])
download(url_mp4,name_mp4)
main()
总结:整个过程中,最难的就是分析页面元素,寻找页面的提交数据,最后的数据处理反而因为json变得简单了。最开始陷入困境的时候真的只是差个关键字,倘如一早便知道ajax,问题解决起来还会顺利的多。去某社区提问时,因为搞错了方向,被人嘲讽,觉得某些大牛戾气还是蛮大的。我不奢求别人手把手教我,但我希望大牛面对我们这些小白时,能多多体谅一下。最后感谢依云,binux。
相关文章推荐
- 利用python批量下载美拍视频
- python实现网站内部视频批量下载
- python之批量下载抖音视频
- (python)下载秒拍美拍视频
- Python实现Youku视频批量下载功能
- python爬虫实战:利用scrapy,短短50行代码下载整站短视频
- 利用Python调用ECMWF欧洲中心API批量下载数据
- 利用Python脚本实现-----登陆新浪微博&批量下载收藏内容
- 利用python实现 各大片 视频网站 视频下载
- python实现抖音视频批量下载
- Python视频批量下载
- 一步步分析百度音乐的播放地址,利用Python爬虫批量下载
- 一步步分析百度音乐的播放地址,利用Python爬虫批量下载
- 用Python实现Youku视频批量下载
- 利用python fabric模块写的批量操作远程主机脚本(命令执行,上传、下载文件)
- Python 利用scrapy爬虫通过短短50行代码下载整站短视频
- 利用谷歌浏览器中的审查元素下载任意网页上的视频(包括youtube)
- python写的批量操作远程主机脚本(命令执行,上传、下载文件)
- 分享一个Python下载视频脚本
- python视频下载站点