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

标签 javascript python web-scraping python-2.x

我正在尝试开发一个简单的网络抓取工具。我想提取没有 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/

相关文章:

javascript - 使用正则表达式查找字符串,并在新的周围文本中重用该字符串

python - 启动 ipython-notebook 时出现 "ERROR:tornado.application:Uncaught exception GET"

python - 远程服务器上的 Node 错误 spawn/bin/sh ENOENT

python - 如何使用 Beautifulsoup-python 从 div 内特定标题中的段落元素中提取网页文本

python - 请求响应的 Xpath 返回空列表

javascript - 流量: refinement not work on custom type

javascript - 有没有办法在Vue中链接图像?

node.js - 使用node.io抓取时如何添加像Tor这样的代理?

javascript - 如何在 Angular Chosen 中设置默认选择值?

python - 生成具有多个(多组多组多组)X轴数据集的图