电商选品/跟卖| 亚马逊商品类爬取

news2024/11/21 18:39:01

电商跟卖,最重要是了解哪些商品可以卖, 哪些商品不能卖, 为了更好了解商品信息,我们会经常爬取商品类目的信息.

需求

亚马逊类目信息链接爬虫

  1. 打开亚马逊类目信息地址

https://www.amazon.com/gp/new-releases/automotive/ref=zg_bsnr_nav_automotive_0

一直递归下去,获取到亚马逊最细的分类top链接

保存最底下类目到excel

实现

from platforms.base_platform import ObjectPlatform
from util.xpath_operation import SeleniumOperation
from restful.rest_request import HttpRequests
import os
from platforms.amazon.amazon_anti_scrape import AmazonAntiScrape
from platforms.amazon.amazon_product_url import AmazonProductUrl
import copy
from util.pd_util import PandasUtil
import pandas as pd


class AmazonProductPlatform(ObjectPlatform):
    name = "amazon_class_url"
    desc = "亚马逊商品类目url生成和获取,获取到叶子结点,最后保存到excel"
    config_file = "%s%s" % (name, "_config")
    setting_file = "%s%s" % (name, "_setting")

    def __init__(self, config_file_input=None, setting_file_input=None, log=None):
        super(AmazonProductPlatform, self).__init__(load_extension=False, login=False)
        self.config_file = config_file_input if config_file_input else \
            "%s%s" % (self.base_config_package, self.config_file)

        self.setting_file = setting_file_input if setting_file_input else \
            "%s%s" % (self.base_setting_package, self.setting_file)
        self.config_package = __import__(self.config_file, fromlist=True)

        self.setting_package = __import__(self.setting_file, fromlist=True)
        self.log = log
        self.restful = HttpRequests()
        if not os.path.exists(self.config_package.amazon_config["out_path"]):
            os.makedirs(self.config_package.amazon_config["out_path"])
        SeleniumOperation.log = log
        self.amazon_url_obj = AmazonProductUrl(self.driver, self.config_package, self.setting_package, log)
        self.amazon_anti = AmazonAntiScrape(self.driver, self.config_package, self.setting_package, log)

    def before_run(self):
        print("启动%s平台" % AmazonProductPlatform.desc)

    def run(self):
        urls = self.config_package.amazon_config["urls"]
        for i, url in enumerate(urls):
            # 打开亚马逊页面
            print("打开页面:", url)
            self.get_url_ignore_exception(url)
            self.amazon_anti.detect_all_solution(url)
            class_name = self.amazon_url_obj.get_class_name()
            parents = []
            leaf_datas = []
            self.recursion_get_urls(parents, leaf_datas, url)
            # 类别存储到服务器中

            # 插入数据到数据库,通过restful屏蔽基础设施
            if leaf_datas:
                import datetime
                out_file_name = os.path.join(self.config_package.amazon_config["out_path"],
                                             str(datetime.date.today()) + "_" + class_name + ".xlsx")
                leaf_datas = pd.DataFrame.from_records(leaf_datas)
                self.report_class(leaf_datas["class_arrays"].to_numpy())
                leaf_datas = PandasUtil.fill_pandas_col(leaf_datas, "class_arrays", "class")
                PandasUtil.write_excel(leaf_datas, out_file_name)
                print("保存文件{}成功".format(out_file_name))


    def report_class(self, leaf_datas):

        count = self.config_package.amazon_config["report_count"]
        begin = 0
        end = count
        while begin <= len(leaf_datas):
            print("正在上报类别信息切片:%s-%s,总共%s条到服务器" % (begin, end, len(leaf_datas)))
            code, http_result = self.restful.rest_post_method(self.config_package.amazon_config["data_save_url"],
                                                              leaf_datas[begin:end].tolist())
            if code == 0:
                response = http_result.read()
                response = response.decode(encoding='utf-8')
                import json
                response = json.loads(response)
                if response["code"] == "0":
                    begin = end
                    end = end + count
                    continue
            self.log.error("restful请求失败,code:{},reason:{}".format(code, http_result))
            print(
                "上报数据失败code:%s,原因:%s,继续重试,如果重试太久,请联系开发者看一下......" % (code, http_result))
            import time
            time.sleep(10)
        pass


    def recursion_get_urls(self, parents, leaf_datas, url):
        leaf_class_name = SeleniumOperation.get_text(self.driver, self.setting_package.group_class_name)
        if leaf_class_name:
            leaf_class_name = leaf_class_name.strip()
            leaf_class_names = copy.deepcopy(parents)
            leaf_class_names.append(leaf_class_name)
            leaf_url = self.driver.current_url
            leaf_datas.append({
                "class_name": "/".join(leaf_class_names),
                "class_arrays": leaf_class_names,
                "leaf_url": leaf_url
            })
            print("判断url:{}是叶子结点,路径是:{}".format(leaf_url, "/".join(leaf_class_names)))
            return
        maybe_parent_class_name = self.amazon_url_obj.get_class_name()
        while not maybe_parent_class_name:
            # todo maybe stackoverflow
            info = "url:{},找不到父类名称.......,刷新页面...".format(url)
            print(info)
            self.log.warn(info)
            self.get_url_ignore_exception(url)
            self.amazon_anti.detect_all_solution(url)
            maybe_parent_class_name = self.amazon_url_obj.get_class_name()
            # self.recursion_get_urls(parents, leaf_datas, url)  # 递归获取
        maybe_parent_class_name = maybe_parent_class_name.strip()
        urls = self.amazon_url_obj.get_class_urls()
        parents.append(maybe_parent_class_name)
        try:
            for temp_url in urls:
                # 打开url
                #
                self.get_url_ignore_exception(temp_url)
                self.amazon_anti.detect_all_solution(temp_url)
                self.recursion_get_urls(parents, leaf_datas, temp_url)  # 递归获取
        except Exception as e:
            self.log.exception(e)
        finally:
            print("删除前的parents", "-".join(parents))
            parents.pop()
            print("删除后的parents", "-".join(parents))


    def after_run(self):
        print("%s 平台已经运行完成,请根据log目录查看运行日志\n" % AmazonProductPlatform.name)

        super(AmazonProductPlatform, self).after_run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生(四十七) | PHP软件安装部署

