Task6、动态网站的分析

236 阅读15分钟

Task6、动态网站的分析

6.1、常见的动态网页技术

6.1.1、JavaScript

JavaScript是-种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常lavaScript脚本是通过嵌入在HTML 中来实现自身的功能的。

可以在网页源代码的标签里看到,比如:

JavaScript可以动态地创建HTML内容,这些内容只有在JavaScript代码执行之后才会产生和显示如果使用传统的方法采集页面内容,就只能获得JavaScript代码执行之前页面上的内容。

6.1.2、Ajax

使用Ajax技术更新网页的内容的网站有个很大的特点,那就是可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

Ajax其实并不是一-门语言,而是用来完成网络任务(可以认为它与网络数据采集差不多)的一系列技术。Ajax网站不需要使用整个的页面加载就可以和网络服务器进行交互。

6.1.3、 DHTML

DHTML: Dynamic HTML动态的HTML,这门技术并不是一 -门 ]新的技术,而是将之 前所学的 HTML、CSS、 JavaScript整合在一-起, 利用S操作页面元素,让元素具有动态的变化,使得页面和用户具有交互的行为。

6.2、 动态网页处理方法

使用动态加载的网站,用Python解决有如下几种途径:

  • 直接破解JavaScript代码里采集内容,即js逆向;

  • 抓包分析,查看截图的请求响应信息,伪造请求,实现响应的获取,即找到真实加载数据的动态链接;

  • 用Python的第三方库运行JavaScript,直接采集你在浏览器里看到的页面,即模拟登录;

6.3、Ajax加载的动态网站分析

有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests 得到的结果并没有。这是因为 requests 获取的都是原始的 HTML 文档,而浏览器中的页面则是经过 JavaScript 处理数据后生成的结果,这些数据的来源有多种,可能是通过 Ajax 加载的,可能是包含在 HTML 文档中的,也可能是经过 JavaScript 和特定算法计算后生成的。

对于第一种情况,数据加载是一种异步加载方式,原始的页面最初不会包含某些数据,原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这其实就是发送了一个 Ajax 请求。

所以如果遇到这样的页面,直接利用 requests 等库来抓取原始页面,是无法获取到有效数据的,这时需要分析网页后台向接口发送的 Ajax 请求,如果可以用 requests 来模拟 Ajax 请求,那么就可以成功抓取了。

图一我们可以看到页面显示内容较少,也就是html所看到的内容而已,但是我们通过图二的操作,可以发现如图三显示的数据包,在这里我们可以抓到更多的信息量

6.4、某麦网站动态爬取实战

1. 分析请求

打开 Ajax 的 XHR 过滤器,然后一直滑动页面以加载新的微博内容。可以看到,会不断有 Ajax 请求发出。

选定其中一个请求,分析它的参数信息。点击该请求,进入详情页面,如图

可以发现,这是一个 GET 类型的请求,请求链接为 api.qimai.cn/rank/indexP…

请求的参数有 1 个:analysis,brand,country,device,genre,date,page 其中brand,country,device,genre是固定的,country指代国家,device指代统计手机类型,date表示日期,page表示页数 其余:brand_id/1? 中的数字 1 代表免费榜单,数字 0 代表付费榜单,数字 2 代表畅销榜榜单

注意:analysis参数是一个动态变化的值,当你看到这个链接在打开的时候已经过期了,但是不影响我们继续学习,只要上诉查找的方法找到即可使用,关于如何生成analysis参数这里涉及到JS逆向了,这里暂时不做过多说明

2. 分析响应

随后,观察这个请求的响应内容,如图

这个内容是 JSON 格式的,浏览器开发者工具自动做了解析以方便我们查看。

可以看到,我们要的数据几乎都在里面,甚至有更多的数据,但要注意,每一页只有20个APP信息,我们是以第二页为准,所以是从第21个开始为准

3. 实战演练

这里我们用程序模拟这些 Ajax 请求,将免费榜全部爬取下来。

