使用Selenium爬取Instagram轮播帖时如何获取图片src
解决Instagram轮播帖后续图片src获取重复的问题
你的问题核心是:点击轮播Next按钮后,Selenium仍返回第一张图片的src,原因主要有两个:要么是元素属性缓存未更新,要么是定位到了原始帖子而非当前打开的弹窗帖子。不需要引入BeautifulSoup,用Selenium本身就能解决。
解决方案1:等待图片src属性更新
Instagram轮播切换时,通常不会替换<img>元素,只是更新它的src属性。直接重新获取元素属性可能拿到缓存值,需要等待属性变化后再读取:
from selenium.webdriver.support import expected_conditions as EC # 获取第一张图的src image_element = post_element.find_element(By.XPATH, ".//div[@class='_aagv']/img") original_src = image_element.get_attribute('src') # 点击Next按钮 next_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-label='Next']"))) next_btn.click() # 等待src属性变化,避免读取缓存 WebDriverWait(driver, 10).until(lambda d: image_element.get_attribute('src') != original_src) # 获取更新后的src new_image_src = image_element.get_attribute('src')
解决方案2:重新定位当前弹窗内的图片元素
如果post_element是点击前的帖子预览元素,点击后打开的是弹窗,此时用post_element查找会定位到页面上的原始帖子,而非弹窗里的轮播图。需要先定位当前打开的帖子弹窗,再在弹窗内找图片:
# 获取第一张图的src original_src = post_element.find_element(By.XPATH, ".//div[@class='_aagv']/img").get_attribute('src') # 点击Next按钮 next_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-label='Next']"))) next_btn.click() # 定位当前打开的帖子弹窗(Instagram弹窗通常带role='dialog') current_post_dialog = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@role='dialog']"))) # 在弹窗内获取当前显示的图片src new_image_element = current_post_dialog.find_element(By.XPATH, ".//div[@class='_aagv']/img") new_image_src = new_image_element.get_attribute('src')
额外注意事项
- 避免用
driver.execute_script("arguments[0].click();", next_btn),直接用next_btn.click()更可靠,Selenium会自动处理元素状态。 - 如果轮播切换时
<img>元素会被替换,可以用EC.staleness_of(image_element)等待旧元素失效,再重新查找新元素:
WebDriverWait(driver, 10).until(EC.staleness_of(image_element)) new_image_element = current_post_dialog.find_element(By.XPATH, ".//div[@class='_aagv']/img") new_image_src = new_image_element.get_attribute('src')
内容的提问来源于stack exchange,提问作者Angel Mosley
相关产品推荐
相关产品推荐

