Python selenium chrome 使用代理做爬虫时,如何判断获取的页面是否正常
RT,IP 代理不是 100%靠谱。经常会出现未连接到网络等错误。
同一类型的网页可以通过判断某个元素是否加载完成判断。
那么不同类型的网页如何判断呢?
谢谢
Python selenium chrome 使用代理做爬虫时,如何判断获取的页面是否正常
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 登登天猫国际感受下恶意吧哈哈,

