我使用python库请求下载一些网页并在此之后进行一些解析,例如,获取页面的标题。但是,当某些网页上出现<noscript>
标记时,请求似乎无法正确下载来源。
例如,在尝试获取https://www.coursera.org/course/startup的来源时,我从请求获得的来源与使用Chrome访问该网页的来源不同。源请求获取与Chrome中的视图源选项相同。
有没有办法去傻瓜&#34; {@ 1}}标签在某种程度上?或者我需要使用其他东西而不是请求?
答案 0 :(得分:2)
“源请求获取与Chrome中的视图源选项相同”...查看源为您提供了URL的真实html源,与请求获得的相同。所以你所看到的就是你期望看到的东西。
您的问题与noscript
标记无关,而是在加载后通过javascript更改页面内容。
正如@alecxe指出的那样,您需要深入了解coursera网站的构建方式,例如在Chrome开发者工具的“网络”标签中观察XHR请求,以查看您要查找的实际内容的网址从...加载然后您可以直接使用请求加载这些网址。
另外,这里有一个教程,介绍如何解决使用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
答案 1 :(得分:1)
此特定页面通过一组对Coursera API的异步XHR调用呈现。然后,API响应用于构造页面。这一切都是由浏览器完成的。
requests
只需下载初始HTML页面,在这种情况下,它基本上是许多其他内容的容器。 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'