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