【问题标题】:Of scraping data, headless browsers, and Python [closed]抓取数据、无头浏览器和 Python [关闭]
【发布时间】:2013-08-08 18:30:07
【问题描述】:

所以我是一名 CS 学生,试图学习网络抓取以及随之而来的所有注意事项。在使用了 iMacros 和其他一些数据抓取“工具”之后,我转向了 Python,这是一种我当时并不熟悉的语言。我了解了 BeautifulSoup 和 urllib2,并通过 stackoverflow 和其他一些论坛学习了它。

现在,利用我目前获得的知识,我可以抓取大多数静态网页。然而,我们都知道静态页面的时代已经结束,因为 JS 现在在即使是平庸的网站上也占据着至高无上的地位。

我希望有人在这里指导我正确的方向。我想学习一种加载 Javascript 网页的方法,加载所有内容,然后以某种方式将这些数据放入 BeautifulSoup 函数。 Urllib2 很糟糕。我还希望能够填写表格并通过按钮点击进行导航。

我感兴趣的大多数网站都包含一长串在您向下滚动时会加载的结果。全部加载然后下载页面似乎没有帮助(不知道为什么会这样)。我使用的是 Windows 7,并安装了 Python 2.7.5。

有人告诉我,诸如僵尸或 Ghost 之类的无头浏览器会帮助我,但我真的不太了解这些。我尝试使用诸如 mechanize 之类的库,但它们并不能真正满足我的需要,即加载结果、获取网页以及输入 BS4。

考虑到我对 Python 的了解很少,有人可以在这里帮助我吗?

谢谢

【问题讨论】:

  • Javascript 可能会从一些外部 JSON / XML / PHP 服务器获取资源。使用 Firebug 或 Chrome 开发者工具找出那个来源,然后从那里抓取。
  • 我想你是对的,但我希望有更多通用的解决方案,使用无头浏览器或类似的方法
  • 我不知道,抱歉 :(
  • 我不会非常支持 Ghost。它非常有限,不适用于大多数网站。
  • 是的,我试过 Ghost,但效果不是很好

标签: javascript python web-scraping screen-scraping


【解决方案1】:

Selenium Webdriverphantomjs 可以对 JavaScript 驱动的网页进行无头自动浏览。安装后就可以这样使用了:

import contextlib
import selenium.webdriver as webdriver
import bs4 as bs

# define path to the phantomjs binary
phantomjs = 'phantomjs'
url = ...
with contextlib.closing(webdriver.PhantomJS(phantomjs)) as driver:
    driver.get(url)
    content = driver.page_source
    soup = bs.BeautifulSoup(content)

在 Ubuntu 上,它们可以安装

  • sudo pip install -U selenium
  • Download and unpack phantomjs
  • 将 phantomjs 二进制文件链接或移动到 PATH 中的目录

    % cd phantomjs-1.9.0-linux-i686/bin/
    % ln phantomjs ~/bin
    

【讨论】:

  • 我被引导相信 PhantomJS 已经停止支持 Python:phantomjs.org/release-1.5.html
  • @HamzaTahir,phantomjs 本身已经停止了 Python 绑定,但是存在一个名为 Ghostdriver github.com/detro/ghostdriver 的项目,它为 Selenium 提供了一个 Web 驱动程序,以使用 PhantomJS 作为浏览器。然后,您可以使用 Python 绑定来控制 Selenium,后者控制控制 PhantomJS 的 webdriver。 Ghostdriver 已在上游合并到 Selenium。
  • @dilbert 所以我只需要使用easy_install或者pip来获取Selenium,下载PhantomJS浏览器,上面的代码就可以了?
  • @dilbert 我使用easy_install下载了Selenium,解压了phantomjs浏览器,运行了unutbu的代码,效果很好!惊人的。现在我只需要学习如何加载 JS 和所有
  • @HamzaTahir,在抓取动态内容时,您必须注意时间,即程序应该尝试处理 DOM 以提取信息的时间点。根据站点的结构,这可能会延迟一段时间(几秒钟),并且尝试在它们存在之前加载一些预期的元素(因为它们是动态创建的)将导致问题。看看 WebdriveWait (stackoverflow.com/questions/8917785/…) 和 expected_conditions。
猜你喜欢
  • 2013-09-03
  • 2011-09-28
  • 1970-01-01
  • 2010-10-23
  • 2012-04-27
  • 2023-04-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多