【问题标题】:stop page loading with Selenium Webdriver使用 Selenium Webdriver 停止页面加载
【发布时间】:2021-02-04 11:45:59
【问题描述】:

此时,如果网页中存在大约 5 个不同类型的关键字,我的脚本将检查多个 url。根据找到或没有找到哪个关键字,它会输出“ok”或“no”。

我使用set_page_load_timeout(30) 来避免无限加载网址。

问题:某些网页在超时之前没有完全加载(即使它是“非常”长的超时)。但我可以在视觉上(没有无头)看到页面已加载。至少它可以检查网页中的关键字,但它不会,并且在超时后,它会显示“失败”,并且说“否”的抓取不会显示到最终输出。

所以我不想在 30 秒后添加例外,但我想在 30 秒后停止加载页面并获取可以获取的内容。

我的代码:

# coding=utf-8
import re

sites=[]

keywords_1=[]
keywords_2=[]
keywords_3=[]
keywords_4=[]
keywords_5=[]

import sys
from selenium import webdriver
import csv
import urllib.parse
from datetime import datetime
from datetime import date

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.chrome.options import Options


def reader3(filename):
    with open(filename, 'r') as csvfile:
        # creating a csv reader object
        csvreader = csv.reader(csvfile)
        # extracting field names through first row
        # extracting each data row one by one
        for row in csvreader:
            sites.append(str(row[0]).lower())
try:
    reader3("data/script/filter_domain_OUTPUT.csv")
except Exception as e:
    print(e)
    sys.exit()
exc=[]
def reader3(filename):
    with open(filename, 'r') as csvfile:
        # creating a csv reader object
        csvreader = csv.reader(csvfile)
        # extracting field names through first row
        # extracting each data row one by one
        for row in csvreader:
            exc.append(str(row[0]).lower())
try:
    reader3("data/script/checking_EXCLUDE.csv")
except Exception as e:
    print(e)
    sys.exit()
def reader2(filename):
    with open(filename, 'r') as csvfile:
        # creating a csv reader object
        csvreader = csv.reader(csvfile)
        # extracting field names through first row
        # extracting each data row one by one
        for row in csvreader:
            keywords_1.append(str(row[0]).lower())
            keywords_2.append(str(row[1]).lower())
            keywords_3.append(str(row[2]).lower())
            keywords_4.append(str(row[3]).lower())
            keywords_5.append(str(row[4]).lower())

try:
    reader2("data/script/checking_KEYWORD.csv")
except Exception as e:
    print(e)
    sys.exit()


chrome_options = Options()
chrome_options.page_load_strategy = 'none'
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--lang=en')
chrome_options.add_argument('--disable-notifications')
#chrome_options.headless = True

chrome_options.add_argument('start-maximized')
chrome_options.add_argument('enable-automation')
chrome_options.add_argument('--disable-infobars')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-browser-side-navigation')
chrome_options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options=chrome_options)
for site in sites:
    try:
        status_1 = "no"
        status_2 = "no"
        status_3 = "no"
        status_4 = "no"
        status_5 = "no"
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
        today = date.today()
        print("[" + current_time + "] " + str(site))
        if 'http' in site:
            driver.get(site)
        else:
            driver.get("http://" + site)
        r=str(driver.page_source).lower()
        driver.set_page_load_timeout(30)
        for keyword_1 in keywords_1:
            if keyword_1 in r:
                status_1="ok"
                print("home -> " +str(keyword_1))
                break

        for keyword_2 in keywords_2:
            if keyword_2 in r:
                status_2="ok"
                print("home -> " +str(keyword_2))
                break

        for keyword_3 in keywords_3:
            if keyword_3 in r:
                status_3="ok"
                print("home -> " +str(keyword_3))
                break

        for keyword_4 in keywords_4:
            if keyword_4 in r:
                status_4="ok"
                print("home -> " +str(keyword_4))
                break
        for keyword_5 in keywords_5:
            if keyword_5 in r:
                status_5="ok"
                print("Home ->" +str(keyword_5))
                break 
        with open('data/script/checking_OUTPUT.csv', mode='a') as employee_file:
            employee_writer = csv.writer(employee_file, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL,lineterminator='\n')
            write=[site,status_1,status_2,status_3,status_4,status_5]
            employee_writer.writerow(write)
            
        
    except Exception as e:
        #driver.delete_all_cookies()
        print("Fail")
driver.quit()

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    https://www.selenium.dev/documentation/en/webdriver/page_loading_strategy/#:~:text=Defines%20the%20current%20session's%20page,loading%20takes%20lot%20of%20time.

        chromeOptions.setPageLoadStrategy(PageLoadStrategy.EAGER);
        WebDriver driver = new ChromeDriver(chromeOptions);
    

    使用页面加载策略 Eager to wait only until initial html is loaded ,您也可以使用 none ,但如果出现时间问题,请确保您有显式/隐式等待元素

    在 python 中,它的工作很奇怪,只有杂乱无章的功能在工作

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities().CHROME
    # caps["pageLoadStrategy"] = "normal"  #  Waits for full page load
    caps["pageLoadStrategy"] = "none"
    
    options = Options()
    
    driver = webdriver.Chrome(desired_capabilities=caps, options=options)
    
    
    
    
    url = 'https://www.gm-trucks.com/'
    
    
    driver.get(url)
    print(driver.title)
    print("hi")
    input()
    

    或者:

    options = Options()
    
    options.set_capability("pageLoadStrategy", "none")
    driver = webdriver.Chrome(options=options)
    

    更新

    文档按照 selenium 4.0.0-alpha-7 进行更新

    所以使用上述解决方案或更新到 selenium v​​4 以供将来保护

      pip install selenium==4.0.0.a7
    

    错误

    https://github.com/SeleniumHQ/seleniumhq.github.io/issues/627

    【讨论】:

    • 我已经在使用 chrome_options.page_load_strategy = 'none' 但是没有效果
    • @Mathieu 你面临的代码没有超出 driver.get 的问题是什么?
    • 如果没有找到这个词,它会输出“no”。但是在 url 没有完全加载的情况下,它会失败。这就是问题所在。因为大多数时候它应该能够搜索到一个单词,即使没有加载完整的页面
    • 示例:gm-trucks.com => 花费的时间超过了超时时间,因此即使页面加载了 99%(视觉上),它也会失败
    • @Mathieu 将其更改为 Options ,我只是复制粘贴了具有 chromeoptions 选项的代码
    【解决方案2】:

    首先,理想情况下,set_page_load_timeout()page_load_strategy = 'none' 不应混为一谈。

    set_page_load_timeout()

    set_page_load_timeout() 设置在引发错误之前等待页面加载完成的时间。

    您可以在How to set the timeout of 'driver.get' for python selenium 3.8.0?找到详细讨论


    page_load_strategy

    ​​>

    page_load_strategy = 'none' 导致Selenium 在完全接收到初始页面内容(已下载 html 内容)后立即返回。

    您可以在How to set the timeout of 'driver.get' for python selenium 3.8.0?找到详细讨论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多