Как получить html с обработанным javascript исходным кодом с помощью селена
Я запускаю запрос на одной веб-странице, затем получаю URL-адрес результата. Если я щелкнул правой кнопкой мыши на html-источнике, я могу увидеть код html, созданный JS. Если я просто использую 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 not right!!
Вот исходный код, который мне нужен в правом щелчках, (я хочу часть ИНФОРМАЦИЯ)
</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?
Ответы
Ответ 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>
Ответ 2
Нет необходимости использовать это обходное решение, вы можете использовать вместо этого:
driver = webdriver.PhantomJS()
driver.get('http://www.google.com/')
html = driver.find_element_by_tag_name('html').get_attribute('innerHTML')
Ответ 3
Я думаю, что вы получаете исходный код до того, как JavaScript предоставил динамический HTML.
Сначала попробуйте поставить несколько секунд сна между навигацией и получить источник страницы.
Если это сработает, вы можете перейти на другую стратегию ожидания.
Ответ 4
Вы пытаетесь использовать Dryscrape
этот браузер полностью поддерживается тяжелыми js-кодами, попробуйте, я надеюсь, что он сработает для вас
Ответ 5
У меня та же проблема с получением исходного кода Javascript из Интернета, и я решил ее, используя приведенное выше предложение Победы.
* Сначала: execute_script
driver=webdriver.Chrome()
driver.get(urls)
innerHTML = driver.execute_script("return document.body.innerHTML")
#print(driver.page_source)
* Второй: анализ html с помощью beautifulsoup
(Вы можете скачать beautifulsoup
с помощью команды pip)
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()
Ответ 6
Я встретил ту же проблему и окончательно решил желаемые возможности.
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