[淘宝销量]—采集分析—实例参考▶

news2024/12/23 10:59:30

[干货]

本文爬取淘宝的搜索结果,包含标题、价格、原价、店铺、月销量字段。将结果保存成csv格式,并作简单分析。以手机为例。【淘宝销量

用到的python库:selenium、urllib、pyquery、pandas。

1.爬取页面分析

1.1 获取URL

打开淘宝,在搜索框中输入“手机”并按回车键,会看到关于手机的搜索结果:

拉到页面最下面,只有上一页、下一页、首页三个按钮,看不到搜索结果总共有多少页。按F12打开开发者工具,然后刷新页面,可以在网络监听中找到页面的URL:

其中,keyword参数即我们搜索的关键词“手机”,pnum代表页数(从0开始)。我们试着把其中不必要的参数去掉,构造URL:

1.2获取页面元素

现在我们已经得到了URL,接下来尝试获取所需字段所在页面元素中的位置。点击开发者工具中的Elements、接着点击左边的箭头符号按钮,将鼠标定位在手机展示结果页面,可以看到手机信息所在的位置:

每个手机信息保存在class=pc-items-item item-undefined的li标签中,依次按上述点击标题、价格等字段,可以得到每个元素的具体位置。那么,我们可以通过改变URL里的页数参数,获取该页的网页源代码,然后使用pyquery库获取我们想要的元素。

2.爬虫代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import urllib.parse
from pyquery import PyQuery as pq
import pandas as pd


def scratch_page(driver, url, page):
    """获取网页源代码"""
    wait = WebDriverWait(driver, 10)
    retry_num = 0
    while retry_num < 3:  # 如果打开页面失败,则最多重复三次
        try:
            driver.get(url % (urllib.parse.quote(keyword), page))
            # 等待页面加载完成
            wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '.pc-search-page-item-after'), '下一页'))
            wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.pc-search-items-list li')))
            retry_num = 3
        except:
            retry_num += 1
    return driver


def goods(html):
    """获取单页的所有商品"""
    # 解析网页源代码
    doc = pq(html)
    # 抓取字段:标题、价格、原价、店铺名、月销量
    items = doc('.pc-search-items-list').children('li')
    for item in items.items():
        title = item.find('.title-text').text()  # 标题
        discount_price = item.find('.coupon-price-afterCoupon').text()  # 价格
        original_price = item.find('.coupon-price-old').text()  # 原价
        shop = item.find('.seller-name').text()  # 店铺
        monthly_sales = item.find('.sell-info').text()  # 月销量
        yield [title, discount_price, original_price, shop, monthly_sales]


def main(keyword, total_pages):
    url = 'https://uland.taobao.com/sem/tbsearch?keyword=%s&pnum=%d'
    chrome_options = Options()
    chrome_options.add_argument('--headless')  # 设置无头chrome
    driver = webdriver.Chrome(options=chrome_options)
    goods_list = pd.DataFrame(columns=['category', 'title', 'discount', 'original_price', 'shop', 'monthly_sales'])
    # 按页爬取
    for page in range(total_pages + 1):
        print('正在抓取第%d页...' % (page + 1))
        driver = scratch_page(driver, url, page)
        html = driver.page_source
        items = goods(html)
        for item in items:
            item.insert(0, keyword)
            goods_list.loc[len(goods_list)] = item
    # 将结果保存到csv中
    goods_list.to_csv('淘宝商品_%s.csv' % keyword, index=False, encoding='utf-8-sig')
    driver.close()
    print('\n抓取完成')
    return


if __name__ == '__main__':

    keyword = '手机'
    total_pages = 16  # 每页60

    main(keyword, total_pages)

3.爬取结果

爬下来的原始数据总共有1000条,结果中包含了手机壳、蓝牙耳机等非手机数据,需要做进一步数据清洗。

4.数据清洗和可视化

4.1数据清洗

1.首先将月销量处理成数字:将"月销 "替换成"",字段值含"万"的调整成数值型并乘以10000。

