鱼C论坛

 找回密码
 立即注册
查看: 884|回复: 4

[已解决]爬取网页只能爬取到head数据,怎么破?

[复制链接]
发表于 2022-3-22 12:36:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
爬取这个链接:https://www.qimai.cn/rank/index/ ... untry/cn/genre/6014

里面只能抓到head数据

body 部分无法抓取,已经添加了headers
最佳答案
2022-3-22 23:15:59
大概看了哈网站,解密不复杂
逻辑如下:
1、js中申明了params={brand: "all",country: "cn",date: "2022-03-22",device: "iphone",genre: "6014",page: 4}(这里具体时间、page页码值自己替换)
逻辑就是先组合然后bas64加密,再和url和时间戳和查询接口地址再二次组合,这里注意时间戳要减一个固定值
data+genre+page+brand+country+device即22022-03-226014allcniphone然后base64一下,再@#+url地址+时间戳-1515125653845+@#1(就是地址后的查询接口0或1或2),即MjIwMjItMDMtMjI2MDE0YWxsY25pcGhvbmU=@#/rank/indexPlus/brand_id/1@#132831706011@#1

2、第二次组合后然后就是用网站自己得js加密处理一下,这个有两个方案

方案一是花点时间找js算法,结果系统自带的js老是出错,早知道装node.js就不浪费时间了,这个比较省事,没研究算法,直接照搬后用execjs运行就得了
方案二是百度的,懒得研究算法(这里佩服下,能花心思研究这的可真是认真啊)




  1. import requests,execjs,json,base64,time,os
  2. #===============这部分为解密================================================
  3. #方案一,记得用Node.js,我就是没装Node.js,结果用默认用系统的js,老是出错
  4. #这里是扣https://static.qimai.cn/static/js/app.js里的代码
  5. jsdata = '''
  6. function i(e) {
  7.             var t, a = (t = "",
  8.             ["66", "72", "6f", "6d", "43", "68", "61", "72", "43", "6f", "64", "65"].forEach((function(e) {
  9.                 t += unescape("%u00" + e)
  10.             }
  11.             )),
  12.             t);
  13.             return String[a](e)
  14.         }
  15. function g(e, t) {
  16.             t || (t = s());
  17.             for (var a = (e = e.split("")).length, n = t.length, o = "charCodeAt", r = 0; r < a; r++)
  18.                 e[r] = i(e[r][o](0) ^ t[(r + 10) % n][o](0));
  19.             return e.join("")
  20. }
  21. function get_data(a1){
  22.     a2 = '0000000c735d856'
  23.     return g(a1,a2)
  24. }
  25. '''
  26. jsdata = execjs.compile(jsdata)


  27. # 方案二,方案一不行的时候用自定义加密函数
  28. def encrypt(a):
  29.     e = '0000000c735d856'
  30.     t = len(e)
  31.     n = len(a)
  32.     a = list(a)
  33.     for s in range(n):
  34.         a[s] = chr(ord(a[s]) ^ ord(e[(s + 10) % t]))
  35.     return ''.join(a)


  36. #=========正文================================
  37. # 自己改cookies
  38. headers = {
  39.     "Accept": "application/json, text/plain, */*",
  40.     "accept-encoding":"gzip, deflate, br",
  41.     "Referer": "https://www.qimai.cn/",
  42.     "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/59.0",
  43.     "cookie": "PHPSESSID=p71fo839h4fkath83oitoppkqe; qm_check=SxJXQEUSChd2fHd1dRQQd19fV1xVHBVhR1xSUVoYAR4CHgAQGGZAW1ZNY1xZVFVCEHRVRlxUVxARY0FaSlVCXxkQGAVPAgAJAHcIdHUZGRwQY0JeVERqWFVcVUIQVEJZRlBFHwUXABoIGRIcElNYVVZcEAobABgIHAAcABwAEkg%3D; synct=1647956097.086; syncd=-2631; tgw_l7_route=d09474674af82c17375cfcdd775c0c28"
  44. }

  45. api_domain = 'https://api.qimai.cn'
  46. api_url = '/rank/indexPlus/brand_id/1'

  47. #这里也是扣的js代码
  48. params = {
  49.     'brand':'all',
  50.     'country':'cn',
  51.     'device':'iphone',
  52.     'date':'2022-03-22',
  53.     'genre':'6014',
  54.     'page':'4'
  55. }



  56. def main():
  57.     url=api_domain+api_url
  58.     s = "".join(sorted([str(v) for v in params.values()]))
  59.     s = base64.b64encode(bytes(s, encoding="ascii"))
  60.     t = str(int((time.time() * 1000-1515125653845)))
  61.     s = "@#".join([s.decode(), api_url, t, "1"])
  62.     os.environ["EXECJS_RUNTIME"] = "Node"#方案一
  63.     an = jsdata.call('get_data',s)#方案一
  64.     params["analysis"] = base64.b64encode(an.encode('utf-8')).decode('utf-8')#方案一
  65. #    params["analysis"] = base64.b64encode(bytes(encrypt(s), encoding="ascii"))#方案二
  66. #    print(params)


  67.     html = requests.get(url,params=params,headers=headers)

  68.     return html

  69. if __name__ == '__main__':
  70.     html = main()
  71.     print(html.json())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-22 22:49:15 | 显示全部楼层
