利用python 批量下载美拍视频

  前些日子写了一个利用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

requests.get(page_url,params = paramters)


7.最后,条例已经如此清晰了,下面就让python来替我们解决这不断重复的工作吧。

[python]  view plain  copy
  1. # -*- coding: utf-8 -*-  
  2. __author__ = 'rqy'  
  3.   
  4. import os  
  5. import requests  
  6.   
  7. user_id = '50756498' #user id  
  8. videos_count = 167   #user's videos_count  
  9.   
  10. def download(url,name):  
  11.    print 'Loading ' + name + '.mp4'  
  12.    f = open(r'./videos/'+ name + '.mp4','wb')  
  13.    f.write(requests.get(url).content)  
  14.    f.close()  
  15.   
  16. def main():  
  17.    if not os.path.isdir(r'./videos/'):  
  18.       os.mkdir(r'./videos/')  
  19.    for i in range(1,videos_count + 1):  
  20.       url = 'http://www.meipai.com/users/user_timeline?page='+ str(i) + '&count=12&single_column=1&tid=' + user_id  
  21.       html = requests.get(url)  
  22.       cnt  = len(html.json()['medias'])  
  23.       if cnt == 0:  
  24.          break  
  25.       else:  
  26.          for j in range(0,cnt):  
  27.             url_mp4  = html.json()['medias'][j]['video']  
  28.             name_mp4 = str(html.json()['medias'][j]['id'])  
  29.             download(url_mp4,name_mp4)  
  30.   
  31. main()  


总结:整个过程中,最难的就是分析页面元素,寻找页面的提交数据,最后的数据处理反而因为json变得简单了。最开始陷入困境的时候真的只是差个关键字,倘如一早便知道ajax,问题解决起来还会顺利的多。去某社区提问时,因为搞错了方向,被人嘲讽,觉得某些大牛戾气还是蛮大的。我不奢求别人手把手教我,但我希望大牛面对我们这些小白时,能多多体谅一下。最后感谢依云,binux。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值