2.店铺名含特殊字符,从第二位开始截取作为店铺名。

3.将原价中的"¥"替换成"",并将该字符转换成数值型。

4.将标题中含'手机壳|眼镜|洗手机|sim|蓝牙|播放器|飞行器|发动机|数据恢复|换屏|手表|手环|维修|电视|家用|自信|监控|音响|热水器|打印机|扳手|通用|电脑|手链|音箱|监测仪|男|定位|服装|神器|基因|吉它|话筒|女|大疆|头戴|洗碗机'这些字符的记录剔除掉。

5.将以上步骤处理后的结果去重。

经过数据清洗,总共得到337条有效数据。

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

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

相关文章

Python | Leetcode Python题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution:def exist(self, board: List[List[str]], word: str) -> bool:def dfs(i, j, k):if not 0 < i < len(board) or not 0 < j < len(board[0]) or board[i][j] ! word[k]: return Falseif k len(word) - 1: r…

Linux线程(一)初识线程

目录 一、什么是线程 二、线程和进程的区别 三、线程的操作 1、创建线程 2、获取线程ID 3、线程的终止与等待 4、线程分离 一、什么是线程 在Linux中&#xff0c;线程&#xff08;thread&#xff09;是一种轻量级进程&#xff08;Light-weight Process, LWP&#xff09…

五一超级课堂---Llama3-Tutorial(Llama 3 超级课堂)---第一节 Llama 3 本地 Web Demo 部署

课程文档&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a; https://space.bilibili.com/3546636263360696/channel/collectiondetail?sid2892740&spm_id_from333.788.0.0 操作平台&#xff1a; https://studio.intern-ai.org.cn/consol…

全面解析C++11与C++20线程(含内容)

昨晚跟一些小伙伴做了第一次直播尝试&#xff0c;一起探讨了C11 thread与 C20的jthread&#xff0c;于此同时给大家出了几个问题&#xff0c;在直播之外不会公布答案&#xff0c;所以以后直播还是得跟着走起。 总共有22人参加直播&#xff0c;氛围相当不错&#xff0c;没有录播…

Linux 无名信号量(Semaphore)的使用

目录 一、无名信号量的概念二、无名信号量相关函数三、信号量的使用步骤四、应用场景五、测试代码 一、无名信号量的概念 Linux无名信号量&#xff08;Semaphore&#xff09;   在Linux操作系统中&#xff0c;信号量&#xff08;Semaphore&#xff09;是一种用于进程间或线程…

sqlite3命令行工具无法退出问题处理

一、背景&#xff1a; 软件使用的后台数据库为sqlite&#xff0c;linux主机系统层面使用sqlite3命令行工具登录数据库后&#xff0c;无法执行sql脚本&#xff0c;无法退出sqlite3。无法执行ctrlc&#xff0c;执行ctrlz后sqlite3前台进程被中断&#xff0c;但是该进程没有退出。…

字节发布文生图模型PuLID:高效身份ID特征定制,单张图像克隆AI虚拟分身

前言 字节研究团队近日提出了一种新型的文生图身份ID定制方法PuLID(Pure and Lightning ID Customization)。相较于传统的微调方法&#xff0c;PuLID无需复杂的参数优化就可以实现高效的身份ID定制&#xff0c;且能最大程度减少对原始模型行为的干扰。 PuLID是通过将轻量级的…

docker学习-docker常用其他命令整理

随便写写&#xff0c;后面有空再更新 镜像命令&#xff0c;容器命令已在之前略有更新&#xff0c;这次不写&#xff0c; 一、后台启动命令 # 命令 docker run -d 容器名 # 例子 docker run -d centos # 启动centos&#xff0c;使用后台方式启动 # 问题&#xff1a; 使用doc…

Electron学习笔记(一)

