如何解决由于页面无限加载,无法在 python 中通过 selenium 进行抓取
我正在尝试提取一些新闻文章的内容。一些网址需要登录才能访问完整内容。我决定使用 selenium 自动登录。但是,我无法提取内容,因为第一个 url 需要永远加载并且永远不会到达完成实际文本提取的点。它最终抛出超时异常。
这是我的代码
for url in url_list:
chrome_options = Options()
ua = UserAgent()
userAgent = ua.random
options.add_argument(f'user-agent={userAgent}')
driver = webdriver.Chrome(ChromeDriverManager().install(),options = chrome_options)
driver.get(url)
time.sleep(5)
frame = driver.find_elements_by_xpath('//iframe[@id="wallIframe"]')
#Some articles require going through a paywall and some don't
if len(frame)==0:
text_element = driver.find_elements_by_xpath('//section[@id="main-content"]//article//p')
text = " ".join(x.text for x in element)
else:
text = log_in(frame)
driver.quit()
def log_in(frame):
driver.switch_to.frame(frame[0])
driver.find_element_by_id("PAYWALL_V2_SIGN_IN").click()
time.sleep(2)
driver.find_elements_by_id("username")[0].send_keys(username)
time.sleep(2)
driver.find_elements_by_xpath('//button[text()="Continue"]')[0].click()
time.sleep(1)
driver.find_elements_by_id("password")[0].send_keys(password)
time.sleep(1)
element = driver.find_elements_by_xpath('//button[@type="submit"]')[0].click()
time.sleep(1)
text = parse_text(element)
我该如何解决这个问题?
解决方法
您应该使用 time.sleep
和 WebDriverWait
,而不是使用 expected_conditions
手动设置超时;这样,只有在满足特定条件(例如,元素可见或元素可点击)时,才会对元素执行的操作。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
try:
frame = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,'//iframe[@id="wallIframe"]')))
except TimeoutException:
print "Element not found."
,
将此添加到您的 chrome 选项:
options.page_load_strategy = 'eager'
“Eager”页面加载策略将等待 HTML 加载完毕,但不会等待加载 CSS、图像等。
还有更多关于 here 的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。