Python selenium chrome 使用代理做爬虫时,如何判断获取的页面是否正常

RT,IP 代理不是 100%靠谱。经常会出现未连接到网络等错误。
同一类型的网页可以通过判断某个元素是否加载完成判断。
那么不同类型的网页如何判断呢?
谢谢
Python selenium chrome 使用代理做爬虫时,如何判断获取的页面是否正常

15 回复

selenium 有个 EC,BY,用这两个关键词搜,有例子


在Selenium Chrome中使用代理爬虫时,判断页面是否正常可以通过以下代码实现:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, WebDriverException
import time

def check_page_status_with_proxy(proxy_url, target_url, timeout=30):
    """
    使用代理检查页面状态
    
    Args:
        proxy_url: 代理地址,格式如 'http://username:password@host:port'
        target_url: 目标网址
        timeout: 超时时间(秒)
    """
    options = webdriver.ChromeOptions()
    
    # 添加代理
    options.add_argument(f'--proxy-server={proxy_url}')
    
    # 其他常用选项
    options.add_argument('--headless')  # 无头模式
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    
    driver = None
    try:
        # 初始化驱动
        driver = webdriver.Chrome(options=options)
        driver.set_page_load_timeout(timeout)
        
        # 访问页面
        start_time = time.time()
        driver.get(target_url)
        load_time = time.time() - start_time
        
        # 检查1: 页面标题
        page_title = driver.title
        title_valid = bool(page_title and page_title.strip())
        
        # 检查2: 页面源码长度
        page_source = driver.page_source
        source_length = len(page_source)
        source_valid = source_length > 100  # 假设正常页面源码至少100字符
        
        # 检查3: 状态码(通过JavaScript获取)
        status_code = driver.execute_script("""
            return window.performance.getEntriesByType('navigation')[0].responseStatus || 200;
        """)
        
        # 检查4: 关键元素是否存在
        body_exists = driver.execute_script("return document.body !== null")
        
        # 检查5: 控制台错误(如果有)
        logs = driver.get_log('browser')
        js_errors = [log for log in logs if log['level'] == 'SEVERE']
        
        # 综合判断
        is_normal = all([
            title_valid,
            source_valid,
            status_code == 200,
            body_exists,
            load_time < timeout
        ])
        
        return {
            'status': 'normal' if is_normal else 'abnormal',
            'title': page_title,
            'source_length': source_length,
            'load_time': f"{load_time:.2f}s",
            'status_code': status_code,
            'has_body': body_exists,
            'js_errors': len(js_errors),
            'proxy_used': proxy_url
        }
        
    except TimeoutException:
        return {'status': 'timeout', 'error': f'页面加载超过{timeout}秒'}
    except WebDriverException as e:
        return {'status': 'driver_error', 'error': str(e)}
    except Exception as e:
        return {'status': 'unknown_error', 'error': str(e)}
    finally:
        if driver:
            driver.quit()

# 使用示例
if __name__ == "__main__":
    proxy = "http://user:pass@proxy.example.com:8080"
    url = "https://example.com"
    
    result = check_page_status_with_proxy(proxy, url)
    print(f"页面状态: {result}")
    
    # 简单判断
    if result['status'] == 'normal':
        print("✅ 页面正常加载")
    else:
        print(f"❌ 页面异常: {result.get('error', '未知错误')}")

这段代码通过五个维度判断页面是否正常:1)页面标题有效性;2)源码长度检查;3)HTTP状态码;4)body元素存在性;5)加载时间。同时捕获超时和驱动异常,确保代理失效时能正确识别。

总结:多维度检查比单一判断更可靠。

selenium 应该是没有办法返回类似 requests 的 status_code 的,所以需要自己来判断一下返回页面中是否包含正常的元素,elem = driver.find_element_by_id(“XXX”)。需要试出一些验证码,429,404 等页面的状态,加入状态判断。

这应该是显性等待某个元素出现,我希望抓不同来源的页面不一定有同样的元素。难道把 chrome 报错页面的元素全部枚举,判断下有没有出现,主要困惑是不知道报错页面总共有多少种类型。

你说的报错页面难道不是返回的 http 状态码吗?我也在练习 selenium 相关的东西,希望能从你这贴了解一些问题,说错的地方多包涵

刚想起来还有验证页面这样的,要是这种情况判断状态码也不行

:类似于这样:
无法访问此网站
www.google.com 的响应时间过长。
请试试以下办法:

检查网络连接
检查代理服务器和防火墙
运行 Windows 网络诊断
ERR_CONNECTION_TIMED_OUT

谢谢。

你不同页面的元素获取在一个函数内?每个页面分别用一个函数或方法才是合理的结构吧,然后每个函数分别判断某个元素是否加载。

用等待啊 超过时长响应就跳出去 至于后续怎么操作可以自己定义

<br> browser = webdriver.Firefox(firefox_options=generate_option())<br> browser.get(self.baseurl)<br> locator = (By.CLASS_NAME, 'kr_article_list')<br> try:<br> WebDriverWait(browser, 15, 1).until(EC.presence_of_element_located(locator))<br> except:<br> <a target="_blank" href="http://logging.info" rel="nofollow noopener">logging.info</a>('error:element of news list do not presence.')<br> exit(1)<br>

给你个我自己的例子,我是只获取一个页面,所以判断一个元素是否出现就可以了,你可以建一个字典,key 是网址前缀,value 是元素名,然后用正则表达式匹配就可以实现多匹配了么

我是把解析页面做了单独的线程,这里有单独函数判断页面元素是否存在。selenium 只负责打开页面,然后把页面源码保存到队列中。但是 IP 代理失效时,chrome 报错页面也是网页,这时候就把报错页面的源码保存下来了。我需要做的是检测 IP 代理失效的情况,这时候就更换代理。

谢谢,字典是很好的思路。

我的方法是
用 selenium 的 chrome 获取 cookies,然后 requests 用这个 cookies 来爬取页面.
一个 cookies 可以用多次, 如果 ip 超时或者获取不到 html,
就换一个 ip, 重新获取 cookies.

主要是有些页面元素动态加载的。才用 selenium 方便一点。

哎,用 SELENIUM 登登天猫国际感受下恶意吧哈哈,

回到顶部