一个例子带你入门影刀编码版(三)

2023-12-13 13:47:54

摘要

将通过一个电商业务场景下的真实需求,带领大家零基础入门影刀编码版,本系列将会分三步讲解,从接到需求到最后完成发版,整个过程中我们需要做些什么?带你们走一个完整开发流程。

接前文
《影刀自动化采集底层逻辑》
《一个例子带你入门影刀编码版(一)》
《一个例子带你入门影刀编码版(二)》

代码整合思路

前面从需求拆分到模块,把每个模块都实现了,下面把每个模块组合起来封装成可执行程序,前面为了帮大家把基本功能都过一遍,有一些冗余,封装时候会考虑去掉

精简后代码结构规划:

  • 主流程调用
    • 分两个,抓全店在售ID
    • 按ID去转宝贝详情信息

设计思路和原理

  • 从业务场景出发,这可以是两个独立需求,一是我想要知道在售商品有哪些,一个是我想知道某些宝贝的具体信息,比如Top款、指定类目等
  • 从开发角度出发,每个宝贝详情页都是一个独立页面,且有固定规律,我直接用URL跳转可以减少大量窗口切换工作,一方面可以一定程度上避免反爬,另一方面可以增强代码健壮性

代码整合设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# modul1.py
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块

import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import random

def login_info():
    """
    登录验证
    @ return: webBrowser 网页对象
    """
    webBrowser = xbot.web.create("www.taobao.com",mode="chrome")
    user_name_elements = webBrowser.find_all_by_xpath('//div[@class="site-nav-user"]/a',timeout=3)
    if not  len(user_name_elements):
        xbot.app.dialog.show_message_box("提示","请先登录您的个人淘宝账号")
        user_name_elements = webBrowser.find_all_by_xpath('//div[@class="site-nav-user"]/a')
    user_name = user_name_elements[0].get_text()
    return webBrowser

def get_all_IDs():
    webBrowser = login_info()
    page_count = 0
    while True:
        all_id_elements = webBrowser.find_all_by_xpath('//div[@class="J_TItems"]/div')
        # print(len(all_id_elements))
        result = []
        for element in all_id_elements:
            if element.get_attribute("class")=="pagination":
                # print("到底了,点击下一页翻页")
                # break
                next_page_btn = element.find_by_xpath('//a[text()="下一页"]')
                # 判断下一页是否可用,不可用则到末尾页了
                next_page_btn_stau = next_page_btn.get_attribute("class")
                if next_page_btn_stau !="disable":
                    next_page_btn.click()
                break # 跳出当前循环

            else:
                # 获取每一组(一排5个)商品
                dl_elements = element.find_all_by_xpath("dl")
                for dl_element in dl_elements:
                    ID = dl_element.get_attribute("data-id")
                    ID_element = dl_element.find_by_xpath('dt/a/img')
                    ID_title = ID_element.get_attribute("alt")
                    ID_main_pic = ID_element.get_attribute("src")
                    print([ID,ID_title,ID_main_pic])
                    result.append([ID,ID_title,ID_main_pic])
            page_count+=1
            print(f"第{page_count}页抓取完成!")
        if next_page_btn_stau =="disable":
            break # 跳出所有循环
        
    xbot.app.databook.clear()
    xbot.app.databook.set_range(1,1,result)
    xbot.app.databook.export_data("GAP全店商品明细.xlsx")

def main(args):
   pass
# module2.py
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块

import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
from .module1 import *


def get_one_id_info(webBrowser):
    # 获取商品标题
    TITLE = webBrowser.find_by_xpath('//h1[contains(@class,mainTitle)]').get_text()
    active_price = webBrowser.find_all_by_xpath('//span[contains(@class,"Price--priceText")]')[0].get_text()
    discounts = webBrowser.find_by_xpath('//span[text()="优惠:"]/../span[contains(@class,"caption")]').get_attribute("title")
    active = webBrowser.find_by_xpath('//span[text()="活动:"]/../span[contains(@class,"caption")]').get_attribute("title")
    item_infos = webBrowser.find_by_xpath('//span[text()="宝贝参数:"]/..').get_text()

    return TITLE,active_price,discounts,active,item_infos


def get_all_ids_info(data_path,explort_dir):
    IDs = pd.read_excel(data_path)["商品ID"].values()
    webBrowser = login_info()
    result = []
    count = 0
    for ID in IDs:
        url = f"https://detail.tmall.com/item.htm?id={ID}"
        webBrowser.navigate(url)
        try:
            TITLE,active_price,discounts,active,item_infos= get_one_id_info(webBrowser)
            result.append([ID,"执行成功",TITLE,active_price,discounts,active,item_infos])
        except:
            result.append([ID,"执行失败"])
            count+=1
            if count >=3:
                break
    df_result = pd.DataFrame(result,columns={"商品ID","执行状态","商品名称","活动价","优惠","活动","商品详细信息"})
    df_result.to_excel(os.path.join(explort_dir,"商品信息.xlsx"),index=False)
def main(args):
    pass

文章来源:https://blog.csdn.net/qq_35866846/article/details/134673458
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。