我正在尝试用PyCharm编写程序(我以前没有使用过此IDE,但我不认为这是问题所在)我在收集数据时遇到了麻烦某个class,“ react-contextmenu-wrapper”
[我想编写一个脚本来解析Spotify上的网页并使用数据创建CSV文件,我一直在关注YouTube上的教程,但我一定在某个地方出错了。
这是我的代码:
from urllib.request import urlopen as Req
from bs4 import BeautifulSoup as soup
my_url = "https://open.spotify.com/genre/NMF-PopularNewReleases"
#grabs the contense of the page
Client = Req(my_url)
#reads the contense of the page
html = Client.read()
#outputs the page
Client.close()
page = soup(html, "html.parser")
#grabs each playlist
playlists = page.findAll("div",{"class":"react-contextmenu-wrapper"})
print(len(playlists))
但是终端输出一个空列表,我知道该类存在。检查页面的元素时可以查看它。
元素的类被命名为react-contextmenu-wrapper
的事实是一个很大的提示。 React是一个用于创建用户界面的JavaScript库。
可以使用多种方法来填充网页元素。如果幸运的话,服务器将向您发送.html
,其中包含所有基本包含的内容-使用BeautifulSoup进行刮擦和解析很简单。
然而,许多现代网站例如使用JavaScript动态填充网页的元素。当您在浏览器中查看这样的页面时,这没问题-但是,如果您尝试抓取这样的页面,最终将得到的只是“裸露的骨头”模板.html
,其中没有填充DOM充分地。这就是为什么BeautifulSoup无法看到此元素的原因。
重点是:仅因为您可以在浏览器中看到一个元素,并不意味着BeautifulSoup将能够看到它。
[我认为,每当要抓取网页时,首选武器都不应该是BeautifulSoup,您应该将BeautifulSoup作为最后的手段。您应该始终做的第一件事就是检查您要抓取的页面是否向API发出了任何请求,该请求的响应用于填充自身。如果是这样,您可以简单地将请求模拟到相同的API,并获取所有可能要抓取的内容。好像还不够好,这些API通常会提供JSON,而解析起来很简单。
这是您的操作方式:
F12
键访问开发人员工具(其他现代浏览器应具有类似的功能功能。]Ctrl + E
或单击左上角的圆形记录按钮启用日志记录(激活后,该记录也会变为红色。)Ctrl + R
刷新页面并开始记录流量。使用requests
编写简单脚本的时间。您将要复制“请求网址”,并确保复制一些“请求标头”看起来它们对于请求也可能很重要:
import requests
url = "https://api.spotify.com/v1/views/NMF-PopularNewReleases?timestamp=2020-03-22T14%3A26%3A36.760Z&platform=web&content_limit=10&limit=20&types=album%2Cplaylist%2Cartist%2Cshow%2Cstation&image_style=gradient_overlay&country=us&market=us&locale=en"
headers = {
"Authorization": "Bearer BQDJeAA33JWAC_pQVUxoPpama63RFFIsovMjNOjq_odaPx9EfyMz1Bo494Xv4a20H9gM7Hu0OYZrO3QWs2E"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
data = response.json()
for item in data["content"]["items"]:
print(item["name"])
运行该脚本时,得到以下输出:
New Music Friday
After Hours
Colores
kelsea
Actions
Kid Krow
Walk Em Down (feat. Roddy Ricch)
Studio It’s Hits
Intentions (Acoustic)
Creep
Is Everybody Going Crazy?
2 Seater (feat. G-Eazy & Offset)
Roses/Lotus/Violet/Iris
Spotify Singles
Between Us (feat. Snoh Aalegra)
E.P.
Black Men Don’t Cheat (feat. Ari Lennox, 6LACK & Tink)
Think About You
Pray 4 Love
Acrobats
>>>
随时检查API返回的JSON对象-您可以在Python中执行此操作,也可以通过从Chrome开发者工具中的“标题”标签切换到“预览”标签来查看JSON的内容。在我的示例中,我只是在首页提取了歌曲的标题,但JSON对象包含了很多有趣的东西。您也可以在URL的查询字符串中使用参数来获取20首以上的歌曲,等等。