用Python来抓取JavaScript页面

我正在尝试开发一个简单的网页刮板。 我想提取没有HTML代码的文本。 实际上,我实现了这个目标,但是我已经看到,在一些加载JavaScript的页面中,我没有获得好的结果。

例如,如果某些JavaScript代码添加了一些文本,我看不到它,因为当我打电话时

response = urllib2.urlopen(request) 

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

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

您也可以使用Python库dryscrape来抓取JavaScript驱动的网站。

举个例子,我用下面的HTML代码创build了一个示例页面。 ( 链接 ):

 <!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 Yay! Supports javascript

刮没有JS支持:

 >>> import requests >>> from bs4 import BeautifulSoup >>> response = requests.get(my_url) >>> soup = BeautifulSoup(response.text) >>> soup.find(id="intro-text") <p id="intro-text">No javascript support</p> 

用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") <p id="intro-text">Yay! Supports javascript</p> 

也许selenium可以做到这一点。

 from selenium import webdriver import time driver = webdriver.Firefox() driver.get(url) time.sleep(5) htmlSource = driver.page_source 

这似乎也是一个很好的解决scheme,从一个伟大的博客文章

 import sys from PyQt4.QtGui import * from PyQt4.QtCore import * from PyQt4.QtWebKit import * from lxml import html #Take this class for granted.Just use result of rendering. class Render(QWebPage): def __init__(self, url): self.app = QApplication(sys.argv) QWebPage.__init__(self) self.loadFinished.connect(self._loadFinished) self.mainFrame().load(QUrl(url)) self.app.exec_() def _loadFinished(self, result): self.frame = self.mainFrame() self.app.quit() url = 'http://pycoders.com/archive/' r = Render(url) result = r.frame.toHtml() # This step is important.Converting QString to Ascii for lxml to process # The following returns an lxml element tree archive_links = html.fromstring(str(result.toAscii())) print archive_links # The following returns an array containing the URLs raw_links = archive_links.xpath('//div[@class="campaign"]/a/@href') print raw_links 

这听起来像你真正要查找的数据可以通过主页面上的一些JavaScript调用的辅助URL访问。

虽然您可以尝试在服务器上运行JavaScript来处理这个问题,但更简单的方法可能是使用Firefox加载页面,并使用Charles或Firebug之类的工具来精确标识该辅助URL是什么。 那么你可以直接查询你的URL感兴趣的数据。

您将要在脚本中使用urllib,请求,beautifulSoup和selenium web驱动程序来为页面的不同部分(仅举几个例子)。
有时你只需要其中一个模块即可获得所需的内容。
有时你需要两个,三个或所有这些模块。
有时你需要closures浏览器上的js。
有时候你需要在脚本中使用标题信息。
没有网站可以以同样的方式被刮,没有网站可以永远以同样的方式被刮,而不必修改您的爬虫,通常在几个月后。 但他们都可以被刮掉! 有意愿的地方有一定的方法。
如果你需要不断刮取数据,只需将所需的所有内容都存储在.dat文件中。
只需继续search如何尝试使用这些模块,然后将错误复制并粘贴到Google中即可。

您也可以使用webdriver执行JavaScript。

 from selenium import webdriver driver = webdriver.Firefox() driver.get(url) driver.execute_script('document.title') 

或将该值存储在一个variables中

 result = driver.execute_script('var text = document.title ; return var')