如何爬取JS渲染的ShareChat帖子?图片URL与标签爬取遇阻
我明白你现在的困扰——用Selenium爬ShareChat的时候,常规的点赞、分享这些数据能拿到,但图片URL和帖子标签因为页面JS动态渲染,死活抓不到对吧?这其实是动态页面爬取里很常见的问题,主要是因为这些元素可能是延迟加载,或者你的定位方式没命中JS生成的实际节点。
下面我给你调整代码,加上获取图片URL和标签的逻辑,同时优化一下等待逻辑(用显式等待比隐式等待更可靠):
优化后的完整代码
import sys import os import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By serviceurl = "https://sharechat.com/trending/Hindi" files = "dataset_link_1.txt" # 初始化输出文件 if not os.path.exists(files): with open(files, 'w') as f: pass driver = webdriver.Firefox(executable_path='D:\\CHIT CHAT\\Scrapper\\geckodriver') driver.maximize_window() driver.get(url=serviceurl) # 用显式等待确保页面核心帖子容器加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//section/div[contains(@class, 'post-container')]"))) # 滚动加载更多内容(优化滚动逻辑,确保内容加载完全) SCROLL_PAUSE_TIME = 1 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(SCROLL_PAUSE_TIME) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 定位所有帖子容器(替代原来的固定索引遍历,更稳定) posts = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//section/div[contains(@class, 'post-container')]"))) with open(files, 'w', encoding='utf-8') as enter: # 取前19条帖子,和你原来的循环逻辑一致 for idx, post in enumerate(posts[:19], start=1): try: # 滚动到当前帖子位置,触发懒加载内容加载 driver.execute_script("arguments[0].scrollIntoView();", post) time.sleep(0.3) # 获取浏览量 views = post.find_element_by_xpath(".//div[3]/div[1]").text print(f"Total No of views: {views}") enter.write(f"Total No of views:\n{views}\n") # 获取帖子标题 title = post.find_element_by_xpath(".//div[1]/div[1]/span").text print(f"Title: {title}") enter.write(f"Title:\n{title}\n") # 获取作者名称 writer_name = post.find_element_by_xpath(".//div[1]/a/div[2]/div/div[1]/strong").text print(f"Writer's Name: {writer_name}") enter.write(f"Writer's Name:\n{writer_name}\n") # 获取作者简介 writer_bio = post.find_element_by_xpath(".//div[1]/a/div[2]/div/div[2]").text print(f"Writer's Bio: {writer_bio}") enter.write(f"Writer's Bio:\n{writer_bio}\n") # 获取评论数 comments = post.find_element_by_xpath(".//div[2]/div/button[2]/div/span").text print(f"Total Comments: {comments}") enter.write(f"Total Comments:\n{comments}\n") # 获取WhatsApp分享数 whatsapp_share = post.find_element_by_xpath(".//div[2]/div/button[1]/div/span").text print(f"Whatsapp Share: {whatsapp_share}") enter.write(f"Whatsapp Share:\n{whatsapp_share}\n") # --- 新增:获取图片URL --- # 处理懒加载图片:优先取src,没有则取data-src(很多网站用这个存懒加载地址) try: img_element = post.find_element_by_xpath(".//div[1]/div[2]/img") img_url = img_element.get_attribute("src") or img_element.get_attribute("data-src") print(f"Image URL: {img_url}") enter.write(f"Image URL:\n{img_url}\n") except: print("No image found for this post") enter.write("Image URL:\nNo image\n") # --- 新增:获取帖子标签 --- try: tags = post.find_elements_by_xpath(".//div[contains(@class, 'tag-container')]/a") tag_texts = [tag.text for tag in tags] print(f"Tags: {', '.join(tag_texts)}") enter.write(f"Tags:\n{', '.join(tag_texts)}\n") except: print("No tags found for this post") enter.write("Tags:\nNo tags\n") print("-"*50) enter.write("\n") except Exception as e: print(f"Error processing post {idx}: {str(e)}") continue driver.quit()
关键改进点说明
- 显式等待替代隐式等待:用
WebDriverWait精准等待元素加载,比全局隐式等待更可靠,避免因元素未完全渲染导致的定位失败。 - 相对定位替代绝对XPath:原来的绝对XPath(
/html/body/div/...)非常脆弱,页面结构稍有变化就失效,改用基于帖子容器的相对XPath,稳定性大幅提升。 - 处理懒加载图片:先滚动到帖子位置触发加载,再获取图片的
src或data-src属性(很多网站用data-src存储懒加载地址,滚动后才替换为真实URL)。 - 定位帖子标签:通过标签容器的class定位所有标签元素,收集标签文本。
注意事项
如果后续ShareChat页面结构更新,导致图片或标签的定位表达式失效,你可以用浏览器开发者工具(F12)重新查看元素的真实结构,调整对应的XPath即可。
内容的提问来源于stack exchange,提问作者Newbee
相关产品推荐
相关产品推荐

