• 教你怎么爬元气桌面的壁纸和视频


    开发语言:我大前端必备的nodejs

    看成果先:

    这次爬下来的是手机端视频壁纸,共848个视频

    -----------------------------------下边正式开始----------------------------------

    1、用fiddler抓包,查看接口地址

    接口地址为:https://pcwallpaper.zhhainiao.com/v20903/wplive/list

    参数为

    {"login_info":{},"resolution_support":0,"wtype_support":1,"encrypt_support":"none_encrypt","page":1,"page_size":24,"cate_id":2,"tag_id":null,"sort_type":2,"common":{"open_id":"T562a73fbd3f8ccccf669fd000508da","token":"PdAOr3dfdfdfdsdf6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773dsdfsdfsdfsdfaac1e61be6d","player_version":115,"platform":"pc"}}

    2、点击元气桌面的图片,查看详细,抓包找到详情接口

    抓到详细接口:https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail

    参数为:

    {"login_info":{},"wid":368129,"common":{"open_id":"T562a73fbdfsdrfd000508da","token":"PdAOsdfsdD6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773d5d32sdfsdfac1e61be6d","player_version":115,"platform":"pc"}}

    经分析,主要参数变化就是从列表中获取的 wid 参数

    3、写代码,先递归获取列表中的所有wid

    1. let getList = async opt => {
    2. $.post("https://pcwallpaper.zhhainiao.com/v20903/wplive/list", {
    3. "login_info": {},
    4. "resolution_support": 0,
    5. "wtype_support": 1,
    6. "encrypt_support": "none_encrypt",
    7. "page": opt.page,
    8. "page_size": 24,
    9. "cate_id": null,
    10. "tag_id": 109,
    11. "sort_type": 2,
    12. "common": {
    13. "open_id": "T562a73fbd3fssd000508da这里换成自己的",
    14. "token": "PdAOr3XqiugtdFP5l2hZT这里换成自己的d",
    15. "device_id": "b3e88773d5d3226d5这里换成自己的e6d",
    16. "player_version": 115,
    17. "platform": "pc"
    18. }
    19. }).then(async res => {
    20. if (res.data.data && res.data.data.list.length > 0) {
    21. for (let item of res.data.data.list) {
    22. let mobile_video = await getMobile({
    23. wid: item.wid
    24. })
    25. if (mobile_video) {
    26. saveVideo({msg:mobile_video+"\r\n"})
    27. }
    28. }
    29. console.log("第"+opt.page+"页")
    30. getList({
    31. page: opt.page + 1
    32. })
    33. } else {
    34. console.log(videos.length)
    35. console.log("结束了")
    36. }
    37. })
    38. }

     4、拿到列表数据以后,开始请求详细接口

    1. let getMobile = async opt => {
    2. let p = Q.defer();
    3. $.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {
    4. "login_info": {},
    5. "wid": opt.wid,
    6. "common": {
    7. "open_id": "T562a73fbd3f8747e62f669fd000508da",
    8. "token": "PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd",
    9. "device_id": "b3e88773d5d3226d5656eaac1e61be6d",
    10. "player_version": 115,
    11. "platform": "pc"
    12. }
    13. }).then(res => {
    14. if (res.data && res.data.data) {
    15. p.resolve(res.data.data.mobile_preview_video)
    16. } else {
    17. p.resolve("")
    18. }
    19. })
    20. return p.promise
    21. }

    5、最后,下载视频到本地

    1. let saveVideo = async opt=>{
    2. /* learnNode.js */
    3. fs.appendFile('D:\\work\\test\\video.txt',opt.msg,(err)=>{
    4. if(err){
    5. console.log('出错')
    6. }else{
    7. console.log('追加内容')
    8. }
    9. })
    10. }
    11. // getList({
    12. // page: 1
    13. // })
    14. // $.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {"login_info":{},"wid":359624,"common":{"open_id":"T562a73fbd3f8747e62f669fd000508da","token":"PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773d5d3226d5656eaac1e61be6d","player_version":115,"platform":"pc"}}).then(res => {
    15. // console.log(res.data.data.mobile_video)
    16. // })
    17. let idx = 0;
    18. let downVideo=async opt=>{
    19. let p = Q.defer();
    20. $({
    21. url:opt.url,
    22. responseType: 'stream'
    23. }).then(
    24. (resp) => {
    25. idx++
    26. const writer = fs.createWriteStream("D:\\work\\test\\videos\\"+idx+".mp4")
    27. resp.data.pipe(writer)
    28. writer.on('finish', () => {
    29. console.log("完成",idx)
    30. p.resolve(1)
    31. })
    32. writer.on('error', (e) => {
    33. p.resolve("")
    34. })
    35. }
    36. )
    37. return p.promise
    38. }

    最后,有些视频链接失效了,需要处理一下,下方是完整代码,有些被注释了,因为每一步执行的时候用的的函数不一样,需要有点基础才能修改

    1. let $ = require("axios")
    2. const {
    3. async
    4. } = require("q");
    5. var Q = require('q');
    6. let fs = require('fs');
    7. let videos = []
    8. let getList = async opt => {
    9. $.post("https://pcwallpaper.zhhainiao.com/v20903/wplive/list", {
    10. "login_info": {},
    11. "resolution_support": 0,
    12. "wtype_support": 1,
    13. "encrypt_support": "none_encrypt",
    14. "page": opt.page,
    15. "page_size": 24,
    16. "cate_id": null,
    17. "tag_id": 109,
    18. "sort_type": 2,
    19. "common": {
    20. "open_id": "T562a73fbd3f8747e62f669fd000508da",
    21. "token": "PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd",
    22. "device_id": "b3e88773d5d3226d5656eaac1e61be6d",
    23. "player_version": 115,
    24. "platform": "pc"
    25. }
    26. }).then(async res => {
    27. if (res.data.data && res.data.data.list.length > 0) {
    28. for (let item of res.data.data.list) {
    29. let mobile_video = await getMobile({
    30. wid: item.wid
    31. })
    32. if (mobile_video) {
    33. saveVideo({msg:mobile_video+"\r\n"})
    34. }
    35. }
    36. console.log("第"+opt.page+"页")
    37. getList({
    38. page: opt.page + 1
    39. })
    40. } else {
    41. console.log(videos.length)
    42. console.log("结束了")
    43. }
    44. })
    45. }
    46. let getMobile = async opt => {
    47. let p = Q.defer();
    48. $.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {
    49. "login_info": {},
    50. "wid": opt.wid,
    51. "common": {
    52. "open_id": "T562a73fbd3f8747e62f669fd000508da",
    53. "token": "PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd",
    54. "device_id": "b3e88773d5d3226d5656eaac1e61be6d",
    55. "player_version": 115,
    56. "platform": "pc"
    57. }
    58. }).then(res => {
    59. if (res.data && res.data.data) {
    60. p.resolve(res.data.data.mobile_preview_video)
    61. } else {
    62. p.resolve("")
    63. }
    64. })
    65. return p.promise
    66. }
    67. let saveVideo = async opt=>{
    68. /* learnNode.js */
    69. fs.appendFile('D:\\work\\test\\video.txt',opt.msg,(err)=>{
    70. if(err){
    71. console.log('出错')
    72. }else{
    73. console.log('追加内容')
    74. }
    75. })
    76. }
    77. getList({
    78. page: 1
    79. })
    80. // $.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {"login_info":{},"wid":359624,"common":{"open_id":"T562a73fbd3f8747e62f669fd000508da","token":"PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773d5d3226d5656eaac1e61be6d","player_version":115,"platform":"pc"}}).then(res => {
    81. // console.log(res.data.data.mobile_video)
    82. // })
    83. let idx = 0;
    84. let downVideo=async opt=>{
    85. let p = Q.defer();
    86. $({
    87. url:opt.url,
    88. responseType: 'stream'
    89. }).then(
    90. (resp) => {
    91. idx++
    92. const writer = fs.createWriteStream("D:\\work\\test\\videos\\"+idx+".mp4")
    93. resp.data.pipe(writer)
    94. writer.on('finish', () => {
    95. console.log("完成",idx)
    96. p.resolve(1)
    97. })
    98. writer.on('error', (e) => {
    99. p.resolve("")
    100. })
    101. }
    102. )
    103. return p.promise
    104. }
    105. let readText = async opt=>{
    106. let txt = fs.readFileSync("D:\\work\\test\\video.txt","utf-8")
    107. let arr = txt.split("\r\n")
    108. console.log(arr)
    109. for(let item of arr){
    110. await downVideo({url:item})
    111. console.log(arr.length)
    112. }
    113. }
    114. //readText()

  • 相关阅读:
    [Mybatis-Plus笔记] MybatisPlus-03-QueryWrapper条件构造器
    node 之 express 框架(初级)
    GZ035 5G组网与运维赛题第4套
    《公共政策学》重点整理
    what‘s the meaning of rv32imafdc
    PTA古风排版
    go语言 反向代理
    “由于一段 Python 代码,我的号被封了”
    虚拟机快照(挺重要的)
    windows网络编程 --网络聊天室(2)
  • 原文地址:https://blog.csdn.net/cangege123/article/details/132788219