我试图刮掉纽约州directory of trial judges。该站点检查是否启用了javascript并在页面上显示有关需要python的简短警告。所以我一直在尝试Selenium。
但是,当我在ipython或python中逐行运行时,它可以正常访问页面。然后,如果我从命令行(python scraper.py
)运行此操作,该站点将使用javascript警告进行渲染 - 但仅在我第一次访问该站点时。发生这种情况:
我的代码:
import string
import csv
from selenium import webdriver
# Start the browser
browser = webdriver.Firefox()
browser.get(
"https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
print(browser.title)
# You can run the above 4 lines directly in ipython,
# but if running from the command line, the previous try will not work
browser.get(
"https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
print(browser.title)
如果是导入的话:我在Windows 10上运行它。
有没有人对如何调试这个有什么建议?
答案 0 :(得分:2)
这里的区别在于,当作为脚本运行时,在JS实际有机会执行之前,正在访问browser.title
。您可以通过在获取页面后等待来避免这种情况。使用time.sleep
很简单
browser.get(...)
time.sleep(1.5)
但是,这可能会导致您等待的时间超过需要的时间。所以最好使用selenium的expected condition support。这样你就可以只在需要的时候等待。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
condition = EC.presence_of_element_located((By.ID, "some_element_id_present_after_JS_load"))
driver.get(url)
WebDriverWait(driver, 10).until(condition)
print(driver.title)
# ...
答案 1 :(得分:0)
我使用了Selenium的WebDriverWait函数来解决这个问题。
browser.get(
"https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
element = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, "column1_A630"))) # a random element
print([i.text for i in element.find_elements_by_xpath("//a[contains(@href, 'JUDGE_ID')]")])
browser.quit()
答案 2 :(得分:0)
当你调用 url https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory
时, WebClient 即 FirefoxBrowser 达到 document.readyState
在某个阶段等于 complete
,但这并不意味着所有关联的 Javascript 和 Ajax Calls 已经完成。
现在,如果您查看包含页面标题的 HTML 中的<head>
标记,该标记会在某个 Javascript 之后呈现完成如下:
<script type="text/javascript" id="ucs-jd-internet-page-BioPage-0">
/*<![CDATA[*/
function clearDefaultandCSS(el) {
if (el.defaultValue == el.value)
el.value = "";
}
/*]]>*/
</script>
<title>Judicial Directory</title>
因此,直到相关的 Javascript 完成渲染,页面标题才会呈现。因此,您无法检索实际的页面标题。
在这些情况下,最好的方法是将WebDriverWait与expected_conditions子句同时设置为title_contains,如下所示:
browser.get("https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
element = WebDriverWait(browser, 10).until(EC.title_contains(("Judicial Directory")))
print(browser.title)
browser.quit()