如何使用 BeautifulSoup 和 Python 调用 JavaScript 函数

Posted

技术标签:

【中文标题】如何使用 BeautifulSoup 和 Python 调用 JavaScript 函数【英文标题】:How to call JavaScript function using BeautifulSoup and Python 【发布时间】:2018-07-14 04:10:37 【问题描述】:

作为我项目的一部分,我正在执行网络抓取以从网站获取数据。我可以提出请求并获取 dom 中存在的数据。但是,一些数据会在 javascript onClick 函数上呈现。

一种方法是,使用 selenium 点击链接(调用 javascript 函数)并抓取渲染数据,但这个过程很耗时,我不想打开浏览器。

除了 selenium 之外还有其他方法可以实现吗?

网址:http://catalog.fullerton.edu/preview_entity.php?catoid=16&ent_oid=1849

在此网页的课程部分,所有课程都是超链接,一旦有人点击课程,就会调用一个javascript方法。我需要在 javascript 函数调用之后呈现的数据。

【问题讨论】:

【参考方案1】:

你不能。如果要运行 JavaScript,则需要使用无头浏览器。否则,您将不得不反汇编 JavaScript 并查看它的作用。

当您的浏览器的开发者工具在“网络”选项卡中打开时单击该元素:

您现在可以看到 JavaScript 从该 URL 下载新的 html。您可以使用 urllib 轻松发送相同的请求。

【讨论】:

【参考方案2】:

你可以使用https://pypi.org/project/requests-html/这个库来渲染JavaScript内容,然后用beautiful soup来解析它。

例子:

from requests_html import HTMLSession  
  
def render_JS(URL):
    session = HTMLSession()
    r = session.get(URL)
    r.html.render()
    return r.html.text

【讨论】:

【参考方案3】:

你不能单独使用 BeautifulSoup 来做到这一点。创建这个模块是为了抓取 HTML(超文本标记语言)而不是 JavaScript、CSS 或任何其他网络语言。

它可以在<script></script> 标签之间提取(这将非常有用),但除此之外,BeautifulSoup 就不是你需要的了。

要调用 JavaScript 函数,您需要 headless browser,例如 PhantomJS 或 Selenium。也有人尝试解析 JavaScript 以及使用 regex(这不是一个好主意)和使用其他方法(推荐)this question 中描述了一些方法并且可能有用。

【讨论】:

以上是关于如何使用 BeautifulSoup 和 Python 调用 JavaScript 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 3.5 和 BeautifulSoup 抓取 href [重复]

如何使用 beautifulSoup 从网站中提取和下载所有图像?

如何使用python和beautifulsoup获取title属性?

如何使用 BeautifulSoup 和 Python 调用 JavaScript 函数

如何让 beautifulsoup 对脚本标签的内容进行编码和解码

如何仅使用BeautifulSoup和Python删除包含空格的HTML标记