使用Python Selenium无法获取Instagram评论的href属性求助
Instagram评论及回复唯一ID爬取故障排查
我需要快速完成任务,没时间学习HTML,现在用Python Selenium爬取Instagram账号weareone.exo的最新及指定时间内帖子,要获取评论和回复的href属性来得到唯一comment ID,避免后续分析重复。试过CLASS_NAME、XPATH、CSS_SELECTOR三种定位方式都没成功。
目前代码只能爬取[instagram_url]/p/CqhlzLmpfKV/#,无法获取带唯一ID的完整链接(比如主评论的[instagram_url]/p/CqhlzLmpfKV/c/17979860159080809/或回复的[instagram_url]/p/CqhlzLmpfKV/c/17979860159080809/r/18078377977318895/)。
当前代码
driver.get("https://www.instagram.com/weareone.exo/") latest_post = WebDriverWait(driver, timeout=40).until(lambda d: d.find_element(By.CLASS_NAME,"_aabd")) latest_post.click() comment_ids = [] load_more_path = "/html/body/div[2]/div/div/div[2]/div/div/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/div[1]/ul/li/div" # "Load more comments" until 2 clicks while i<3: try: WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.XPATH, load_more_path))).click() time.sleep(1.42) except: print("No more 'LOAD MORE COMMENTS' button to be clicked") break # "View Replies" if there's any view_reply_path = 'li > ul > li > div > button[class="_acan _acao _acas _aj1-"]' WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, view_reply_path))) view_reply_buttons = driver.find_elements(By.CSS_SELECTOR, view_reply_path) for button in range(len(view_reply_buttons)): view_reply_buttons[button].click() time.sleep(1.32) time.sleep(5.8) comment = driver.find_elements(By.CLASS_NAME, "_a9zj") for c in comment: container = c.find_element(By.CLASS_NAME,'_a9zr') WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.XPATH, '//div[2]/div/a'))) commentid = c.find_element(By.XPATH, '//div[2]/div/a').get_attribute("href") comment_ids.append(commentid) print(commentid)
当前输出
[instagram_url]/p/CqhlzLmpfKV/# [instagram_url]/p/CqhlzLmpfKV/# [instagram_url]/p/CqhlzLmpfKV/# .. .. .. [instagram_url]/p/CqhlzLmpfKV/# [instagram_url]/p/CqhlzLmpfKV/# [instagram_url]/p/CqhlzLmpfKV/#
解决方案
核心问题是XPATH全局定位错误:你使用的//div[2]/div/a是从整个文档根节点开始查找,每次都会返回第一个匹配的元素(即帖子本身的链接),而非当前评论容器内的链接。
具体修正步骤:
- 将XPATH改为相对路径,在开头添加
.,表示从当前评论元素c内部查找:.//div[2]/div/a - 补充加载更多逻辑中缺失的
i变量初始化和循环递增,否则加载更多的循环会无限执行或直接跳过 - 给“查看回复”逻辑添加异常捕获,避免没有回复按钮时代码报错中断
- 可以用更精准的定位规则直接筛选带评论ID的链接:
.//a[contains(@href, '/c/')],确保只抓取包含评论ID的href
修改后的关键代码片段:
# 补充i变量初始化 i = 0 while i<3: try: WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.XPATH, load_more_path))).click() time.sleep(1.42) i += 1 # 添加循环递增 except: print("No more 'LOAD MORE COMMENTS' button to be clicked") break # 给查看回复添加异常捕获 try: WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, view_reply_path))) view_reply_buttons = driver.find_elements(By.CSS_SELECTOR, view_reply_path) for button in view_reply_buttons: button.click() time.sleep(1.32) except: print("No view reply buttons found") # 修正评论链接定位 for c in comment: # 直接定位带评论ID的链接 comment_link = WebDriverWait(c, timeout=20).until( EC.presence_of_element_located((By.XPATH, './/a[contains(@href, "/c/")]')) ) commentid = comment_link.get_attribute("href") comment_ids.append(commentid) print(commentid)
注意:Instagram的页面类名(如_a9zj、_a9zr)会不定期更新,若后续定位失效,需重新检查页面元素的最新类名或属性。
内容的提问来源于stack exchange,提问作者June W.
相关产品推荐
相关产品推荐