首先,定义一个方法来获取每次请求的结果。相关代码如下

import requests

headers = {
    'authority': 'api.qimai.cn',
    'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
    'accept': 'application/json, text/plain, */*',
    'sec-ch-ua-mobile': '?0',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
    'sec-ch-ua-platform': '"Windows"',
    'origin': 'https://www.qimai.cn',
    'sec-fetch-site': 'same-site',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://www.qimai.cn/',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cookie': 'qm_check=SxJXQEUSChd2fHd1dRQQeV5EVVwcEHxZRlVVGGYREGV4dBB3QlRHWllaQxQOAgAQdFlCVVZDAXQIARROQ28FbwAQQEZoB28JHBR8A3QBAR0CAhsFAh4IBhoMBwAIGRIcElZfV1NSEg4aABwAHAAcABkHEE0%3D; gr_user_id=9ef08b21-8dd7-45f0-8c40-88996def62ec; USERINFO=zcXe0A9c7kmLDlPofA%2FnW6%2Fi0Vnf0iA1hg7SRijWXCD8N4AMklWRp4k9WlYvFCkziUdIlH7KTirUSklRPhSZGHLBY3fxLkORNX3KOso0WSnvf9i9KuRh4V8ddjeG0v%2BdSSm08lrJ55qInpKRd8%2BOzA%3D%3D; AUTHKEY=snHdCWmpZLSo9%2BAU1RQgKbDLcKvIfHg%2FUKgzMC92wsIUzanyQBD529MAujOMU%2BWyN9il0RH0o%2BycPNGb6jDmvbP2Uj5w1ydWA%2FteweJu0ziZ6TbqfL%2Bs%2FA%3D%3D; ada35577182650f1_gr_last_sent_cs1=qm10437503601; aso_ucenter=360bynVy6wNu9y4%2BH0gQasBLv2hH72JBvq3j2Q59OpTYoSF62HCcKfBwHaSk3sZn4A; PHPSESSID=p34ufc1vdab8q2edo34diq3rdc; ada35577182650f1_gr_session_id=922e8346-72fe-45be-b349-54deb6a8e6f5; ada35577182650f1_gr_last_sent_sid_with_cs1=922e8346-72fe-45be-b349-54deb6a8e6f5; ada35577182650f1_gr_session_id_922e8346-72fe-45be-b349-54deb6a8e6f5=true; tgw_l7_route=d09474674af82c17375cfcdd775c0c28; synct=1634137296.468; syncd=823; ada35577182650f1_gr_cs1=qm10437503601',
}

params = (
    ('analysis', 'dQ59QSxadUR9ZHFEdTB6QipZcBJSd35FUWhyVwYFDQh0FU5CUV5bH1leXAFPaAhBRU5SQlFeVG9ZXEsGeEcFB1gAAQEGBQEDCVF3G1U='),
    ('brand', 'all'),
    ('country', 'cn'),
    ('device', 'iphone'),
    ('genre', '36'),
    ('date', '2021-10-13'),
    ('page', '2'),
)
try:
    response = requests.get('https://api.qimai.cn/rank/indexPlus/brand_id/1', headers=headers, params=params)
    if response.status_code == 200:
        print('请求成功')
        print(response.json())
except requests.ConnectionError as e:
    print('Error', e.args)


