当文本未出现在源中时从网站上抓取文本
Scraping text from a website when the text does not appear in the source
我正在尝试使用 Python 和 Beautiful Soup 从 http://radioplayer.magic.co.uk/live 检索 'Now Playing' 信息。
我可以在网络浏览器中看到文本并且可以复制和粘贴它所以我假设这段文本是从某个地方下载的,当我从 Beautiful Soup 查看页面时我看不到文本甚至在哪里它可能来自。
我是这方面的初学者所以请温柔!
在此先感谢您分享您的知识和经验。
附加信息:我在 raspberry pi
上使用 Python 3
这似乎是 python 和 selenium 的任务:http://selenium-python.readthedocs.io/(这使您能够控制浏览器并执行您可以手动执行的任何操作,例如 select 显示文本)
(Warinng - Firefox 插件对版本有些挑剔,Ubuntu 中的最后一个稳定版本仅适用于 Firefox 45)
如果您想坚持使用无头浏览器(例如 urllib
, requests
),那么您将不得不在加载网站时监控网络调用并获取要使用的确切 URI(和必要的表单数据?)在 python.
或者您可以使用 python-selenium
,它的工作方式与浏览器完全一样。加载页面后,您可以使用 driver.page_source
通过 BeautifulSoup.
解析源代码
此外,如果幸运的话,也许该网站有一个 API (json/xml),可以让您获取所需的内容,而无需经历解析原始源的麻烦。
使用 selenium 通常比实际使用更难安装。例如,您可以先在普通 PC 上尝试以下操作:
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
url = "http://radioplayer.magic.co.uk/live/"
browser = webdriver.Firefox(firefox_binary=FirefoxBinary())
browser.get(url)
soup = BeautifulSoup(browser.page_source, 'html.parser')
playlist = soup.find(id='playlist')
print playlist.find('span', class_='artist').text
print playlist.find('span', class_='title').text
这会给你这样的东西:
Level 42
Running In The Family
您需要调查哪个浏览器驱动程序与 Raspberry Pi 兼容。
正在播放 div 的内容通过发出 AJAX 请求动态加载,即为什么它不包含在您将收到的源页面中。
您可以做的是模仿发出的 ajax 请求并从那里获取响应。
这是实现此目标的方法:
import requests
import json
main_url = "http://radioplayer.magic.co.uk/live/"
ajax_url = "http://ps1.pubnub.com/subscribe/sub-eff4f180-d0c2-11e1-bee3-1b5222fb6268/np_4/0/14901814159272341?uuid=ef978c6c-2edf-4ff5-910a-39765d038427"
re = requests.get(ajax_url).content
playing_list = json.loads(re)[0]
max_time = 0
playing_now_dict = {}
for playings in playing_list :
if int(playings['start_time']) > max_time :
playing_now_dict = playings
print(playing_now_dict.get('title', ''))
print(playing_now_dict.get('artist', ''))
当前打印:
Young Hearts Run Free
Candi Staton
我正在尝试使用 Python 和 Beautiful Soup 从 http://radioplayer.magic.co.uk/live 检索 'Now Playing' 信息。
我可以在网络浏览器中看到文本并且可以复制和粘贴它所以我假设这段文本是从某个地方下载的,当我从 Beautiful Soup 查看页面时我看不到文本甚至在哪里它可能来自。
我是这方面的初学者所以请温柔!
在此先感谢您分享您的知识和经验。
附加信息:我在 raspberry pi
上使用 Python 3这似乎是 python 和 selenium 的任务:http://selenium-python.readthedocs.io/(这使您能够控制浏览器并执行您可以手动执行的任何操作,例如 select 显示文本)
(Warinng - Firefox 插件对版本有些挑剔,Ubuntu 中的最后一个稳定版本仅适用于 Firefox 45)
如果您想坚持使用无头浏览器(例如 urllib
, requests
),那么您将不得不在加载网站时监控网络调用并获取要使用的确切 URI(和必要的表单数据?)在 python.
或者您可以使用 python-selenium
,它的工作方式与浏览器完全一样。加载页面后,您可以使用 driver.page_source
通过 BeautifulSoup.
此外,如果幸运的话,也许该网站有一个 API (json/xml),可以让您获取所需的内容,而无需经历解析原始源的麻烦。
使用 selenium 通常比实际使用更难安装。例如,您可以先在普通 PC 上尝试以下操作:
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
url = "http://radioplayer.magic.co.uk/live/"
browser = webdriver.Firefox(firefox_binary=FirefoxBinary())
browser.get(url)
soup = BeautifulSoup(browser.page_source, 'html.parser')
playlist = soup.find(id='playlist')
print playlist.find('span', class_='artist').text
print playlist.find('span', class_='title').text
这会给你这样的东西:
Level 42
Running In The Family
您需要调查哪个浏览器驱动程序与 Raspberry Pi 兼容。
正在播放 div 的内容通过发出 AJAX 请求动态加载,即为什么它不包含在您将收到的源页面中。
您可以做的是模仿发出的 ajax 请求并从那里获取响应。
这是实现此目标的方法:
import requests
import json
main_url = "http://radioplayer.magic.co.uk/live/"
ajax_url = "http://ps1.pubnub.com/subscribe/sub-eff4f180-d0c2-11e1-bee3-1b5222fb6268/np_4/0/14901814159272341?uuid=ef978c6c-2edf-4ff5-910a-39765d038427"
re = requests.get(ajax_url).content
playing_list = json.loads(re)[0]
max_time = 0
playing_now_dict = {}
for playings in playing_list :
if int(playings['start_time']) > max_time :
playing_now_dict = playings
print(playing_now_dict.get('title', ''))
print(playing_now_dict.get('artist', ''))
当前打印:
Young Hearts Run Free
Candi Staton