【本博客仅供学习参考】python+selenium接管浏览器获取数据

这是一个使用Selenium库进行网页数据抓取的Python脚本,涉及元素定位、等待策略、异常处理等。脚本从Excel文件读取商品链接,通过Chrome浏览器模拟用户登录,抓取并解析页面上的商品信息如品牌、系列、价格、活动等,并将数据存储到Excel。此外,脚本还能下载产品图片。适用于电商数据爬取与分析场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from selenium import webdriver
import time
import urllib
import os
from urllib.request import urlretrieve
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
from selenium.webdriver import ChromeOptions
import datetime

日期 = []
产品 = []
平台 = []
店铺 = []
链接 = []
品牌 = []
系列 = []
颜色 = []
页面价 = []
活动1 = []
活动2 = []
到手价 = []
图片 = []
today = datetime.datetime.now().strftime('%Y-%m-%d')


def find_elements_by_xpath(driver, xpath, findtime=5):
    """
    显示等待
    :param driver: 驱动
    :param xpath: 路径
    :param findtime: 最长等待时间
    :return:
    """
    WebDriverWait(driver, int(findtime), 0.5).until(
            EC.presence_of_all_elements_located((By.XPATH, xpath)))
        return driver.find_elements_by_xpath(xpath)


def find_element_by_xpath(driver, xpath, findtime=5):
    """
    显示等待
    :param driver: 驱动
    :param xpath: 路径
    :param findtime: 最长等待时间
    :return:
    """
    WebDriverWait(driver, int(findtime), 0.5).until(
            EC.presence_of_element_located((By.XPATH, xpath)))
        return driver.find_element_by_xpath(xpath)


def excel_file_read(file_name, data='链接'):
    """
    :param file_name: 要读取的文件名
    :param data: 要读取的列
    :return:返回对应列值
    """
    df = pd.read_excel(r'{}.xlsx'.format(file_name))
    len_df = df[data].values
    return len_df


def excel_file_write():
    """
    :return:
    """
    # 将以下数据写入字典
    df = pd.DataFrame({
        '日期': 日期,
        '产品': 产品,
        '平台': 平台,
        '店铺': 店铺,
        '链接': 链接,
        '品牌': 品牌,
        '系列': 系列,
        '颜色': 颜色,
        '页面价': 页面价,
        '活动1': 活动1,
        '活动2': 活动2,
        '到手价': 到手价
    })
    # 将数据传入Excel并保存
    df.to_excel(today + '商品信息.xlsx')


def down_photo():
    try:
        len_photo = excel_file_read(f'{today}图片链接')  # 读取Excel
        len_photo1 = excel_file_read(f'{today}图片链接', "系列")  # 读取Excel
        # 遍历图片链接
        for count in range(0, len(len_photo)):
            try:
                os.makedirs(today)
            except:
                pass
            # 请求网址,将图片保存至本地
            """
            参数1:第几个链接
            参数2:保存路径
            """
            urllib.request.urlretrieve(len_photo[count],
                                       r'{}\{}.jpg'.format(today, str(count) + "_" + str(len_photo1[count])))
    except:
        pass


def login(driver, su=1):
    try:
        time.sleep(3)
        driver.switch_to.frame(
            find_element_by_xpath(driver, '//*[@id="sufei-dialog-content"]')
        )
        if su == 1:
            while True:
                try:
                    assert '密码登录' in driver.page_source
                    find_element_by_xpath(driver, '//*[@id="sufei-dialog-close"]')
                    time.sleep(3)
                except:
                    print("关闭登录...")
                    break
        else:
            button = 'document.querySelector("#login > div.corner-icon-view.view-type-qrcode > i").click()'
            driver.execute_script(button)
            while True:
                try:
                    assert '密码登录' in driver.page_source
                    print("请扫码登录...")
                    time.sleep(3)
                except:
                    print("成功登录...")
                    break

            while True:
                try:
                    assert 'Hi,' in driver.page_source
                    break
                except:
                    print("请在手机再次确认")
                    time.sleep(3)
        driver.switch_to.default_content()
    except:
        pass


