R024---UiPath之Execute Query的TimeOut属性设置引起的程序错误及解决

当Execute Query活动在RPA流程中运行超过默认30秒时,会导致程序错误。通过设置Timeout属性为500000毫秒,确保活动有足够时间执行,避免因超时引发的中断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​一、缘起

昨天遇到一个关于Execute Query的奇怪问题,今天解决了,做个记录,供参考。

二、问题

程序执行到Execute Query这一步时(其实这一步是循环中的一个步骤,已经跑了11次,跑第12次时报错),报错信息:字典引用的key不存在。

Execute Query的SQL语句的拼接中,确实用到字典变量。

于是,在这一步前增加Write Line,把Execute Query中拼接SQL语句的语句,通过Write Line输出,结果发现这个SQL语句拼接正常,没有因为用到字段变量而报错,那为什么执行到Execute Query就报上面的关于字典的错误?

三、解决

3.1 新建流程文件,将Execute Query这一步单独复制出来执行,报错:

实际上我并没有主动取消该流程。

3.2 在navicat中执行该SQL语句,结果正常,用时72秒。

      猜想:是不是因为运行时间太长超时导致。

      于是找到Execute Q

修改下面的程序,让程序下载搜索对应内容的图片,这个下载的图片不是对应内容的,程序为import os import time import requests import tkinter as tk from tkinter import simpledialog from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup SAVE_FOLDER = "D:/1_work/a" if not os.path.exists(SAVE_FOLDER): os.makedirs(SAVE_FOLDER) def get_search_query(): root = tk.Tk() root.withdraw() query = simpledialog.askstring("小红书爬虫", "请输入要搜索的内容:") return query def login_xiaohongshu(): options = webdriver.ChromeOptions() options.add_experimental_option("detach", True) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get("https://www.xiaohongshu.com") input("请扫码登录后按回车键继续...") return driver def search_and_get_images(driver, query): search_box = driver.find_element(By.TAG_NAME, "input") search_box.send_keys(query) search_box.send_keys(Keys.RETURN) time.sleep(5) page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") images = soup.find_all("img", src=True) return [img["src"] for img in images if img["src"].startswith("http")][:1000] def save_image(image_url): img_name = os.path.basename(image_url.split("?")[0]) img_path = os.path.join(SAVE_FOLDER, img_name) try: response = requests.get(image_url, timeout=10) response.raise_for_status() with open(img_path, "wb") as f: f.write(response.content) print(f"✅ 下载成功: {img_name}") except requests.RequestException as e: print(f"❌ 下载失败: {image_url}, 错误: {e}") def main(): query = get_search_query() if not query: print("❌ 未输入搜索内容,程序退出。") return driver = login_xiaohongshu() image_urls = search_and_get_images(driver, query) driver.
03-10
<think>好的,用户的问题是关于修改一个Python程序,使其能够正确下载与搜索内容对应的图片。当前程序的问题在于下载的图片不相关,用户希望调整代码以解决这个问题。我需要仔细分析现有代码,找出导致下载不相关图片的原因,并提出修改方案。 首先,用户提供的代码使用SeleniumBeautifulSoup来爬取小红书页面中的图片。主要步骤包括登录、搜索、获取图片链接并下载。问题可能出在如何定位到正确的图片元素,者页面结构导致获取了无关的图片链接。 接下来,我需要考虑以下几点: 1. **页面加载时间不足**:当前代码在搜索后等待5秒,可能页面还未完全加载,导致获取的图片链接不全不正确。需要增加更智能的等待机制,比如使用显式等待(WebDriverWait)等待特定元素加载完成,而不是固定的时间。 2. **元素定位不准确**:原代码通过查找所有`img`标签并筛选以`http`开头的`src`属性,可能获取了页面中的其他无关图片,如广告、头像等。需要更精确地定位到搜索结果中的图片元素,可能通过检查特定的类名父元素结构。 3. **动态加载内容**:小红书可能使用懒加载技术,图片的`src`属性可能在滚动到可见区域时才加载。需要检查实际获取的`src`是否是真实图片地址,者是否使用了`data-src`等属性。可能需要模拟滚动操作来加载更多内容。 4. **反爬机制**:小红书可能有反爬措施,检测到自动化工具时会返回不同的内容,导致无法获取正确的图片链接。需要调整Selenium的选项,如禁用自动化标志,者使用代理。 5. **图片链接处理**:下载的图片链接可能需要进一步处理,比如去除参数、检查文件类型等,确保下载的是有效的图片文件。 根据这些分析,我需要逐步调整代码: - **修改元素定位方式**:使用更精确的CSS选择器XPath来定位搜索结果中的图片元素。例如,检查图片所在的容器类名,特定的`img`标签属性- **优化等待机制**:将固定的`time.sleep(5)`替换为显式等待等待搜索结果区域加载完成后再获取页面源码。 - **处理动态加载**:添加滚动页面的代码,确保所有图片都被加载,再获取所有图片链接。 - **验证图片链接**:检查`src`是否为有效的图片URL,可能需要过滤掉base64编码的图片其他占位符。 此外,参考用户提供的引用内容,特别是引用[3]中提到的关于图片识别点击的问题,可能需要更精确地绑定内容与图片的关系,但当前问题更侧重于正确获取图片链接,而非识别文字后点击。因此,重点应放在正确解析页面结构上。 可能的代码修改步骤包括: 1. 在`search_and_get_images`函数中,使用显式等待等待搜索结果的加载。 2. 使用更具体的选择器,例如通过父元素的类名定位图片元素。 3. 检查图片的`src`属性是否为有效的图片地址,可能需要处理懒加载的情况,如替换`data-src`为`src`。 4. 添加页面滚动逻辑,加载更多图片。 5. 过滤非目标图片,如头像、图标等,通过检查URL中的关键字路径。 通过这些修改,应该能提高下载图片的相关性。此外,需要注意小红书的反爬措施,可能需要设置User-Agent使用其他方法来模拟真实用户行为,避免被屏蔽。</think>以下是修改程序解决方案,针对下载图片不匹配的问题: ### 1. 增加显式等待确保页面加载 修改`search_and_get_images`函数,使用WebDriverWait等待搜索结果加载: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def search_and_get_images(driver, query): search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "input")) ) search_box.send_keys(query + Keys.RETURN) # 等待搜索结果容器加载 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div[class*='note-container']")) ) # 模拟滚动加载更多内容 last_height = driver.execute_script("return document.body.scrollHeight") for _ in range(3): # 滚动3次 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 更精确的图片选择器 soup = BeautifulSoup(driver.page_source, "html.parser") note_containers = soup.select("div[class*='note-container'] img") return [img.get("src") or img.get("data-src") for img in note_containers][:50] ``` ### 2. 过滤无效图片地址 修改保存函数,添加格式验证: ```python def save_image(image_url): if not any(image_url.lower().endswith(ext) for ext in ['.jpg', '.jpeg', '.png', '.gif']): print(f"⏭ 跳过非图片文件: {image_url}") return img_name = f"{int(time.time())}_{os.path.basename(image_url.split('?')[0])}" # 其余代码保持不变... ``` ### 3. 添加请求头伪装浏览器 在`save_image`函数中添加headers: ```python def save_image(image_url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } try: response = requests.get(image_url, headers=headers, timeout=10) # 其余代码保持不变... ``` §§ 修改原理说明 §§ 1. **显式等待**:确保搜索结果的DOM元素完全加载,避免获取空白页数据[^1] 2. **动态滚动**:小红书采用懒加载技术,需要模拟滚动触发图片加载 3. **精确选择器**:通过`note-container`类定位官方内容容器,过滤广告等无关图片 4. **请求头伪装**:添加User-Agent避免被识别为爬虫[^2] 5. **文件名处理**:添加时间戳避免重复,过滤非图片文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值