gpt4 book ai didi

javascript - 如何在 Python 中抓取包含动态内容(由 JavaScript 创建)的页面?

转载 作者:行者123 更新时间:2023-11-30 12:05:01 25 4
gpt4 key购买 nike

我正在尝试开发一个简单的网络抓取工具。我想提取没有 HTML 标记的纯文本。我的代码适用于纯(静态)HTML,但当内容由页面中嵌入的 JavaScript 生成时则无效。

特别是,当我使用 urllib2.urlopen(request) 读取页面内容时,它不会显示 JavaScript 代码添加的任何内容,因为该代码 '在任何地方执行。通常它会由网络浏览器运行,但这不是我程序的一部分。

如何从我的 Python 代码中访问此动态内容?


另见 Can scrapy be used to scrape dynamic content from websites that are using AJAX?获取特定于 Scrapy 的答案。

最佳答案

2021 年 9 月编辑:phantomjs 也不再维护

编辑 2017 年 12 月 30 日:这个答案出现在谷歌搜索的顶部结果中,所以我决定更新它。旧答案还在最后。

dryscape 不再维护,dryscape 开发人员推荐的库仅适用于 Python 2。我发现使用 Selenium 的 python 库和 Phantom JS 作为 Web 驱动程序足够快并且很容易完成工作。

一旦安装 Phantom JS ,确保 phantomjs 二进制文件在当前路径中可用:

phantomjs --version
# result:
2.1.1

#例子举个例子,我用下面的 HTML 代码创建了一个示例页面。 ( link ):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Javascript scraping test</title>
</head>
<body>
<p id='intro-text'>No javascript support</p>
<script>
document.getElementById('intro-text').innerHTML = 'Yay! Supports javascript';
</script>
</body>
</html>

没有 javascript,它说:No javascript support 有 javascript:Yay!支持javascript

#没有 JS 支持的抓取:

import requests
from bs4 import BeautifulSoup
response = requests.get(my_url)
soup = BeautifulSoup(response.text)
soup.find(id="intro-text")
# Result:
<p id="intro-text">No javascript support</p>

#支持 JS 的抓取:

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get(my_url)
p_element = driver.find_element_by_id(id_='intro-text')
print(p_element.text)
# result:
'Yay! Supports javascript'

您还可以使用 Python 库 dryscrape抓取 javascript 驱动的网站。

#支持 JS 的抓取:

import dryscrape
from bs4 import BeautifulSoup
session = dryscrape.Session()
session.visit(my_url)
response = session.body()
soup = BeautifulSoup(response)
soup.find(id="intro-text")
# Result:
<p id="intro-text">Yay! Supports javascript</p>

关于javascript - 如何在 Python 中抓取包含动态内容(由 JavaScript 创建)的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56685116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com