首页 > 大数据 > 数据挖掘 > 抖音商家批量采集精选联盟卖家信息提取演示
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/ ,如需转载,请注明出处,否则将追究法律责任。