我正在使用python库请求下载一些网页,然后进行一些解析,例如,获取页面的标题。然而,当一些网页上有<noscript>标签时,请求似乎不能正确下载源代码。
例如,当我试图获取https://www.coursera.org/course/startup的源代码时,我从请求中获取的源代码与使用Chrome访问页面的源代码不同。source request get与Chrome中的view source选项相同。
那么有没有办法以某种方式“愚弄”<noscript>标记呢?或者我需要使用其他东西而不是请求?
发布于 2015-01-13 23:55:51
所以你所看到的就是你应该看到的。
您的问题与noscript标记无关,而是页面内容在加载后通过javascript更改。
正如@alecxe指出的那样,你需要更深入地研究coursera网站是如何构建的,比如观察Chrome开发者工具的'Network‘标签中的XHR请求,看看你正在寻找的实际内容是从哪里加载的urls……然后,您可以直接使用请求加载这些urls。
或者,这里有一个教程可以帮助你解决在python中使用javascript渲染网页的问题:
它们提供了示例代码,如下所示:
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
archive_links = html.fromstring(str(result.toAscii()))
print archive_links发布于 2015-01-13 23:59:07
这个特定的页面是通过对Coursera API的一组异步XHR调用呈现的。然后,使用API响应来构造页面。这一切都是由浏览器完成的。
requests只是下载初始的超文本标记语言页面,在本例中,该页面基本上是许多其他内容的容器。requests没有内置的javascript引擎,它不是一个浏览器。
根据您下一步要做什么,您可以在例如selenium的帮助下自动化真正的浏览器(无头或无头),或者模拟浏览器生成的API requests -后一种方法将涉及探索Coursera API,使用浏览器开发人员工具来查看使用哪些API端点来填充页面数据。
示例(使用selenium和Chrome浏览器):
>>> from selenium import webdriver
>>> from selenium.webdriver.common.by import By
>>> from selenium.webdriver.support.ui import WebDriverWait
>>> from selenium.webdriver.support import expected_conditions as EC
>>>
>>> driver = webdriver.Chrome()
>>> driver.get('https://www.coursera.org/course/startup')
>>> element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.c-coursePage-header h1")))
>>> element.text
u'Startup Engineering'https://stackoverflow.com/questions/27926033
复制相似问题