淘宝关键词页面爬取绘图进行数据分析

news2025/1/21 12:45:21

对爬虫、逆向感兴趣的同学可以查看文章,一对一小班V教学:https://blog.csdn.net/weixin_35770067/article/details/142514698

关键词页面爬取代码

from DrissionPage import WebPage, ChromiumOptions
from DataRecorder import Recorder
import time
import random

path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
ChromiumOptions().set_browser_path(path).save()


def random_sleep():
    """随机延时1-3秒"""
    time.sleep(random.uniform(3, 5))


def main(url, save_name):
    r = Recorder('{}.xlsx'.format(save_name))
    r.add_data(('url', '标题', '店铺名', '销量数', '价格', '地区'))
    page = WebPage()
    #page.timeout = 5
    page = WebPage(timeout=5)  # 初始化时设置超时为5秒
    page.set.retry_times(3)
    page.set.retry_interval(1)

    scroll_step = 1000
    max_scroll_times = 2 #这个数字表示你要爬取多少页数据
    print(f"开始访问: {url}")
    page.get(url)

    captured_urls = set()
    current_scroll_times = 0

    while current_scroll_times < max_scroll_times:
        print("爬取第{}页数据".format(current_scroll_times + 1))
        page_ = input("请点击翻页按钮,点击完成请输入yes:")
        if page_ == "yes":
            try:
                random_sleep()
                # 滚动页面
                page.run_js(f'window.scrollTo(0, document.body.scrollHeight)')
                random_sleep()

                items = page.eles('css:.tbpc-col')
                print(f"本次找到 {len(items)} 个商品")

                for item in items:
                    try:
                        info = {
                            'url': item('tag:a').link,
                            'title': item('css:.title--qJ7Xg_90').text,
                            'shop': item('css:.shopNameText--DmtlsDKm').text,
                            'sales': item('css:.realSales--XZJiepmt').text,
                            'price': item('css:.priceInt--yqqZMJ5a').text,
                            'location': item('css:.procity--wlcT2xH9').text
                        }

                        if info['url'] not in captured_urls:
                            captured_urls.add(info['url'])
                            r.add_data((
                                info['url'],
                                info['title'],
                                info.get('shop', '未知店铺'),
                                info.get('sales', '0'),
                                info.get('price', '价格未知'),
                                info.get('location', '地区未知')
                            ))
                            print(f"已添加商品: {info['title']}")
                    except Exception as e:
                        print(f"处理商品数据时出错: {e}")
                        continue

                current_scroll_times += 1
                print(f"已完成第 {current_scroll_times} 次滚动")

                # 每5次滚动保存一次
                if current_scroll_times % 5 == 0:
                    r.record()
                    print(f"已保存 {len(captured_urls)} 条数据")

                if len(items) == 0:
                    print("未找到新商品,准备退出")
                    break

            except Exception as e:
                print(f"页面处理出错: {e}")
                continue
    r.record()
    print(f"总共抓取商品数量: {len(captured_urls)}")


if __name__ == '__main__':
    # 淘宝关键词搜索页面
    url = 'https://s.taobao.com/search?q=%E6%89%8B%E6%9C%BA%E7%83%AD%E9%94%80%E6%A6%9C&tab=all'
    save_name = 'phone'
    try:
        main(url,save_name)
    except Exception as e:
        print(f"程序出错: {e}")
    finally:
        print("程序结束")

数据分析代码

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体,避免显示乱码
font = FontProperties(fname=r'C:\Windows\Fonts\SimHei.ttf')
plt.rcParams['axes.unicode_minus'] = False
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 10000)
pd.set_option('display.max_colwidth', 10000)
pd.set_option('display.max_rows', None)


def extract_sales_number(text):
    """从销量文本中提取数字,处理类似'3000+人付款'的格式"""
    if pd.isna(text):
        return 0
    # 移除'+'号和'人付款'字样,只保留数字
    number = str(text).replace('+', '').replace('人付款', '')
    try:
        return int(number)
    except:
        return 0


