您的位置:首页 > 编程语言 > Python开发

利用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
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。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: