ITPub博客

首页 > 大数据 > 数据挖掘 > 抖音商家批量采集精选联盟卖家信息提取演示

抖音商家批量采集精选联盟卖家信息提取演示

原创 数据挖掘 作者:电商大牛 时间:2025-06-09 11:26:47 0 删除 编辑
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time
import csv
import random
import logging
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class DouyinBusinessScraper:
    def __init__(self):
        # 配置Chrome选项
        chrome_options = Options()
        chrome_options.add_argument("--disable-blink-features=AutomationControlled")
        chrome_options.add_argument("--start-maximized")
        # 取消下面注释可以在无头模式下运行
        # chrome_options.add_argument("--headless")  
        
        # 初始化浏览器驱动
        self.driver = webdriver.Chrome(
            service=Service(ChromeDriverManager().install()),
            options=chrome_options
        )
        self.wait = WebDriverWait(self.driver, 10)
        
        # 存储商家信息的列表
        self.businesses = []
    def login(self, username, password):
        """登录抖音商家平台"""
        try:
            self.driver.get("https://fxg.jinritemai.com/")
            logger.info("访问抖音商家平台登录页面")
            
            # 切换到密码登录
            password_login_btn = self.wait.until(
                EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "密码登录")]'))
            )
            password_login_btn.click()
            
            # 输入用户名和密码
            username_input = self.wait.until(
                EC.presence_of_element_located((By.XPATH, '//input[@placeholder="请输入手机号/邮箱/用户名"]'))
            )
            password_input = self.driver.find_element(By.XPATH, '//input[@placeholder="请输入密码"]')
            
            username_input.send_keys(username)
            password_input.send_keys(password)
            
            # 点击登录按钮
            login_btn = self.driver.find_element(By.XPATH, '//button[@type="submit"]')
            login_btn.click()
            
            # 等待登录完成
            time.sleep(5)
            logger.info("登录完成")
            
        except Exception as e:
            logger.error(f"登录失败: {str(e)}")
            raise
    def search_businesses(self, keyword, pages=3):
        """搜索商家并收集信息"""
        try:
            # 导航到搜索页面
            self.driver.get("https://fxg.jinritemai.com/merchant/business/shop-list")
            logger.info("访问商家列表页面")
            
            # 等待搜索框加载完成
            search_input = self.wait.until(
                EC.presence_of_element_located((By.XPATH, '//input[@placeholder="请输入店铺名称/店铺ID"]'))
            )
            search_input.send_keys(keyword)
            
            # 点击搜索按钮
            search_btn = self.driver.find_element(By.XPATH, '//button[contains(text(), "搜索")]')
            search_btn.click()
            logger.info(f"搜索关键词: {keyword}")
            
            # 翻页收集商家信息
            for page in range(1, pages + 1):
                logger.info(f"正在处理第 {page} 页")
                
                # 等待商家列表加载完成
                time.sleep(random.uniform(2, 4))  # 随机延迟,避免被反爬
                
                # 提取商家信息
                business_elements = self.driver.find_elements(By.XPATH, '//div[contains(@class, "shop-item")]')
                
                for business in business_elements:
                    try:
                        name = business.find_element(By.XPATH, './/div[contains(@class, "shop-name")]').text
                        shop_id = business.find_element(By.XPATH, './/div[contains(@class, "shop-id")]').text
                        
                        # 点击查看详情
                        detail_btn = business.find_element(By.XPATH, './/button[contains(text(), "查看详情")]')
                        detail_btn.click()
                        
                        # 等待详情页加载
                        time.sleep(random.uniform(1, 3))
                        
                        # 提取联系电话
                        phone = self.driver.find_element(By.XPATH, '//div[contains(text(), "联系电话")]/following-sibling::div').text
                        
                        self.businesses.append({
                            'name': name,
                            'shop_id': shop_id,
                            'phone': phone
                        })
                        
                        logger.info(f"成功获取商家: {name}, 电话: {phone}")
                        
                        # 返回商家列表页面
                        back_btn = self.driver.find_element(By.XPATH, '//button[contains(text(), "返回列表")]')
                        back_btn.click()
                        time.sleep(random.uniform(1, 2))
                        
                    except Exception as e:
                        logger.error(f"获取商家信息失败: {str(e)}")
                        # 返回商家列表页面
                        try:
                            back_btn = self.driver.find_element(By.XPATH, '//button[contains(text(), "返回列表")]')
                            back_btn.click()
                            time.sleep(random.uniform(1, 2))
                        except:
                            pass
                
                # 如果不是最后一页,点击下一页
                if page < pages:
                    next_btn = self.driver.find_element(By.XPATH, '//button[contains(text(), "下一页")]')
                    next_btn.click()
                    time.sleep(random.uniform(2, 4))
        
        except Exception as e:
            logger.error(f"搜索商家失败: {str(e)}")
            raise
    def save_to_csv(self, filename="douyin_businesses.csv"):
        """将收集的商家信息保存到CSV文件"""
        if not self.businesses:
            logger.info("没有商家信息可保存")
            return
            
        try:
            with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
                fieldnames = ['name', 'shop_id', 'phone']
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                
                writer.writeheader()
                for business in self.businesses:
                    writer.writerow(business)
            
            logger.info(f"成功保存 {len(self.businesses)} 条商家信息到 {filename}")
        except Exception as e:
            logger.error(f"保存CSV文件失败: {str(e)}")
    def close(self):
        """关闭浏览器"""
        self.driver.quit()
        logger.info("浏览器已关闭")
if __name__ == "__main__":
    # 使用示例
    try:
        scraper = DouyinBusinessScraper()
        # 请替换为你的抖音商家平台账号和密码
        scraper.login("your_username", "your_password")
        # 搜索关键词和要抓取的页数
        scraper.search_businesses("女装", pages=2)
        # 保存结果到CSV文件
        scraper.save_to_csv()
        # 关闭浏览器
        scraper.close()
    except Exception as e:
        logger.error(f"程序运行出错: {str(e)}")


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042811/viewspace-3087026/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
主做电商软件开发欢迎合作V♥ 553813195

注册时间:2024-12-12

  • 博文量
    4
  • 访问量
    5710