当文本未出现在源中时,从网站上刮取文本

时间:2017-03-22 10:01:22

标签: python html ajax beautifulsoup screen-scraping

我正在尝试使用Python和Beautiful Soup从http://radioplayer.magic.co.uk/live检索“正在播放”信息。

我可以在网络浏览器中看到该文本,并且可以复制并粘贴它,所以我假设这个文本是从某个地方下载的,当我从Beautiful Soup查看页面时,我看不到文本,甚至可能在哪里来自。

我是初学者所以请温柔!

提前感谢您分享您的知识和经验。

其他信息:我在树莓派上使用Python 3

4 个答案:

答案 0 :(得分:2)

正在播放 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

答案 1 :(得分:0)

这似乎是python和selenium的任务:http://selenium-python.readthedocs.io/(这使您可以控制浏览器并执行您可以手动执行的任何操作,例如选择显示的文本)

(Warinng - Firefox插件在版本方面有些挑剔,Ubuntu中的最后一个稳定版本仅适用于最多45个版本的Firefox)

答案 2 :(得分:0)

如果您想坚持使用无头浏览器(例如urllibrequests),那么您必须在加载网站时监控网络呼叫并获取确切的URI(和必要的表格)数据?)在python中使用。

或者您可以使用python-selenium,它与浏览器完全相同。加载页面后,您可以使用driver.page_source通过BeautifulSoup解析源代码。

此外,如果你很幸运,也许该网站有一个API(json / xml),可以让你获取你想要的东西,而无需解决原始来源的麻烦。

答案 3 :(得分:0)

使用硒通常比实际使用更难。例如,您可以先在普通PC上尝试以下操作:

sem_t sem[3];

// ...

while(1) {
        for(n = 0; n < 3; n++) {
                rc=sem_post(&sem[n]);
                assert(rc==0);
        }

        sleep(1);
}

这会给你类似的东西:

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

您需要调查哪个浏览器驱动程序将与Raspberry Pi兼容。