如何使用 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 函数