bhunht 发表于 2022-3-22 12:36:34

爬取网页只能爬取到head数据,怎么破?

爬取这个链接:https://www.qimai.cn/rank/index/brand/all/device/iphone/country/cn/genre/6014

里面只能抓到head数据

body 部分无法抓取,已经添加了headers

cflying 发表于 2022-3-22 22:49:15

人家js渲染了,要么mo ni 浏览器,要么用查询接@口

cflying 发表于 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运行就得了
方案二是百度的,懒得研究算法(这里佩服下,能花心思研究这的可真是认真啊)




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


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


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

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

#这里也是扣的js代码
params = {
    'brand':'all',
    'country':'cn',
    'device':'iphone',
    'date':'2022-03-22',
    'genre':'6014',
    'page':'4'
}



def main():
    url=api_domain+api_url
    s = "".join(sorted())
    s = base64.b64encode(bytes(s, encoding="ascii"))
    t = str(int((time.time() * 1000-1515125653845)))
    s = "@#".join()
    os.environ["EXECJS_RUNTIME"] = "Node"#方案一
    an = jsdata.call('get_data',s)#方案一
    params["analysis"] = base64.b64encode(an.encode('utf-8')).decode('utf-8')#方案一
#    params["analysis"] = base64.b64encode(bytes(encrypt(s), encoding="ascii"))#方案二
#    print(params)


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

    return html

if __name__ == '__main__':
    html = main()
    print(html.json())

cflying 发表于 2022-3-22 23:18:34

给你附了#解#密#方#法,结果要#审#核,审出来了自己看。

bhunht 发表于 2022-3-23 09:43:54

cflying 发表于 2022-3-22 23:18
给你附了#解#密#方#法,结果要#审#核,审出来了自己看。

十分感谢大佬的解答
页: [1]
查看完整版本: 爬取网页只能爬取到head数据,怎么破?