【问题标题】:Scraping text from a website when the text does not appear in the source当文本未出现在源中时从网站中抓取文本
【发布时间】:2017-08-14 08:50:10
【问题描述】:

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

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

我是这方面的初学者,所以请温柔一点!

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

附加信息:我在树莓派上使用 Python 3

【问题讨论】:

  • 您必须在加载网站时监控网络调用并获取在 python 中使用的准确 URI(以及必要的表单数据?)。或者你可以使用 python-selenium,它可以像浏览器一样工作并执行webdriver.get_source
  • @AshishNitinPatil - 这看起来像是一个答案。

标签: python html ajax beautifulsoup screen-scraping


【解决方案1】:

Now Playing 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

【讨论】:

  • 非常感谢,这很容易实现和使用。出于某种原因,我不得不将 re = requests.get(ajax_url).content 更改为 re = requests.get(ajax_url).content.decode('utf-8') 才能使其工作。我现在将尝试学习为什么它有效
  • 不客气!不要忘记通过单击向上/向下按钮下的灰色勾号按钮来接受其中一个答案。
  • 我不希望每个人都为我做这项工作,所以有人可以指出我可以学习如何确定 ajax url 的方向,就像这个答案一样,但不同(但非常相似)网站。
  • 请注意...不要将ps1. 硬编码到您的源代码中。请仅使用ps.。而且您不应该公开您的子密钥。
  • 谢谢克雷格。当我弄清楚什么是子键时,我会尽量不暴露它!我猜这与 AJAX 网址有关,但我还没有弄清楚它的来源。
【解决方案2】:

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

(警告 - Firefox 插件对版本有些挑剔,Ubuntu 中的最后一个稳定版本仅适用于最高 45 的 Firefox)

【讨论】:

  • 感谢您的快速回复。硒听起来很有希望。我在树莓派上用 python 编程。 selenium 可以在这个平台上工作吗?
【解决方案3】:

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

或者您可以使用python-selenium,它的工作方式与浏览器完全一样。加载页面后,可以使用driver.page_source通过BeautifulSoup解析源码。

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

【讨论】:

  • 我搜索了一个 API,但我认为他们没有提供这个。像硒一样的接缝可能是答案。到目前为止,我只快速浏览了文档,它似乎相当复杂。我不担心是否需要一点学习(学习很有趣),但我的第一印象是,这可能就像用大锤敲碎坚果一样,
  • 取决于用例。 Selenium 基本上是一个浏览器,所以运行起来会很繁重。应该可以在树莓派上运行它,但不能肯定地说。如果您想避免使用 selenium,请查看网络调用并查看您的浏览器正在请求哪些 url,也许您会很幸运并找到适合“正在播放”数据的 URL。
【解决方案4】:

使用 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 上兼容的浏览器驱动程序。

【讨论】:

  • 感谢您的回答。它看起来很容易实现。我将在可以访问 普通 PC 后立即试用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2018-01-09
  • 1970-01-01
  • 2020-10-23
  • 2010-09-29
相关资源
最近更新 更多