前些日子写了一个利用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来替我们解决这不断重复的工作吧。