如何获取网页的真实源代码?

1 投票
2 回答
5317 浏览
提问于 2025-04-18 06:33

每次我使用像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>

2 个回答

2

因为在生成网页的时候可能会涉及到javascript和AJAX调用,所以为了确保你获取到的源代码和浏览器中看到的一样,你需要使用一些真正的浏览器工具,比如selenium

from selenium import webdriver

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

print browser.page_source
0

最好的解决方案是:

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()

撰写回答