如何使用 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
这将得到<html>
标签内的所有内容
【讨论】:
看起来不错,但只给了我,我在那里重新定义了我的问题,你能看看请再问一遍?非常感谢 @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 和 Python 绕过带有 buster 扩展的 ReCaptcha