【问题标题】:html get around the noscript taghtml 绕过 noscript 标签
【发布时间】:2015-01-13 15:49:33
【问题描述】:

我正在使用 python 库请求下载一些网页并在此之后进行一些解析,例如,获取页面的标题。但是,当某些网页上有<noscript> 标签时,请求似乎无法正确下载源代码。

例如,当我尝试获取https://www.coursera.org/course/startup 的来源时,我从请求中获得的来源与使用 Chrome 访问页面不同。获取的源请求与 Chrome 中的查看源选项相同。

那么有没有办法以某种方式“欺骗”<noscript> 标签?或者我需要使用其他东西而不是请求?

【问题讨论】:

  • 也许可以尝试将 user agent 标头伪装成 Chrome 发送的内容?但是您可能会收到 Javascript,而 Chrome 知道如何运行它(例如,构建带有 Ajax 请求的页面&c)Python 不能,因此您可能需要为此目的“机械化”浏览器。
  • @AlexMartelli 我试图伪造用户代理,但没有成功

标签: python html noscript


【解决方案1】:

“源请求获取与 Chrome 中的查看源选项相同” ...查看源为您提供 url 的真实 html 源,与请求获取相同。所以你看到的就是你应该看到的。

您的问题与noscript标签无关,是页面内容加载后通过javascript更改。

正如@alecxe 指出的那样,您需要更深入地了解 coursera 网站的构建方式,例如在 Chrome 开发人员工具的“网络”选项卡中观察 XHR 请求,以查看您正在寻找的实际内容所在的网址是从...加载的,那么您可以直接使用 Requests 加载这些 url。

或者,这里有一个关于如何解决使用 python 中的 javascript 呈现网页的问题的教程:
https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/

他们提供的示例代码如下所示:

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

【讨论】:

    【解决方案2】:

    这个特定页面是通过对 Coursera API 的一组异步 XHR 调用呈现的。然后,API 响应用于构建页面。这一切都是由浏览器完成的。

    requests 只是下载初始 HTML 页面,在这种情况下,它基本上是许多其他内容的容器。 requests 没有内置 javascript 引擎,它不是浏览器。

    根据您接下来要做什么,您可以在例如selenium 的帮助下自动化一个真正的浏览器(无头或无头),或者模仿浏览器生成的API requests -后一种方法将涉及探索 Coursera API,使用浏览器开发人员工具查看哪些 API 端点用于用数据填充页面。

    示例(使用seleniumChrome 浏览器):

    >>> 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'
    

    【讨论】:

    • 谢谢,我去看看 selenium!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多