请求成功
{'code': 10000, 'msg': '成功', 'time': '2021年10月13日', 'time_format': '', 'list': [{'index': 21, 'appInfo': {'appId': '741292507', 'appName': '小红书 – 标记我的生活', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple115/v4/1a/78/86/1a788646-787f-41ed-702b-ddfc9302cf6b/source/100x100bb.jpg', 'publisher': 'Xingin', 'country': 'cn', 'file_size': '368636928', 'price': '0.00'}, 'class': {'ranking': '3'}, 'change': -1, 'genre': '社交', 'appGenre': '社交', 'publisher_id': '708264912'}, {'index': 22, 'appInfo': {'appId': '440948110', 'appName': '快手', 'icon': 'https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/41/c2/43/41c243c7-163b-fca8-bac4-2e3c57a80501/source/100x100bb.jpg', 'publisher': 'Beijing Kwai Technology Co., Ltd.', 'country': 'cn', 'file_size': '774689792', 'price': '0.00'}, 'class': {'ranking': '4'}, 'change': -1, 'genre': '摄影与录像', 'appGenre': '摄影与录像', 'publisher_id': '440948113'}, {'index': 23, 'appInfo': {'appId': '1477031443', 'appName': '抖音极速版 - 集音符兑好礼', 'icon': 'https://is5-ssl.mzstatic.com/image/thumb/Purple125/v4/86/a0/5b/86a05bf5-9fb2-24a1-1fbe-0942a1cf315c/AppIcon_Lite-0-0-1x_U007emarketing-0-0-0-6-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png/180x180bb.png', 'publisher': 'Beijing Microlive Vision Technology Co., Ltd', 'country': 'cn', 'file_size': '411334656', 'price': '0.00'}, 'class': {'ranking': '5'}, 'change': -1, 'genre': '摄影与录像', 'appGenre': '摄影与录像', 'publisher_id': '1170416082'}, {'index': 24, 'appInfo': {'appId': '414245413', 'appName': '京东-有热爱 有生活', 'icon': 'https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/b2/f2/80/b2f2805b-a23d-adb1-0c7d-e0327e328b0b/source/100x100bb.jpg', 'publisher': 'Beijing Jingdong Century Trading Co., Ltd.', 'country': 'cn', 'file_size': '561410048', 'price': '0.00'}, 'class': {'ranking': '5'}, 'change': -1, 'genre': '购物', 'appGenre': '购物', 'publisher_id': '414196706'}, {'index': 25, 'appInfo': {'appId': '930368978', 'appName': '钉钉', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/78/c1/d5/78c1d57c-61da-2c32-ec7d-acd10f14df03/source/100x100bb.jpg', 'publisher': 'DingTalk Technology Co., Ltd.', 'country': 'cn', 'file_size': '592290816', 'price': '0.00'}, 'class': {'ranking': '1'}, 'change': -1, 'genre': '商务', 'appGenre': '商务', 'publisher_id': '1591008463'}, {'index': 26, 'appInfo': {'appId': '1087897068', 'appName': '企业微信', 'icon': 'https://is4-ssl.mzstatic.com/image/thumb/Purple115/v4/f6/18/01/f6180178-4586-55c0-f743-cf8877d100af/source/100x100bb.jpg', 'publisher': 'Tencent Technology (Shenzhen) Company Limited', 'country': 'cn', 'file_size': '710008832', 'price': '0.00'}, 'class': {'ranking': '2'}, 'change': 0, 'genre': '商务', 'appGenre': '商务', 'publisher_id': '292374531'}, {'index': 27, 'appInfo': {'appId': '458318329', 'appName': '腾讯视频-嘉南传热播', 'icon': 'https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/f0/78/d3/f078d352-a86d-026a-6bf6-8398590dffdd/source/100x100bb.jpg', 'publisher': 'Tencent Technology (Shenzhen) Company Limited', 'country': 'cn', 'file_size': '447510528', 'price': '0.00'}, 'class': {'ranking': '1'}, 'change': 0, 'genre': '娱乐', 'appGenre': '娱乐', 'publisher_id': '292374531'}, {'index': 28, 'appInfo': {'appId': '472208016', 'appName': '酷狗音乐-6000万正版曲库', 'icon': 'https://is5-ssl.mzstatic.com/image/thumb/Purple125/v4/60/49/39/6049390c-80d3-1fef-2f5f-4c3e97ea3e69/AppIcon-1x_U007emarketing-0-5-0-0-85-220.png/180x180bb.png', 'publisher': 'KuGou Technology CO. , LTD', 'country': 'cn', 'file_size': '328158208', 'price': '0.00'}, 'class': {'ranking': '1'}, 'change': 0, 'genre': '音乐', 'appGenre': '音乐', 'publisher_id': '472208019'}, {'index': 29, 'appInfo': {'appId': '599852710', 'appName': 'WPS Office', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/20/4f/5c/204f5c64-c850-4d2b-2f0a-b6206298fb22/source/100x100bb.jpg', 'publisher': '金山办公软件', 'country': 'cn', 'file_size': '371284992', 'price': '0.00'}, 'class': {'ranking': '1'}, 'change': 2, 'genre': '效率', 'appGenre': '效率', 'publisher_id': '379844548'}, {'index': 30, 'appInfo': {'appId': '414603431', 'appName': 'QQ音乐 - 让生活充满音乐', 'icon': 'https://is4-ssl.mzstatic.com/image/thumb/Purple115/v4/7c/ae/e8/7caee83f-38a3-c08c-182f-fbe99a0c859a/source/100x100bb.jpg', 'publisher': 'Tencent Technology (Shenzhen) Company Limited', 'country': 'cn', 'file_size': '532260864', 'price': '0.00'}, 'class': {'ranking': '2'}, 'change': -1, 'genre': '音乐', 'appGenre': '音乐', 'publisher_id': '292374531'}, {'index': 31, 'appInfo': {'appId': '391965015', 'appName': '中国建设银行', 'icon': 'https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/28/95/51/28955157-8aa5-49a0-1868-0a71933da96c/source/100x100bb.jpg', 'publisher': '中国建设银行', 'country': 'cn', 'file_size': '494776320', 'price': '0.00'}, 'class': {'ranking': '1'}, 'change': -1, 'genre': '财务', 'appGenre': '财务', 'publisher_id': '391965018'}, {'index': 32, 'appInfo': {'appId': '977946724', 'appName': '学习通', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/7d/50/50/7d5050e8-87c0-d054-9295-cf9f4069df1a/source/100x100bb.jpg', 'publisher': 'Beijing Chaoxing Digital Library Information Technology Co., Ltd.', 'country': 'cn', 'file_size': '225687552', 'price': '0.00'}, 'class': {'ranking': '1'}, 'change': -7, 'genre': '教育', 'appGenre': '教育', 'publisher_id': '1461737379'}, {'index': 33, 'appInfo': {'appId': '1484048379', 'appName': '腾讯会议-多人实时视频会议软件', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/67/54/c7/6754c7c4-7467-9e4c-baec-edabf4176716/AppIcon-Release-0-0-1x_U007emarketing-0-0-0-7-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png/180x180bb.png', 'publisher': 'Tencent Technology (Shanghai) Co., Ltd', 'country': 'cn', 'file_size': '338317312', 'price': '0.00'}, 'class': {'ranking': '3'}, 'change': 6, 'genre': '商务', 'appGenre': '商务', 'publisher_id': '473924491'}, {'index': 34, 'appInfo': {'appId': '515651240', 'appName': '中国农业银行', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/a1/f1/4d/a1f14df2-d35b-d1ad-95ae-04d9deac2aa9/source/100x100bb.jpg', 'publisher': '中国农业银行', 'country': 'cn', 'file_size': '187055104', 'price': '0.00'}, 'class': {'ranking': '2'}, 'change': -2, 'genre': '财务', 'appGenre': '财务', 'publisher_id': '515651243'}, {'index': 35, 'appInfo': {'appId': '393765873', 'appName': '爱奇艺-八角亭谜雾全网独播', 'icon': 'https://is3-ssl.mzstatic.com/image/thumb/Purple116/v4/4a/3d/94/4a3d94f9-850f-2456-fcbe-b86c1a9a8c40/AppIcon-0-0-1x_U007emarketing-0-0-0-5-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png/180x180bb.png', 'publisher': 'QIYI', 'country': 'cn', 'file_size': '291086336', 'price': '0.00'}, 'class': {'ranking': '2'}, 'change': -2, 'genre': '娱乐', 'appGenre': '娱乐', 'publisher_id': '387327025'}, {'index': 36, 'appInfo': {'appId': '590338362', 'appName': '网易云音乐-音乐的力量', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/60/ec/fc/60ecfc86-3d51-bc17-8cf5-f4a48c8eb104/AppIcon-0-0-1x_U007emarketing-0-0-0-6-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png/180x180bb.png', 'publisher': '杭州网易云音乐科技有限公司', 'country': 'cn', 'file_size': '595386368', 'price': '0.00'}, 'class': {'ranking': '3'}, 'change': -2, 'genre': '音乐', 'appGenre': '音乐', 'publisher_id': '1202760281'}, {'index': 37, 'appInfo': {'appId': '547166701', 'appName': '百度网盘', 'icon': 'https://is1-ssl.mzstatic.com/image/thumb/Purple125/v4/ad/19/cf/ad19cf2d-01f2-0586-ff05-0eed0669ea77/source/100x100bb.jpg', 'publisher': 'Beijing Duyou Science and Technology Co.,Ltd.', 'country': 'cn', 'file_size': '448137216', 'price': '0.00'}, 'class': {'ranking': '2'}, 'change': -2, 'genre': '效率', 'appGenre': '效率', 'publisher_id': '1546340138'}, {'index': 38, 'appInfo': {'appId': '736536022', 'appName': '哔哩哔哩-弹幕番剧直播高清视频', 'icon': 'https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/6e/1d/db/6e1ddb4b-1930-524c-fbb0-dfe856384403/source/100x100bb.jpg', 'publisher': 'bilibili', 'country': 'cn', 'file_size': '311798784', 'price': '0.00'}, 'class': {'ranking': '3'}, 'change': 3, 'genre': '娱乐', 'appGenre': '娱乐', 'publisher_id': '736535969'}, {'index': 39, 'appInfo': {'appId': '473225145', 'appName': 'QQ邮箱', 'icon': 'https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/74/91/cf/7491cf33-90da-6551-6537-017f2b650817/source/100x100bb.jpg', 'publisher': 'Tencent Mobile International Limited', 'country': 'cn', 'file_size': '296954880', 'price': '0.00'}, 'class': {'ranking': '4'}, 'change': -1, 'genre': '工具', 'appGenre': '工具', 'publisher_id': '504515421'}, {'index': 40, 'appInfo': {'appId': '370139302', 'appName': 'QQ浏览器-搜索资讯小说视频', 'icon': 'https://is4-ssl.mzstatic.com/image/thumb/Purple115/v4/9a/e6/28/9ae6284d-09e1-5144-2ee0-411201dbbc18/source/100x100bb.jpg', 'publisher': 'Tencent Technology (Shenzhen) Company Limited', 'country': 'cn', 'file_size': '312640512', 'price': '0.00'}, 'class': {'ranking': '5'}, 'change': -4, 'genre': '工具', 'appGenre': '工具', 'publisher_id': '292374531'}], 'is_logout': 0}

我们用 requests 请求这个链接,加入 headers 参数。然后判断响应的状态码,如果是 200,则直接调用 json() 方法将内容解析为 JSON 返回,否则不返回任何信息。如果出现异常,则捕获并输出其异常信息。

随后,我们需要定义一个解析方法,用来从结果中提取想要的信息,比如这次想保存APP的 类型、名称、公司、和排名这几个内容,那么可以先遍历 list,然后获取 其中中的各个信息,赋值为一个新的字典返回即可:

lists = response.json()['list']

results = []
for i in lists:
    result = {}
    result['APP'] = i['appInfo']['appName']
    result['类型'] = i['genre']
    result['公司'] = i['appInfo']['publisher']
    result['排名'] = i['index']
    print(result)
    results.append(result)

{'APP': '小红书 – 标记我的生活', '类型': '社交', '公司': 'Xingin', '排名': 21}
{'APP': '快手', '类型': '摄影与录像', '公司': 'Beijing Kwai Technology Co., Ltd.', '排名': 22}
{'APP': '抖音极速版 - 集音符兑好礼', '类型': '摄影与录像', '公司': 'Beijing Microlive Vision Technology Co., Ltd', '排名': 23}
{'APP': '京东-有热爱 有生活', '类型': '购物', '公司': 'Beijing Jingdong Century Trading Co., Ltd.', '排名': 24}
{'APP': '钉钉', '类型': '商务', '公司': 'DingTalk Technology Co., Ltd.', '排名': 25}
{'APP': '企业微信', '类型': '商务', '公司': 'Tencent Technology (Shenzhen) Company Limited', '排名': 26}
{'APP': '腾讯视频-嘉南传热播', '类型': '娱乐', '公司': 'Tencent Technology (Shenzhen) Company Limited', '排名': 27}
{'APP': '酷狗音乐-6000万正版曲库', '类型': '音乐', '公司': 'KuGou Technology CO. , LTD', '排名': 28}
{'APP': 'WPS Office', '类型': '效率', '公司': '金山办公软件', '排名': 29}
{'APP': 'QQ音乐 - 让生活充满音乐', '类型': '音乐', '公司': 'Tencent Technology (Shenzhen) Company Limited', '排名': 30}
{'APP': '中国建设银行', '类型': '财务', '公司': '中国建设银行', '排名': 31}
{'APP': '学习通', '类型': '教育', '公司': 'Beijing Chaoxing Digital Library Information Technology Co., Ltd.', '排名': 32}
{'APP': '腾讯会议-多人实时视频会议软件', '类型': '商务', '公司': 'Tencent Technology (Shanghai) Co., Ltd', '排名': 33}
{'APP': '中国农业银行', '类型': '财务', '公司': '中国农业银行', '排名': 34}
{'APP': '爱奇艺-八角亭谜雾全网独播', '类型': '娱乐', '公司': 'QIYI', '排名': 35}
{'APP': '网易云音乐-音乐的力量', '类型': '音乐', '公司': '杭州网易云音乐科技有限公司', '排名': 36}
{'APP': '百度网盘', '类型': '效率', '公司': 'Beijing Duyou Science and Technology Co.,Ltd.', '排名': 37}
{'APP': '哔哩哔哩-弹幕番剧直播高清视频', '类型': '娱乐', '公司': 'bilibili', '排名': 38}
{'APP': 'QQ邮箱', '类型': '工具', '公司': 'Tencent Mobile International Limited', '排名': 39}
{'APP': 'QQ浏览器-搜索资讯小说视频', '类型': '工具', '公司': 'Tencent Technology (Shenzhen) Company Limited', '排名': 40}
# 统计是否数量为20
print(len(results))
20

这样,我们就顺利通过分析 Ajax 并编写爬虫爬取下来了第二页的APP列表

Taks6、作业

目标网站:www.qimai.cn/rank/market… 目的:尝试通过上面讲述的方式去调试获取以下的数据

注:这里只要求你能够学会调试技巧,获取数据保存即可,暂时不需要对加密参数深入学习

!! 温馨提示,该项目只作为练习,切勿做出对目标网站有所压力的行为

import requests
rankInfo=[]
headers = {
    'authority': 'api.qimai.cn',
    'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
    'accept': 'application/json, text/plain, */*',
    'sec-ch-ua-mobile': '?0',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
    'sec-ch-ua-platform': '"Windows"',
    'origin': 'https://www.qimai.cn',
    'sec-fetch-site': 'same-site',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://www.qimai.cn/',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cookie': 'PHPSESSID=ra9ahmicm4252352sosff64ipi; qm_check=SxJXQEUSChd2fHd1dRQQfmZ5dHlxEHJSdF9LU1EYd2RoEAEABQUXZlkZdF1KVVNEA3QBARVBQW8MbwQYQENvBW8AGRcbEFNRVVdTEgoSABwAHAUbAhwJEkk%3D; gr_user_id=4ac5a31e-7dc7-411f-bf73-1c3378d834c8; ada35577182650f1_gr_session_id=97280758-5ec9-44b6-88d0-d3166b9288ce; ada35577182650f1_gr_session_id_97280758-5ec9-44b6-88d0-d3166b9288ce=true; synct=1634997039.601; syncd=-1465; tgw_l7_route=1ed618a657fde25bb053596f222bc44a',
}

params = (
    ('analysis', 'eEcbRABeWx9dUUJbXRBlWQpfdkIBAQkIBwEDAFICCFZ0FVA='),

)
try:
    response = requests.get('https://api.qimai.cn/rank/marketRank?analysis=eEcbRABeWx9dUUJbXRBlWQpfdkIBAQkIBwEDAFICCFZ0FVA%3D', headers=headers, params=params)
    if response.status_code == 200:
        print('请求成功')
        # print(response.json())
        rankInfo=response.json()['rankInfo']

except requests.ConnectionError as e:
    print('Error', e.args)


请求成功
print(rankInfo[:1])
[{'appInfo': {'appId': '54', 'appName': '喜马拉雅', 'icon': 'https://appimg.dbankcdn.com/application/icon144/863620aa71a54d54b87669592dddaa0d_1.png', 'publisher': '喜大(上海)网络科技有限公司', 'app_comment_score': 4.7, 'app_comment_count': '6391'}, 'rankInfo': {'ranking': '1', 'change': 4, 'genre': '影音娱乐'}, 'genre': '影音娱乐', 'releaseTime': '2021-10-23', 'downloadNum': 0, 'company': {'id': '48', 'name': '上海证大喜马拉雅网络科技有限公司'}}]
results = []
header=['APP','评分','类型','公司','排名']
for i in rankInfo:
    result = [ i['appInfo']['appName'], i['appInfo']['publisher'], i['appInfo']['app_comment_score'], i['appInfo']['publisher'], i['rankInfo']['ranking']]
    results.append(result)
import csv
with open('app_info.csv','w',newline='') as fp:
        # 获取对象
        writer = csv.writer(fp)
        # 写入数据
        writer.writerow(header) #写入表头
        writer.writerows(results) # 写入数据
print(f"已写入{len(results)}条记录")    
已写入200条记录
!cat app_info.csv
APP,评分,类型,公司,排名
喜马拉雅,喜大(上海)网络科技有限公司,4.7,喜大(上海)网络科技有限公司,1
抖音极速版(看视频,领现金),北京微播视界科技有限公司,3.9,北京微播视界科技有限公司,2
优酷视频,优酷信息技术(北京)有限公司,2.4,优酷信息技术(北京)有限公司,3
喜马拉雅极速版,上海喜马拉雅科技有限公司,4.6,上海喜马拉雅科技有限公司,4
爱奇艺体育,北京新英世播传媒技术有限公司,1.7,北京新英世播传媒技术有限公司,5
斗鱼,武汉瓯越网视有限公司,1.8,武汉瓯越网视有限公司,6
YY,广州津虹网络传媒有限公司,4.3,广州津虹网络传媒有限公司,7
西瓜视频,北京字节跳动科技有限公司,4.7,北京字节跳动科技有限公司,8
爱奇艺,北京爱奇艺科技有限公司,2.3,北京爱奇艺科技有限公司,9
荔枝,广州荔支网络技术有限公司,2.7,广州荔支网络技术有限公司,10
云听,央广新媒体文化传媒(北京)有限公司,3.6,央广新媒体文化传媒(北京)有限公司,11
好看视频(发视频领现金),百度在线网络技术(北京)有限公司,4,百度在线网络技术(北京)有限公司,12
咪咕音乐,咪咕音乐有限公司,3.9,咪咕音乐有限公司,13