You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何爬取JS渲染的ShareChat帖子?图片URL与标签爬取遇阻

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:55:31