我试图刮一个电台网站,以获得当前的图表(https://www.energy.de/programm/energy-euro-hot-30,然后https://music.apple.com/de/playlist/energy-euro-hot-30/pl.9b672a18307c4cd7ba1ece0106891868).我使用Python和请求HTML模块.当我分析请求提供的HTML代码时,我可以分析的元素没有包括在内.但是,如果我判断浏览器中显示的页面,我会找到所需的数据.我在本周初遇到了类似的问题,当时一个用户(https://stackoverflow.com/users/10035985/andrej-kesely)帮助了我. 他使用Chrome Devtools及其网络选项卡找到正确的链接来访问所需的数据.我现在已经try 了这个我自己为我目前的问题,但完全淹没了洪水的连接.或许有人能帮我把方向推到正确的方向上...

我试过使用Chrome DevTools和他们的网络选项卡来找到正确的链接来获取我需要的数据.我没有成功.

推荐答案

您在Network选项卡中看不到任何内容,因为数据存储在页面的<script>个元素中.下面是一个如何解析它的示例:

import json

import requests
from bs4 import BeautifulSoup


def find_tracks(o):
    if isinstance(o, dict):
        if o.get("itemKind") == "trackLockup":
            yield o["items"]
            return
        for v in o.values():
            yield from find_tracks(v)
    elif isinstance(o, list):
        for v in o:
            yield from find_tracks(v)


url = "https://music.apple.com/de/playlist/energy-euro-hot-30/pl.9b672a18307c4cd7ba1ece0106891868"

soup = BeautifulSoup(requests.get(url).content, "html.parser")
data = json.loads(soup.select_one("#serialized-server-data").text)

tracks = next(find_tracks(data))

# print(json.dumps(tracks, indent=4))

for track in tracks:
    print(f'{track["title"]:<55} {track["artistName"]}')

打印:

Overdrive (feat. Norma Jean Martine)                    Ofenbach
Houdini                                                 Dua Lipa
Strangers                                               Kenya Grace
When We Were Young (The Logical Song)                   David Guetta & Kim Petras
greedy                                                  Tate McRae
Gimme Love                                              Sia
Lose Control                                            Teddy Swims
Cynical                                                 twocolors, Safri Duo & Chris de Sarandy
Lovin On Me                                             Jack Harlow
Si No Estás                                             Iñigo Quintero
Paint The Town Red                                      Doja Cat
Water                                                   Tyla
On My Love                                              Zara Larsson & David Guetta
Is It Love                                              Loreen
I'll Be There                                           Robin Schulz, Rita Ora & Tiago PZK
Dreaming                                                Marshmello, P!nk & Sting
American Town                                           Ed Sheeran
Is It Over Now? (Taylor's Version) [From The Vault]     Taylor Swift
Better Me                                               Michael Schulte & R3HAB
Mwaki                                                   ZERB
Substitution (feat. Julian Perretta)                    Purple Disco Machine & Kungs
RUNAWAY                                                 OneRepublic
Blindside                                               James Arthur
Dive                                                    Lost Frequencies & Tom Gregory
Tattoo                                                  Loreen
LOVE'n'TENDRESSE                                        Eddy de Pretto
Prada                                                   cassö, RAYE & D-Block Europe
Never Give Up                                           Puggy
Used To Be Young                                        Miley Cyrus
Seasons                                                 Thirty Seconds to Mars

Python-3.x相关问答推荐

Pandas groupby基于索引的连续列值相等

使用pybind11时,在sys.exit(0)处成功完成测试后,Python单元测试冻结

tkinter treeview 如何在获取所选项目时将设置的对象作为对象返回

命名空间前缀无效

ImportError:抓取数据后找不到 html5lib

无法使用 curve_fit() 在 python 中复制高斯函数的曲线拟合

使用 multiprocessing 处理图像

裁剪复数以解决 exp 中的溢出错误

使用 GEKKO 使用代码解决最佳时间控制问题时出现 IndexError

使用 python 正则表达式匹配日期

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

Python 类型提示语法如何/为什么起作用?

是否有与 Laravel 4 等效的 python?

Asyncio RuntimeError:事件循环已关闭

如何使用 d.items() 更改 for 循环中的所有字典键?

Python:在 map 对象上调用列表两次

为什么 TensorFlow 的 `tf.data` 包会减慢我的代码速度?

SQLAlchemy:如果不存在则创建模式

在 linux mint 上安装 python3-venv 模块

TypeError:无法实例化类型元组;使用 tuple() 代替