我正在抓取 khanacademy 上的个人资料页面。我使用他们的 API(json 文件格式)来做到这一点。
这是我想要抓取的个人资料链接:https://www.khanacademy.org/profile/Viruslala/
这是它的 API 链接:
https://www.khanacademy.org/api/internal/user/kaid_896965538702696832878421/profile/widgets?lang=en&_=190427-0731-8941ef3f07bd_1556382106890
我的问题:大部分数据显示在 json 文件(API)上。但我想抓取的一些具体数据没有显示。
我尝试搜索不同的 API 链接,但没有找到正确的链接。
在第一张图片上,我想抓取两种数据:蓝色数据和黄色数据。
在 json 文件上:显示蓝色。但不是黄色。
我的问题是: 为什么黄色不显示? 我如何使用他们的 API 获得黄色信息?
最佳答案
黄色(个人资料信息)可以从原始 URL 响应文本中进行正则表达式处理。
探索json这里。模式r
导致提取字符串,该字符串可以用json
加载以生成包含所有信息的字典。
import requests
import json
import re
res = requests.get('https://www.khanacademy.org/profile/Viruslala/')
r = re.compile(r'profileInitOptions":(.*),"view"', re.DOTALL)
data = json.loads(r.findall(res.text)[0])
profile_data = data['profileData']
print(profile_data)
<小时/>
注释:
当 javascript 在页面上运行时,页面会从 script
标记动态加载所需的内容。由于 js 不随请求运行,您仍然可以应用正则表达式模式来获取包含感兴趣数据的 javascript 对象。您可以使用以下方式指定模式:
r = re.compile(r'profileInitOptions":(.*),"view"', re.DOTALL)
然后将其应用于响应文本 res.text
,并提取第一个返回的匹配项:
r.findall(res.text)[0]
对于这个页面,返回的内容可以用json库解析:
json.loads(r.findall(res.text)[0])
该字符串现在位于名为 data
的字典对象中,您可以通过键从中访问信息
data['profileData']
<小时/>
正则表达式:
<小时/>制作“.”特殊字符完全匹配任何字符,包括换行符;没有这个标志,'.'将匹配除换行符之外的任何内容。对应于内联标志 (?s)。
关于python - 如何使用json api获取html数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882837/