文章目录 PHP软件安装部署 一、PHP软件部署步骤 二、安装与配置PHP PHP软件安装部署 一、PHP软件部署步骤 第一步&#xff1a;安装 EPEL 仓库 与 Remi仓库 第二步&#xff1a;启用 Remi 仓库 第三步&#xff1a;安装 PHP、PHP-FPM 第四步&#xff1a;启动并开机启用 PH…

10.8 sql语句查询(未知的)

1.查询结果去重 关键字:distinct (放在查询的后面) AC: select distinct university from user_profile 2.查询结果限制返回行数 关键字:limit AC: select device_id from user_profile limit 0,2 3.将查询后的列重新命名 关键字:as AC: select device_id as user_infos…

wildcard使用教程,解决绝大多数普通人的海外支付难题

许多人可能已经注意到,国外的一些先进AI工具对国内用户并不开放。而想要使用这些工具,我们通常会面临两个主要障碍:一是网络访问的限制,二是支付问题。网络问题很容易解决&#xff0c;难的是如何解决在国内充值海外软件。 今天给大家推荐一个工具——wildcard&#xff0c;用它…

【CSS in Depth 2 精译_046】7.1 CSS 响应式设计中的移动端优先设计原则(下)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

StoryMaker: Towards Holistic Consistent Characters in Text-to-image Generation

https://arxiv.org/pdf/2409.12576v1https://github.com/RedAIGC/StoryMaker 问题引入 针对的是文生图的模型&#xff0c;现在已经有方法可以实现指定人物id的情况下进行生成&#xff0c;但是还没有办法保持包括服装、发型等整体&#xff0c;本文主要解决这个问题&#xff1b…

时间卷积网络(TCN)原理+代码详解

目录 一、TCN原理1.1 因果卷积&#xff08;Causal Convolution&#xff09;1.2 扩张卷积&#xff08;Dilated Convolution&#xff09; 二、代码实现2.1 Chomp1d 模块2.2 TemporalBlock 模块2.3 TemporalConvNet 模块2.4 完整代码示例 参考文献 在理解 TCN 的原理之前&#xff…

GIS后端工程师岗位职责、技术要求和常见面试题

GIS 后端工程师负责设计、开发与维护地理信息系统的后端服务&#xff0c;包括数据存储、处理、分析以及与前端的交互接口等&#xff0c;以实现高效的地理数据管理和功能支持。 GIS 后端工程师岗位职责 一、系统设计与开发 参与地理信息系统&#xff08;GIS&#xff09;项目的…

安装 Petalinux

