【问题标题】:Scraping HTML and JavaScript抓取 HTML 和 JavaScript
【发布时间】:2014-05-10 22:54:10
【问题描述】:

我正在开展一个项目,我需要在其中抓取多个网站并从中收集不同类型的信息。文本、链接、图像等信息。

我为此使用 Python。为此,我在 HTML 页面上尝试了 BeautifulSoup,它可以工作,但是在解析包含大量 JavaScript 的网站时我被卡住了,因为这些文件的大部分信息都存储在 <script> 标记中。

任何想法如何做到这一点?

【问题讨论】:

标签: javascript python parsing web-scraping web-crawler


【解决方案1】:

首先,从页面中抓取和解析 JS 并非易事。但是,如果您改用无头 Web 客户端,它可以大大简化,它会像普通浏览器一样为您解析所有内容。
唯一不同的是它的主界面不是GUI/HMI,而是API。

例如,您可以将PhantomJS 与都支持无头模式的 Chrome 或 Firefox 一起使用。

如需更完整的无头浏览器列表,请查看here

【讨论】:

  • 我能够进行幽灵工作并加载页面,但我应该怎么做才能让整个网页从中脱离出来。文档描述了一个函数 get_page 但即使在代码本身中也不存在。
【解决方案2】:

如果页面加载涉及大量 javascript 动态加载,事情就会变得更加复杂。

基本上,您有 3 种方式从网站抓取数据:

  • 使用浏览器开发工具查看AJAX 请求在页面加载时发生了什么。然后在您的爬虫中模拟这些请求。您可能需要 jsonrequests 模块的帮助。
  • 使用使用真实浏览器的工具,例如selenium。在这种情况下,您不需要关心页面是如何加载的——您会得到真实用户看到的内容。注意:您也可以使用headless 浏览器。
  • 查看网站是否提供API(例如walmart API

还可以看看Scrapy web-scraping framework - 它也不处理 AJAX 调用,但这确实是我使用过的 web-scraping 世界中最好的工具。

另请参阅这些资源:

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    让您开始使用 selenium 和 BeautifulSoup:

    使用 npm(节点包管理器)安装 phantomjs:

    apt-get install nodejs
    npm install phantomjs
    

    安装硒:

    pip install selenium
    

    得到这样的结果页面,像往常一样用beautifulSoup解析它:

    from BeautifulSoup4 import BeautifulSoup as bs
    from selenium import webdriver
    client = webdriver.PhantomJS()
    client.get("http://foo")
    soup = bs(client.page_source)
    

    【讨论】:

      【解决方案4】:

      一种非常快速的方法是遍历所有标签并获得textContent 这是 JS sn-p:

      page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; 
      

      或在 selenium/python 中:

      import selenium
      from selenium import webdriver
      driver = webdriver.Chrome()
      
      driver.get("http://ranprieur.com")
      pagetext = driver.execute_script('page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; return page;')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多