def analyze_data():
    # 读取Excel文件,跳过前3行
    df = pd.read_excel('手机.xlsx', skiprows=3)

    # 设置列名
    df.columns = ['url', '标题', '店铺名', '销量数', '价格', '地区']

    # 数据清洗
    # 处理销量数据
    df['销量数'] = df['销量数'].apply(extract_sales_number)

    # 处理价格数据
    df['价格'] = pd.to_numeric(df['价格'], errors='coerce')

    # 移除无效数据
    df = df[df['价格'] > 0]
    df = df[df['销量数'] > 0]

    # 1. 价格与销量的关系(柱状图)
    plt.figure(figsize=(15, 8))
    price_bins = [0, 1000, 2000, 3000, 4000, 5000, float('inf')]
    price_labels = ['0-1000', '1000-2000', '2000-3000', '3000-4000', '4000-5000', '5000+']
    df['价格区间'] = pd.cut(df['价格'], bins=price_bins, labels=price_labels)

    price_sales = df.groupby('价格区间')['销量数'].mean()

    plt.bar(price_sales.index, price_sales.values, alpha=0.6, color='skyblue')
    plt.title('手机价格区间与平均销量关系图', fontproperties=font, fontsize=14)
    plt.xlabel('价格区间(元)', fontproperties=font)
    plt.ylabel('平均销量(件)', fontproperties=font)
    plt.xticks(rotation=45, fontproperties=font)
    plt.grid(True, linestyle='--', alpha=0.3)

    # 添加数值标签
    for i, v in enumerate(price_sales.values):
        plt.text(i, v, f'{float(v)}', ha='center', va='bottom', fontproperties=font)

    plt.tight_layout()
    plt.savefig('价格销量关系图.png')
    plt.close()

    # 2. 价格与地区的关系(折线图)
    region_price = df.groupby('地区')['价格'].mean().sort_values(ascending=False)

    plt.figure(figsize=(15, 8))
    plt.plot(region_price.index, region_price.values, marker='o', linewidth=2, markersize=8, color='orange')
    plt.title('各地区手机平均价格对比', fontproperties=font, fontsize=14)
    plt.xlabel('地区', fontproperties=font)
    plt.ylabel('平均价格(元)', fontproperties=font)
    plt.xticks(rotation=45, fontproperties=font)
    plt.grid(True, linestyle='--', alpha=0.7)

    # 添加数值标签
    for i, v in enumerate(region_price.values):
        plt.text(i, v, f'{int(v)}元', ha='center', va='bottom', fontproperties=font)

    plt.tight_layout()
    plt.savefig('地区价格关系图.png')
    plt.close()

    # 输出统计信息
    print("\n=== 数据统计信息 ===")
    print(f"\n总商品数量:{len(df)}个")

    print(f"\n价格统计:")
    price_stats = df['价格'].describe()
    print(f"平均价格:{price_stats['mean']:.2f}元")
    print(f"最高价格:{price_stats['max']:.2f}元")
    print(f"最低价格:{price_stats['min']:.2f}元")

    print(f"\n销量统计:")
    sales_stats = df['销量数'].describe()
    print(f"平均销量:{sales_stats['mean']:.2f}件")
    print(f"最高销量:{int(sales_stats['max'])}件")
    print(f"最低销量:{int(sales_stats['min'])}件")

    print(f"\n各地区平均价格:")
    for region, price in region_price.items():
        print(f"{region}: {price:.2f}元")

    print(f"\n各价格区间的平均销量:")
    for interval, sales in price_sales.items():
        print(f"{interval}: {float(sales)}件")


if __name__ == '__main__':
    try:
        analyze_data()
        print("\n数据分析完成!图表已保存。")
    except Exception as e:
        print(f"数据分析过程中出错: {e}")
        import traceback

        print(traceback.format_exc())

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

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

相关文章

Linux:进程概念详解

进程详解 一、冯诺依曼计算机体系&#xff08;一&#xff09;体系概念&#xff08;二&#xff09;计算机之间的数据传输 二、操作系统&#xff08;一&#xff09;操作系统设计的意义&#xff08;二&#xff09;操作系统的管理功能&#xff08;三&#xff09;系统调用的实质 三、…

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

STM32之CubeMX图形化工具开发介绍(十七)

STM32F407 系列文章 - STM32CubeMX&#xff08;十七&#xff09; 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体&#xf…

top命令返回值有异常问题解决

异常问题&#xff1a;load average值不正常 排查思路&#xff1a; 1.找到是哪个进程引起的异常&#xff0c;看看是否有cpu占用过高或者mem占用过高的进程 再根据具体情况分析原因。 定位到异常进程后&#xff0c;首先打堆栈&#xff0c;留存现场日志&#xff0c;然后停止进…