def test_main():
    try:
        len_df = excel_file_read('天猫')  # 读取Excel
        # print(len_df)
        driver = startup()  # 启动Chrome driver 防止天猫检测
        time.sleep(3)
        for q in range(0, len(len_df)):
            url = len_df[q]
            time.sleep(3)
            driver.get(url)  # 请求地址
            # login(driver)  # 免登陆处理
            # 获取所有商品种类
            all_types = find_elements_by_xpath(driver, '//*[@data-property="颜色分类"]/li')
            # print(len(all_types))
            for k in range(1, len(all_types) + 1):
                日期.append(today)
                平台.append("天猫")
                链接.append(driver.current_url)

                店铺名称 = find_element_by_xpath(driver, '//*[@class="slogo-shopname"]/strong')
                店铺名称 = str(店铺名称.text)
                店铺.append(店铺名称)
                print('店铺:' + 店铺名称)

                颜色分类 = find_element_by_xpath(driver, f'//*[@data-property="颜色分类"]/li[{k}]/a/span')
                颜色分类1 = str(颜色分类.text)
                颜色.append(颜色分类1)
                print(颜色分类1)
                try:
                    颜色分类.click()
                except:
                    df = pd.DataFrame({
                        '日期': 日期,
                        '产品': 产品,
                        '平台': 平台,
                        '店铺': 店铺,
                        '链接': 链接,
                        '颜色': 颜色
                    })
                    df.to_excel(today + '_Error_未获取到的商品信息.xlsx')
                    continue

                系列名称 = find_element_by_xpath(driver, '//*[@class="tb-detail-hd"]/h1')
                系列名称 = str(系列名称.text)
                系列.append(系列名称)
                print(系列名称)

                图片链接 = find_element_by_xpath(driver, '//*[@id="J_ImgBooth"]')
                图片链接 = 图片链接.get_attribute('src')
                图片.append(图片链接)
                df = pd.DataFrame({
                    '链接': 图片,
                    '系列': 系列
                })
                df.to_excel(today + '图片链接.xlsx')
                print(图片)

                价格 = find_element_by_xpath(driver, '//*[.="价格"]/following-sibling::dd/descendant::*[@class="tm-price"]')
                价格 = str(价格.text)
                页面价.append(价格)
                print('价格:' + 价格)

                try:
                    促销价 = find_element_by_xpath(driver,
                                                '//*[.="促销价"]/following-sibling::dd/descendant::*[@class="tm-price"]')
                    促销价 = str(促销价.text)
                    到手价.append(促销价)
                    print('促销价:' + 促销价)
                except:
                    到手价.append(价格)
                    print('促销价:' + 价格)

                try:
                    本店活动1 = find_element_by_xpath(driver, '//*[.="本店活动"]/following-sibling::dd')
                    本店活动1 = str(本店活动1.text)
                    活动1.append(本店活动1)
                    print('本店活动1:' + 本店活动1)
                except:
                    活动1.append("无")

                try:
                    本店活动2 = find_element_by_xpath(driver, '//*[@class="restrict"]')
                    本店活动2 = str(本店活动2.text)
                    活动2.append(本店活动2)
                    print('本店活动2:' + 本店活动2)
                except:
                    活动2.append("无")

                品牌名称 = find_element_by_xpath(driver, '//*[contains(text(),"品牌:")]')
                品牌名称 = str(品牌名称.text)
                品牌.append(品牌名称.replace("品牌:", ""))
                print(品牌名称)

                产品名称 = find_element_by_xpath(driver, '//*[contains(text(),"产品名称:")]')
                产品名称 = str(产品名称.text)
                产品.append(产品名称.replace("产品名称:", ""))
                print(产品名称)

                excel_file_write()  # 将商品信息写入Excel
    except Exception as msg:
        print(msg)
        raise
    finally:
        down_photo()  # 将图片从网上下载下来
        print("程序执行完成")


def startup():
    """
    sta.bat文件内容: chrome.exe -remote-debugging-port=9222
    """

    os.system('start sta.bat')  # 调用bat文件
    option = ChromeOptions()
    # 绕过天猫检测
    option.debugger_address = "127.0.0.1:9222"  # 接管谷歌浏览器
    driver = webdriver.Chrome(options=option)  # 在调用浏览器驱动时传入

    driver.maximize_window()
    # 隐式等待3秒
    driver.implicitly_wait(3)
    return driver


if __name__ == '__main__':
    test_main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值