python 爬取 jsonp 请求的响应数据

jsonp  是为了解决跨域问题而诞生出的解决方案。在现代浏览器中,除了src等特殊标签可以允许跨域,其他时候都不允许跨域访问。为了解决这个问题,jsonp诞生了。

其原理主要是 向服务端传递一个一个callback 方法,以及其他请求参数。服务端接受到请求之后,收集对应参数所需要的数据,并加上之前传过来的callback 方法名 ,包装成一个内容为 js文件的响应。客户端再对这个伪js方法进行解析。

 

示例:

 以 http://www.neeq.com.cn/zone/newshare/listofissues.html  为例

其 数据获得接口为 http://www.neeq.com.cn/newShareController/infoResult.do?callback=jQuery211_1592489332270

其中 最后的159开头的即为13位时间戳。

在浏览器中,其显示为post请求。这里我们先copy下整个headers

jsonp请求

 

再看formdata表单,看起来也很正常jsonp请求的form表单

 

### 如何使用 Python 爬取 QQ 音乐数据 要实现通过 Python 抓取 QQ 音乐的数据,可以按照以下方法操作: #### 1. 数据获取方式 QQ 音乐通常会提供 API 接口用于前端页面加载所需的内容。这些接口可以通过浏览器开发者工具中的 **Network** 标签找到。当访问某个歌曲或者歌单详情页时,观察请求记录即可发现对应的 XHR 请求地址[^1]。 对于 JSON 格式的响应内容,在 Python 中可以直接利用 `requests` 库发送 HTTP 请求,并借助内置模块 `json.loads()` 将其解析为字典结构以便进一步处理[^2]。 ```python import requests def fetch_music_data(url, params=None): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get(url=url, params=params, headers=headers) if response.status_code == 200: try: data = response.json() # 解析JSON格式返回值 return data except Exception as e: print(f"Error occurred while parsing json: {e}") return None else: print(f"Failed to retrieve data with status code {response.status_code}.") return None ``` #### 2. 处理评论数据 如果目标是从特定 URL 获取某首歌曲下的用户评论,则可以根据已知的参数模板构建完整的 GET 请求链接[^3]。下面是一个简单的例子展示如何分页读取指定数量的评论条目: ```python base_url = "https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg" params_template = { 'g_tk': '2058499274', 'jsonpCallback': 'jsoncallback06927647062927766', 'loginUin': '2230661779', 'hostUin': '0', 'format': 'jsonp', 'inCharset': 'utf8', 'outCharset': 'GB2312', 'notice': '0', 'platform': 'yqq', 'needNewCode': '0', 'cid': '205360772', 'reqtype': '2', 'biztype': '1', 'topid': '{song_id}', # 替换为目标歌曲ID 'cmd': '8', 'needmusiccrit': '0', 'pagenum': '{page_num}', 'pagesize': '25', # 每次最多拉取25条评论 } all_comments = [] for i in range(10): # 假设只抓取前10页 current_params = dict(params_template) current_params['pagenum'] = str(i) result = fetch_music_data(base_url, current_params) comments_list = result.get('comment').get('list') all_comments.extend(comments_list or []) print(len(all_comments), "comments collected.") ``` 以上脚本实现了基本功能框架,实际应用过程中还需要注意异常情况以及可能存在的反爬机制等问题。 --- ####
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值