javascript - 使用 Python 抓取网页的 JavaScript 页面

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

我正在尝试开发一个简单的网络爬虫。我想提取没有 HTML 代码的文本。它适用于纯 HTML,但不适用于 JavaScript 代码添加文本的某些页面。

例如,如果一些 JavaScript 代码添加了一些文本,我看不到它,因为当我调用时:

response = urllib2.urlopen(request)

我得到了没有添加的原始文本(因为 JavaScript 是在客户端执行的)。

所以,我正在寻找一些想法来解决这个问题。

最佳答案

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

编辑 2017 年 12 月 30 日:此答案出现在 Google 搜索的热门结果中,因此我决定对其进行更新。旧答案仍在最后。

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 它说:不支持 javascript 和 javascript:耶!支持javascript

#Scraping 不支持 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>

#Scraping 与 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 驱动的网站。

#Scraping 与 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/8049520/

相关文章:

javascript - 我的向下滚动效果有什么问题?

javascript - 行程优化

python - 为什么我的网络抓取工具只能工作一半的时间?

javascript - 创建 2 个图表,在一张图表中显示 2 个不同的数据 (asp.net MVC)

python - 如何在 django 2.0 的详细 View 中使用 <username>

python - 访问 pyModbus 事务中的原始字节

python - 通过 Python API 在 Blender 中选择一个面并挤出一个立方体

javascript - 使用 AJAX 请求抓取页面

python - Scrapy正在爬取,但没有输出

javascript - 从与脚本相同的文件夹中获取文件