sqlfather笔记

这里简单记录写学习鱼皮sqlfather项目的笔记&#xff0c;以供以后学习。 运行 将前后端项目clone到本地后&#xff0c;修改对应配置文件运行项目。 后端 1.配置好mysql后运行这个sql文件建立对应的表。 2.修改数据库密码 3.修改完后运行启动类即可 4. 启动结果 5.查看A…

【Axure高保真原型】数字滚动效果

今天和大家分享数字滚动效果的原型摸吧原型模板&#xff0c;效果包括&#xff1a; 在输入框输入目标数值后&#xff0c;点击滚动按钮&#xff0c;下方数字自动滚动到对应的数值&#xff1b; 在输入框输入初始数值后&#xff0c;点击设置初始值按钮&#xff0c;可以设置下方数字…

“AI人工智能内容辅助创作平台:让创意不再“卡壳”

在如今这个信息爆炸的时代&#xff0c;内容创作成了每个人的“必修课”。无论是自媒体大V、文案策划&#xff0c;还是普通学生写作文&#xff0c;大家都会遇到一个让人抓狂的问题——“创意枯竭”。有时候&#xff0c;脑袋里空空如也&#xff0c;一个字都写不出来&#xff0c;那…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

搜索功能实现

前言 主要实现思路是全局监听点击事件的点击范围是否包含搜索结果内容。 效果 上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件&#xff0c;自动检测两个PDF文件之间的差异&#xff0c;并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分&#xff0c;帮助用户快速定位…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

TL3562/3568移植无锡沐创N500L-AM4驱动进内核源码,报错及其解决方案

前言 创龙官方提供的资料无锡沐创N500L-AM4驱动是rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz&#xff1b;无锡沐创官方&#xff0c;截止目前&#xff0c;最新驱动是rnpgbe-0.2.3-f26b9a4.tar.gz。考虑到开发的稳妥性&#xff0c;先选用创龙尝试过的rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz来移…

CycleGAN - CycleGAN网络:无监督图像到图像转换的生成对抗网络

1. 背景与问题 在图像到图像转换任务中&#xff0c;传统的生成对抗网络&#xff08;GANs&#xff09;依赖于成对的训练数据来进行监督学习。然而&#xff0c;获得大量成对标注数据通常是昂贵且耗时的。在许多应用中&#xff0c;真实世界的标注数据往往是稀缺的&#xff0c;因此…

空间解析几何8:空间线段与圆锥侧面的最短距离【附MATLAB代码】

理论推导 matlab代码 function [dmin] distanceConeToLine (A1,B1,A2,B2,R) dmin 100000000; h norm(A2-B2); A B1(1)-A1(1); if(abs(A)<1e-2)A 1e-2; end B B1(2)-A1(2); if(abs(B)<1e-2)B 1e-2; end C B1(3)-A1(3); F A1(1)*CA*h-A1(3)*A; G A1(2)*CB*h-A1(…

K8S 集群搭建和访问 Kubernetes 仪表板(Dashboard)

一、环境准备 服务器要求&#xff1a; 最小硬件配置&#xff1a;2核CPU、4G内存、30G硬盘。 服务器可以访问外网。 软件环境&#xff1a; 操作系统&#xff1a;Anolis OS 7.9 Docker&#xff1a;19.03.9版本 Kubernetes&#xff1a;v1.18.0版本 内核版本&#xff1a;5.4.203-…

2024:成长、创作与平衡的年度全景回顾

文章目录 1.前言2.突破自我&#xff1a;2024年个人成长与关键突破3.创作历程&#xff1a;从构想到落笔&#xff0c;2024年的文字旅程4.生活与学业的双重奏&#xff1a;如何平衡博客事业与个人生活5.每一步都是前行&#xff1a;2024年度的挑战与收获6.总结 1.前言 回首2024年&a…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

C++:输入3个整数,利用指针和函数,按由小到大的顺序输出。

输出样例如图所示&#xff1a; 代码如图&#xff1a; #include<iostream> using namespace std;void exchange(int* x, int* y){int temp;temp *x;*x *y;*y temp; }int main(){int a 0, b 0, c 0;int* p1 &a, * p2 &b, * p3 &c;cout << &quo…