Python-使用Python网页抓取JavaScript页面
我正在尝试开发一个简单的网页抓取工具。我想提取没有HTML
代码的文本。我实现了这个目标,但是我发现在某些加载了JavaScript
的页面中,我没有获得良好的结果。
例如,如果一些JavaScript
代码添加了一些文本,则看不到它,因为当我调用
response = urllib2.urlopen(request)
我得到的原始文本没有添加文本(因为在客户端执行了JavaScript
)。
因此,我正在寻找一些解决此问题的想法。
-
一旦安装了
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 support
和javascript: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>