人家js渲染了,要么mo ni 浏览器,要么用查询接@口
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-22 23:15:59 | 显示全部楼层    本楼为最佳答案   
大概看了哈网站,解密不复杂
逻辑如下:
1、js中申明了params={brand: "all",country: "cn",date: "2022-03-22",device: "iphone",genre: "6014",page: 4}(这里具体时间、page页码值自己替换)
逻辑就是先组合然后bas64加密,再和url和时间戳和查询接口地址再二次组合,这里注意时间戳要减一个固定值
data+genre+page+brand+country+device即22022-03-226014allcniphone然后base64一下,再@#+url地址+时间戳-1515125653845+@#1(就是地址后的查询接口0或1或2),即MjIwMjItMDMtMjI2MDE0YWxsY25pcGhvbmU=@#/rank/indexPlus/brand_id/1@#132831706011@#1

2、第二次组合后然后就是用网站自己得js加密处理一下,这个有两个方案

方案一是花点时间找js算法,结果系统自带的js老是出错,早知道装node.js就不浪费时间了,这个比较省事,没研究算法,直接照搬后用execjs运行就得了
方案二是百度的,懒得研究算法(这里佩服下,能花心思研究这的可真是认真啊)




  1. import requests,execjs,json,base64,time,os
  2. #===============这部分为解密================================================
  3. #方案一,记得用Node.js,我就是没装Node.js,结果用默认用系统的js,老是出错
  4. #这里是扣https://static.qimai.cn/static/js/app.js里的代码
  5. jsdata = '''
  6. function i(e) {
  7.             var t, a = (t = "",
  8.             ["66", "72", "6f", "6d", "43", "68", "61", "72", "43", "6f", "64", "65"].forEach((function(e) {
  9.                 t += unescape("%u00" + e)
  10.             }
  11.             )),
  12.             t);
  13.             return String[a](e)
  14.         }
  15. function g(e, t) {
  16.             t || (t = s());
  17.             for (var a = (e = e.split("")).length, n = t.length, o = "charCodeAt", r = 0; r < a; r++)
  18.                 e[r] = i(e[r][o](0) ^ t[(r + 10) % n][o](0));
  19.             return e.join("")
  20. }
  21. function get_data(a1){
  22.     a2 = '0000000c735d856'
  23.     return g(a1,a2)
  24. }
  25. '''
  26. jsdata = execjs.compile(jsdata)


  27. # 方案二,方案一不行的时候用自定义加密函数
  28. def encrypt(a):
  29.     e = '0000000c735d856'
  30.     t = len(e)
  31.     n = len(a)
  32.     a = list(a)
  33.     for s in range(n):
  34.         a[s] = chr(ord(a[s]) ^ ord(e[(s + 10) % t]))
  35.     return ''.join(a)


  36. #=========正文================================
  37. # 自己改cookies
  38. headers = {
  39.     "Accept": "application/json, text/plain, */*",
  40.     "accept-encoding":"gzip, deflate, br",
  41.     "Referer": "https://www.qimai.cn/",
  42.     "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/59.0",
  43.     "cookie": "PHPSESSID=p71fo839h4fkath83oitoppkqe; qm_check=SxJXQEUSChd2fHd1dRQQd19fV1xVHBVhR1xSUVoYAR4CHgAQGGZAW1ZNY1xZVFVCEHRVRlxUVxARY0FaSlVCXxkQGAVPAgAJAHcIdHUZGRwQY0JeVERqWFVcVUIQVEJZRlBFHwUXABoIGRIcElNYVVZcEAobABgIHAAcABwAEkg%3D; synct=1647956097.086; syncd=-2631; tgw_l7_route=d09474674af82c17375cfcdd775c0c28"
  44. }

  45. api_domain = 'https://api.qimai.cn'
  46. api_url = '/rank/indexPlus/brand_id/1'

  47. #这里也是扣的js代码
  48. params = {
  49.     'brand':'all',
  50.     'country':'cn',
  51.     'device':'iphone',
  52.     'date':'2022-03-22',
  53.     'genre':'6014',
  54.     'page':'4'
  55. }



  56. def main():
  57.     url=api_domain+api_url
  58.     s = "".join(sorted([str(v) for v in params.values()]))
  59.     s = base64.b64encode(bytes(s, encoding="ascii"))
  60.     t = str(int((time.time() * 1000-1515125653845)))
  61.     s = "@#".join([s.decode(), api_url, t, "1"])
  62.     os.environ["EXECJS_RUNTIME"] = "Node"#方案一
  63.     an = jsdata.call('get_data',s)#方案一
  64.     params["analysis"] = base64.b64encode(an.encode('utf-8')).decode('utf-8')#方案一
  65. #    params["analysis"] = base64.b64encode(bytes(encrypt(s), encoding="ascii"))#方案二
  66. #    print(params)


  67.     html = requests.get(url,params=params,headers=headers)

  68.     return html

  69. if __name__ == '__main__':
  70.     html = main()
  71.     print(html.json())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-22 23:18:34 | 显示全部楼层
给你附了#解#密#方#法,结果要#审#核,审出来了自己看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-23 09:43:54 | 显示全部楼层
cflying 发表于 2022-3-22 23:18
给你附了#解#密#方#法,结果要#审#核,审出来了自己看。

十分感谢大佬的解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 13:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表