资料准备 ubuntu 22.04: 运行内存8G 存储空间500G Petalinux&#xff1a;2024.1 安装流程 安装依赖 sudo apt-get update sudo apt-get upgrade sudo apt-get install iproute2 sudo apt-get install gawk sudo apt-get install build-essential sudo apt-ge…

7.3 物联网平台-Thingsboard使用教程

物联网平台-Thingsboard使用教程 目录概述需求&#xff1a; 设计思路实现思路分析 免费下载参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for chang…

如何使用ssm实现基于web技术的税务门户网站的实现+vue

TOC ssm820基于web技术的税务门户网站的实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff…

基于matlab的语音信号处理

摘要 利用所学习的数字信号处理知识&#xff0c;设计了一个有趣的音效处理系统&#xff0c;首先设计了几种不同的滤波器对声音进行滤波处理&#xff0c;分析了时域和频域的变化&#xff0c;比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放&#xf…

从0开始linux(9)——进程(1)进程管理

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 查看进程进程管理PID与PPIDfork函数 在上一篇中我们了解到&#xff1a;当运行程序时&#xff0c;操作系统会将磁盘中的二进制文件读取到内存当中&#xff0c;程序运行到结束的过程称为进程&am…

【C++ 11】auto 自动类型推导

文章目录 【 1. 基本用法 】【 2. auto 的 应用 】2.0 auto 的限制2.1 简单实例2.2 auto 与指针、引用、const2.4 auto 定义迭代器2.5 auto 用于泛型编程 问题背景 在 C11 之前的版本&#xff08;C98 和 C 03&#xff09;中&#xff0c;定义变量或者声明变量之前都必须指明它的…

目标检测YOLO实战应用案例100讲-【目标检测】YOLOV11

目录 前言 算法原理 YOLO发展历程 什么是 YOLO11 YOLOv11 的主要特点 YOLO各版本概览 核心优势: YOLOv11改进方向 YOLOv11功能介绍 YOLOv11关键创新 YOLOv11 指标展示 YOLOV11实验 环境设置 准备数据集 训练模型 验证模型 应用领域 一、智慧交通与自动驾…

【Linux实践】实验八:Shell程序的创建及变量

文章目录 实验八&#xff1a;Shell程序的创建及变量实验目的&#xff1a;实验内容&#xff1a;操作步骤&#xff1a;1. 查看环境变量2. 定义变量AK3. 定义变量AM并比较4. 创建Shell程序 实验八&#xff1a;Shell程序的创建及变量 实验目的&#xff1a; 掌握Shell程序的创建过…

【C++】AVL树的底层以及实现

个人主页 文章目录 ⭐一、AVL树的概念&#x1f389;二、AVL树的性质&#x1f3dd;️三、AVL树的实现1. 树的基本结构2. 树的插入3. 树的旋转• 左单旋• 右单旋• 左右双旋• 右左双旋 &#x1f3a1;四、AVL树的其它功能1. 树的查找2. 树的遍历3. 树的高度4. 树的大小 &#x…

RK3568平台开发系列讲解(I2C篇)i2c 总线驱动介绍

🚀返回专栏总目录 文章目录 一、i2c 总线定义二、i2c 总线注册三、i2c 设备和 i2c 驱动匹配规则沉淀、分享、成长,让自己和他人都能有所收获!😄 i2c 总线驱动由芯片厂商提供,如果我们使用 ST 官方提供的 Linux 内核, i2c 总线驱动已经保存在内核中,并且默认情况下已经…

vulnhub-matrix-breakout-2-morpheus靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell ①nc反弹shell连接 ②Webshell上传 3、提权 ①使用kali自带的poc ②使用msf进行渗透 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(19…

项目构建工具

一般面试中被问到的项目构建工具&#xff0c;常常会回答的是Maven 今天大概了解了一下目前项目构建构建有Maven,Ant,Gradle Gradle 是一个构建工具&#xff0c;它是用来帮助我们构建app的&#xff0c;构建包括编译&#xff0c;打包等过程。我们可以为Gradle指定构建规则&…

matlab 相关

1、xcorr 本质上是两个函数做内积运算 相关算法有两种&#xff1a; 在Matlab上既可以 1.用自带的xcorr函数计算互相关&#xff0c;2.通过在频域上乘以共轭复频谱来计算互相关&#xff1b; 网友验证程序 clc;clear;close all; % s1,s2为样例数据 s1 [-0.00430297851562500;-…