Selenium爬虫本地化设置失效求助:循环查询需重复配置
解决Castorama.pl爬虫本地化设置失效问题
我用Python Selenium编写了一款简易网络爬虫,通过包含EAN码的Excel文件在Castorama.pl网站搜索产品并获取价格。首次启动浏览器时,Cookie授权与店铺本地化设置流程运行正常;但使用带循环的getdata函数执行搜索时,本地化设置会失效,每次查询都需重新配置,恳请提供解决思路。
初始化代码
driver.get("https://www.castorama.pl") driver.switch_to.frame(driver.find_element(By.CLASS_NAME, "truste_popframe")) time.sleep(1) accept = driver.find_element(By.CLASS_NAME, "call").click() driver.switch_to.default_content() postcode = driver.find_element(By.CLASS_NAME, "_1a41e483").send_keys("38-500") time.sleep(1) submit_postcode = driver.find_element(By.XPATH, "//span[normalize-space()='Dodaj']").click() results = []
查询函数代码
def getdata(symbol): driver.get(f"https://www.castorama.pl/search?term={symbol}") name = WebDriverWait(driver,2).until( EC.presence_of_element_located((By.ID, "product-title")) ) price = WebDriverWait(driver,2).until( EC.presence_of_element_located((By.CLASS_NAME, "_5d34bd7a")) ) records = { 'ean': symbol, 'cena': price.text, 'name': name.text } return records
解决思路
1. 保存并复用会话Cookie
初始化完成Cookie授权和本地化设置后,将当前浏览器的Cookie保存下来,每次调用getdata函数时先加载这些Cookie,让网站识别为已完成设置的会话:
# 初始化完成后保存Cookie cookies = driver.get_cookies() # 修改后的getdata函数 def getdata(symbol): # 先访问网站主页,确保Cookie域名匹配 driver.get("https://www.castorama.pl") # 加载保存的Cookie for cookie in cookies: driver.add_cookie(cookie) # 再跳转搜索页面 driver.get(f"https://www.castorama.pl/search?term={symbol}") name = WebDriverWait(driver,2).until( EC.presence_of_element_located((By.ID, "product-title")) ) price = WebDriverWait(driver,2).until( EC.presence_of_element_located((By.CLASS_NAME, "_5d34bd7a")) ) records = { 'ean': symbol, 'cena': price.text, 'name': name.text } return records
注意:加载Cookie前必须先访问目标域名下的页面,否则Cookie无法成功添加。
2. 改用站内搜索提交,避免直接跳转URL
不要直接用driver.get访问搜索链接,而是在初始化后的页面中找到搜索框,输入EAN码并提交搜索,全程保持在同一个会话中:
from selenium.webdriver.common.keys import Keys def getdata(symbol): # 等待搜索框加载并输入EAN码(替换为实际搜索框的定位符) search_box = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.CSS_SELECTOR, "搜索框的CSS选择器")) ) search_box.clear() search_box.send_keys(symbol) # 提交搜索 search_box.send_keys(Keys.ENTER) name = WebDriverWait(driver,2).until( EC.presence_of_element_located((By.ID, "product-title")) ) price = WebDriverWait(driver,2).until( EC.presence_of_element_located((By.CLASS_NAME, "_5d34bd7a")) ) records = { 'ean': symbol, 'cena': price.text, 'name': name.text } return records
这种方式能确保会话状态不丢失,本地化设置会一直有效。
3. 兜底:检查会话状态并重新配置
如果前两种方法无效,可以在getdata函数开头检查页面是否还保留本地化设置(比如是否显示已设置的店铺地址),若未保留则重新执行本地化步骤。但这种方式效率较低,仅作为备选方案。
内容的提问来源于stack exchange,提问作者Łukasz Tarnowski
相关产品推荐
相关产品推荐

