一尘不染

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

python

我正在尝试开发一个简单的网页抓取工具。我想提取没有HTML代码的文本。我实现了这个目标,但是我发现在某些加载了JavaScript的页面中,我没有获得良好的结果。

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

response = urllib2.urlopen(request)

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

因此,我正在寻找一些解决此问题的想法。


阅读 1057

收藏
2020-02-06

共1个答案

一尘不染

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

phantomjs --version
# result:
2.1.1

举个例子,我用以下HTML代码创建了一个示例页面。

<!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 supportjavascript:Yay! Supports 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>
2020-02-06