如何获取真正的html页面源代码? [复制]

Posted

技术标签:

【中文标题】如何获取真正的html页面源代码? [复制]【英文标题】:How to get real source code of html page? [duplicate] 【发布时间】:2014-07-02 16:43:58 【问题描述】:

每次我使用 urllib2、requests、pycurl 等标准库时,我都没有获得完整的源代码。如何获得完整的源代码,就像我从 chrome、firefox 等查看它一样。 我正在尝试这样做:

def go_to(link):
    headers = 'User-Agent': USER_AGENT,
               'Accept': ACCEPT,
               'Accept-Encoding': ACCEPT_ENCODING,
               'Accept-Language': ACCEPT_LANGUAGE,
               'Cache-Control': CACHE_CONTROL,
               'Connection': CONNECTION,
               'Host': HOST
    req = urllib2.Request(link, None, headers)
    response = urllib2.urlopen(req)
    return response.read()

谢谢!

对不起,我的英语不好。

统一更新: 这是来自浏览器的完整代码:

 <td colspan="1"><font class="spy1">1</font> <font class="spy14">192.3.10.113<script type="text/javascript">document.write("<font class=spy2>:<\/font>"+(TwoFiveFiveSix^OneOneSix)+(Zero0FourFour^ZeroSevenSeven)+(TwoFiveFiveSix^OneOneSix)+(TwoFiveFiveSix^OneOneSix))</script><font class="spy2">:</font>8088</font></td>

这不是我脚本中的完整代码:

<font class="spy14">192.3.10.113<script type="text/javascript">document.write("<font class=spy2>:<\/font>"+(Eight7FiveSix^Seven1One)+(FiveZeroTwoOne^Two3Zero)+(Eight7FiveSix^Seven1One)+(Eight7FiveSix^Seven1One))</script></font>

【问题讨论】:

你能解释一下你收到的是“不是完整的源代码”吗? (请注意,在浏览器中查看 html 会显示浏览器对其的解释 你得到了什么?它和你想要的有什么不同? 【参考方案1】:

最好的解决办法是:

import sys  
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *  

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://webscraping.com'  
r = Render(url)  
html = r.frame.toHtml() 

来源:http://webscraping.com/blog/Scraping-JavaScript-webpages-with-webkit/

统一更新: 输出类型是 QString。 如果要将其转换为字符串,请使用

html = r.frame.toHtml().toUtf8().data()

【讨论】:

如何将标头传递给这些? @venkatadileep 我想您应该创建 QNetworkRequest 对象,为其设置标头并将其作为参数传递给“加载”方法。根据官方文档。【参考方案2】:

由于可能有 javascript,AJAX 调用参与形成网页,为了确保您获得的源代码与您在浏览器中看到的相同,您需要使用实际使用真实浏览器的工具,例如 @ 987654322@:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get(link)

print browser.page_source

【讨论】:

谢谢,不过这个脚本一定很快,我打算修改成多线程模式。 @ValeriyG 那么您可以使用无头浏览器,例如realpython.com/blog/python/….

以上是关于如何获取真正的html页面源代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python下用selenium的webdriver包如何在执行完点击下一页后没有获得下一页新打开页面的html源代码

python下用selenium的webdriver包如何在执行完点击下一页后获得下一页新打开页面的html源代码呢?

Firestore - 如何在不真正获取所有文档的情况下找到可以使用查询获取的文档数量? [复制]

如何使用 javascript 将网页作为纯文本获取,而没有任何 html? [复制]

如何渲染整个页面?

我可以使用 Jquery 获取元素的 HTML 源代码吗? [复制]