文章目录 相关笔记笔记说明 一、轻松入门 1、搭建开发环境2、创建窗口界面3、调试主进程 二、主进程和渲染进程1、进程互访2、渲染进程访问主进程类型3、渲染进程访问主进程自定义内容4、渲染进程向主进程发送消息5、主进程向渲染进程发送消息6、多个窗口的渲染进程接收主进程发…

OSError: image file is truncated (36 bytes not processed)解决方案

错误原因&#xff1a; 图像文件被损坏 解决方案&#xff1a; 代码开头添加如下两行代码&#xff1a; from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES True

[华为OD] B卷 树状结构查询 200

题目&#xff1a; 通常使用多行的节点、父节点表示一棵树&#xff0c;比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点 输入描述 第一行输入行数&#xff0c;下面是多行数据&#xff0c;每行以空…

远程开机与远程唤醒BIOS设置

远程开机与远程唤醒BIOS设置 在现代计算机应用中&#xff0c;远程管理和控制已成为许多企业和个人的基本需求。其中&#xff0c;远程开机和远程唤醒是两项非常实用的功能。要实现这些功能&#xff0c;通常需要在计算机的BIOS中进行一些特定的设置。以下是对远程开机和远程唤醒…

《深入解析阿里电商:数据中台与业务的双中台系统架构》

阿里巴巴作为全球领先的电商巨头&#xff0c;其技术架构一直是业界关注的焦点。特别是阿里电商的双中台系统架构——数据中台和业务中台&#xff0c;这两个平台在提升数据处理效率和业务响应速度方面起到了至关重要的作用。本文将深入探讨这一架构的设计理念、核心组件及其在实…

Androidstudio报错

现象&#xff1a; org.gradle.api.plugins.UnknownPluginException: Plugin [id: ‘com.android.application‘ 解决 方案&#xff0c;看是不是工具处于离线环境&#xff0c;是的话打开联网就好

【新手指南】Android Studio中应用App的相关配置

前言&#xff1a; 注意这是一个对于Android开发入门学习者而言的一个教程&#xff0c;因为自己平时很少使用Android进行原生应用的开发&#xff0c;对于使用Android Studio配置Android App应用的一些参数&#xff08;如版本号&#xff0c;应用包名&#xff0c;应用图标&#x…

MySQL变量的声明与使用

MySQL变量的声明与使用 1、标识符不能以数字开头 2、自能使用_或$符号&#xff0c;不允许使用其他符号。 3、不允许使用系统关键字 将赋值与查询结合 set userName 刘德华; select userName: 刘青云; # 将赋值与查询结合 查询变量/使用变量 select userName as 读取到的u…

Python批量备份华为设备配置到FTP服务器

Excel表格存放交换机信息&#xff1a; 备份文件夹效果图&#xff1a; Windows系统配置计划任务定时执行python脚本&#xff1a; Program/script&#xff1a;C:\Python\python.exe Add arguments (optional)&#xff1a; D:\Python_PycharmProjects\JunLan_pythonProje…

[C/C++] -- DFS搜索迷宫路径

设计一个程序&#xff0c;能够对给定的迷宫进行路径搜索&#xff0c;并输出一条从起点到终点的路径。具体来说&#xff0c;程序需要实现以下功能&#xff1a; 接受用户输入的迷宫地图&#xff0c;包括迷宫的行数和列数&#xff0c;以及每个格子的状态&#xff08;0 表示可通行…

十四五”智慧城市:视频大数据汇聚系统2.0建设方案与特点分析

一、背景需求分析 随着科技的不断发展&#xff0c;智慧城市的建设已经成为城市发展的重要方向。视频汇聚系统作为智慧城市建设的重要组成部分&#xff0c;已经得到了广泛的应用和推广。视频汇聚系统是智慧城市中非常重要的组成部分&#xff0c;它利用摄像头和传感器技术来收集…

Python | Leetcode Python题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicates(self, nums: List[int]) -> int:idx, left, right 0, 0, 0while left < len(nums):nums[idx] nums[left]idx 1while right < len(nums) and nums[right] nums[left]:right 1if right - …