利用python批量下载美拍视频
2015-09-18 19:04
711 查看
前些日子写了一个利用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来替我们解决这不断重复的工作吧。
总结:整个过程中,最难的就是分析页面元素,寻找页面的提交数据,最后的数据处理反而因为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来替我们解决这不断重复的工作吧。
# -*- 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 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转
- python常用正则表达式
- Emacs使用anaconda-mode进行Python补全时遇到的问题
- eclipse 开发python 小技巧分享
- Python中easy_install安装
- 零基础学python-18.3 递归函数vs循环和递归处理任意结构
- 零基础学python-18.3 递归函数vs循环和递归处理任意结构
- python thrift 服务端与客户端使用
- 正则表达式学习总结(python版)
- Python的html和xml解析库Beautiful Soup
- Head First Python学习笔记1
- python多线程编程:生成者和消费者
- Python爬虫框架Scrapy实战之定向批量获取职位招聘信息
- python标准日志模块logging的使用方法
- python异常处理
- Python OOP
- 关于python读取大文件的方法
- Python 中的 property 属性
- Python教程:[63]操作目录/路径【2…