使用Ghost.py在python中屏幕抓取动态网页

时间:2014-06-24 22:07:12

标签: javascript python screen screen-scraping ghost.py

ghost = Ghost()
page, rcs = ghost.open(https://soundcloud.com/passionpit/sets/favorites)
page, rcs = ghost.wait_for_page_loaded()
songs = ghost.evaluate("document.getElementsByClassName('soundTitle__title');")
print songs

我正在尝试使用上面的代码来查找上一页中包含类' soundTitle__title'的所有html元素。但是现在我的输出是

QFont::setPixelSize: Pixel size <= 0 (0)
({PyQt4.QtCore.QString(u'length'): 0.0}, [])

任何人都可以帮我看看我的问题所在吗?当我在浏览器控制台中运行document.getElementsByClassName('soundTitle__title')时,我得到了我期望的输出,为什么Python输出不同?

或者有没有办法让我在运行JavaScript之后使用Ghost.py或其他类似的库来获取页面的源代码(使用浏览器开发人员工具检查元素时看到的源代码)?

1 个答案:

答案 0 :(得分:4)

我得到了这个,并建议使用Splinter,这基本上只是在幕后运行phantomjs和selenium。

你需要运行pip install splinter并在你的机器上安装phantomjs,通过下载/解压缩或npm -g install phantomjs如果你有npm等等。但总的来说,安装和依赖是最小的和简单的。

以下代码返回'Ryn Weaver - OctaHate',我假设你正在寻找它,虽然没有更多的上下文我不能完全确定。

from splinter import Browser

browser = Browser('phantomjs')
browser.visit('https://soundcloud.com/passionpit/sets/favorites')
songs = browser.find_by_xpath("//a[contains(@class, 'soundTitle__title')]")
if songs:
    for song in songs:
        print song.text
else:
    print "there aren't any songs"

你还会注意到我必须做一个xpath-contains来获取你正在寻找的类描述;因此,当您尝试使用您使用的符号访问该类时,您可能会遇到问题 - 有一个span元素和一个都包含'soundTitle__title'的锚元素,但据我所知,只有'a '元素有文字,我猜这就是你要找的东西。但如果你想要两者,你可以browser.find_by_xpath("//*[contains(@class, 'soundTitle__title')]")