如何使用 selenium 获取带有 javascript 呈现的源代码的 html

Posted

技术标签:

【中文标题】如何使用 selenium 获取带有 javascript 呈现的源代码的 html【英文标题】:How to get html with javascript rendered sourcecode by using selenium 【发布时间】:2014-05-09 11:45:29 【问题描述】:

我在一个网页中运行查询,然后得到结果 url。如果我右键查看 html 源代码,我可以看到 JS 生成的 html 代码。如果我只是使用 urllib,python 无法获取 JS 代码。所以我看到了一些使用硒的解决方案。这是我的代码:

from selenium import webdriver
url = 'http://www.archives.com/member/Default.aspx?_act=VitalSearchResult&lastName=Smith&state=UT&country=US&deathYear=2004&deathYearSpan=10&location=UT&activityID=9b79d578-b2a7-4665-9021-b104999cf031&RecordType=2'
driver = webdriver.PhantomJS(executable_path='C:\python27\scripts\phantomjs.exe')
driver.get(url)
print driver.page_source

>>> <html><head></head><body></body></html>         Obviously It's not right!!

这是我在右键窗口中需要的源代码,(我想要 INFORMATION 部分)

</script></div><div class="searchColRight"><div id="topActions" class="clearfix 
noPrint"><div id="breadcrumbs" class="left"><a title="Results Summary"
href="Default.aspx?    _act=VitalSearchR ...... <<INFORMATION I NEED>> ... 
to view the entire record.</p></div><script xmlns:msxsl="urn:schemas-microsoft-com:xslt">

        jQuery(document).ready(function() 
            jQuery(".ancestry-information-tooltip").actooltip(
href: "#AncestryInformationTooltip", orientation: "bottomleft");
        );

所以我的问题是:如何获取JS生成的信息?

【问题讨论】:

你想要的html代码在页面上是什么样子的?您将希望使用 selenium 的 get_element_by_* 函数之一,但具体如何取决于 html 本身。 我的意思是一切。例如,您在 google 中输入一些内容。在结果网页中,右键单击,查看源代码。这就是我想要的“一切”。 【参考方案1】:

你需要通过javascript获取文档,你可以使用seleniums execute_script函数

from time import sleep # this should go at the top of the file

sleep(5)
html = driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")
print html

这将得到&lt;html&gt;标签内的所有内容

【讨论】:

看起来不错,但只给了我,我在那里重新定义了我的问题,你能看看请再问一遍?非常感谢 @MacSanhe 查看我的编辑,如果页面未完全加载,您将无法获得所有正文内容。还可以尝试转到该页面并在您的调试器控制台中运行 document.getElementsByTagName('html')[0].innerHTML 以查看有多少 DOM 通过。 有谁知道是否有一种方法可以在不使用 Selenium 之类的浏览器的情况下获取页面的 javascript? @Wilson - 你应该创建一个***问题。在 cmets 中很难澄清和回答您的问题。 尝试使用此参数加载 PhantomJS。 browser = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true']) 它对我有用【参考方案2】:

我认为您是在 JavaScript 呈现动态 HTML 之前获取源代码。

最初尝试在导航和获取页面源之间放置几秒钟的睡眠时间。

如果可行,那么您可以更改为不同的等待策略。

【讨论】:

@AntoninGAVREL 如果睡眠对你有用,你现在不妨实施更稳定的等待策略;例如等到显示特定元素使用“睡眠”本质上是不稳定的 谢谢你,Robbi,这确实是我所做的:myclass = 'question'wait.until(EC.visibility_of_element_located((By.CLASS_NAME, myclass)))【参考方案3】:

没有必要使用该解决方法,您可以使用:

driver = webdriver.PhantomJS()
driver.get('http://www.google.com/')
html = driver.find_element_by_tag_name('html').get_attribute('innerHTML')

【讨论】:

【参考方案4】:

我遇到了同样的问题,最后被desired_capabilities解决了。

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType

proxy = Proxy(
     
          'proxyType': ProxyType.MANUAL,
          'httpProxy': 'ip_or_host:port'
     
)
desired_capabilities = webdriver.DesiredCapabilities.PHANTOMJS.copy()
proxy.add_to_capabilities(desired_capabilities)
driver = webdriver.PhantomJS(desired_capabilities=desired_capabilities)
driver.get('test_url')
print driver.page_source

【讨论】:

这是一个古老且略微过时的答案,但它给了我一个使用 mitmproxy 捕获 javascript 的想法,所以 +1 但是如果你需要点击一个元素或者输入文本呢?【参考方案5】:

你试试Dryscrape这个浏览器完全支持繁重的js代码试试我希望它对你有用

【讨论】:

这是评论,不是答案【参考方案6】:

我在从 Internet 获取 Javascript 源代码时遇到了同样的问题,我使用上面 Victory 的建议解决了它。

*第一execute_script

driver=webdriver.Chrome()
driver.get(urls)
innerHTML = driver.execute_script("return document.body.innerHTML")
#print(driver.page_source)

*第二:使用beautifulsoup解析html(可以通过pip命令下载beautifulsoup

 import bs4    #import beautifulsoup
 import re
 from time import sleep

 sleep(1)      #wait one second 
 root=bs4.BeautifulSoup(innerHTML,"lxml") #parse HTML using beautifulsoup
 viewcount=root.find_all("span",attrs='class':'short-view-count style-scope yt-view-count-renderer')   #find the value which you need.

*第三:打印出你需要的值

 for span in viewcount:
    print(span.string) 

*完整代码

from selenium import webdriver
import lxml

urls="http://www.archives.com/member/Default.aspx?_act=VitalSearchResult&lastName=Smith&state=UT&country=US&deathYear=2004&deathYearSpan=10&location=UT&activityID=9b79d578-b2a7-4665-9021-b104999cf031&RecordType=2"

driver = webdriver.PhantomJS()


##driver=webdriver.Chrome()
driver.get(urls)
innerHTML = driver.execute_script("return document.body.innerHTML")
##print(driver.page_source)

import bs4
import re
from time import sleep

sleep(1)
root=bs4.BeautifulSoup(innerHTML,"lxml")
viewcount=root.find_all("span",attrs='class':'short-view-count style-scope yt-view-count-renderer')


for span in viewcount:
print(span.string)

driver.quit()

【讨论】:

以上是关于如何使用 selenium 获取带有 javascript 呈现的源代码的 html的主要内容,如果未能解决你的问题,请参考以下文章

切换选项卡时,带有无头 chrome 的 Selenium 无法获取 url

javascript Selenium Web Driver 中 jQuery.active 的等价物

如何使用 Selenium 打开带有哈希的 URL?

如何使用 Selenium 和 Python 绕过带有 buster 扩展的 ReCaptcha

使用 Selenium 捕获网络 XHR 日志(带有参数的请求/响应)

如何使用 jQuery 在 Selenium WebDriver 中单击带有 Java 的按钮