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

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

关键词页面爬取代码

from DrissionPage import WebPage, ChromiumOptions
from DataRecorder import Recorder
import time
import randompath = 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 = 5page = WebPage(timeout=5)  # 初始化时设置超时为5秒page.set.retry_times(3)page.set.retry_interval(1)scroll_step = 1000max_scroll_times = 2 #这个数字表示你要爬取多少页数据print(f"开始访问: {url}")page.get(url)captured_urls = set()current_scroll_times = 0while 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}")continuecurrent_scroll_times += 1print(f"已完成第 {current_scroll_times} 次滚动")# 每5次滚动保存一次if current_scroll_times % 5 == 0:r.record()print(f"已保存 {len(captured_urls)} 条数据")if len(items) == 0:print("未找到新商品,准备退出")breakexcept Exception as e:print(f"页面处理出错: {e}")continuer.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 0def 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 tracebackprint(traceback.format_exc())

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

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

相关文章

uniapp中h5的微应用解决办法

考虑过用wujie&#xff0c;参考官网Vue组件封装 | 无界的教程&#xff0c;虽然没报错&#xff0c;但是子应用的vue节点根本没挂载上&#xff0c;不知道什么原因&#xff0c;如下图所示 后面采用iframe方式将子应用导入进来&#xff1a; 父应用&#xff1a; <template>&…

数据分析及应用:经营分析中的综合指标解析与应用

目录 1. 市场份额(Market Share) 2. 客户获取成本(Customer Acquisition Cost, CAC) 3. 客户生命周期价值(Customer Lifetime Value, CLV) 4. 客户留存率(Customer Retention Rate, CRR) 5. 净推荐值(Net Promoter Score, NPS) 6. 转化率(Conversion Rate) …

【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活

&#x1f4ac; 欢迎讨论&#xff1a;如对文章内容有疑问或见解&#xff0c;欢迎在评论区留言&#xff0c;我需要您的帮助&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果这篇文章对您有所帮助&#xff0c;请不吝点赞、收藏或分享&#xff0c;谢谢您的支持&#x…

JAVA-Exploit编写(7)--http-request库文件上传使用续篇

目录 1.http-request简介 2. 依赖导入 3.靶场实战 3.1 简单使用 3.2 增加判断机制 3.3 文件上传成功后的利用 3.4 正则匹配上传文件的返回的路径 1.http-request简介 http-request 是一个库 里面提供很多方法&#xff0c;使得很容易就可以构造http请求,相比于之前使用的…

抖音小程序一键获取手机号

前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…

NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D

在全球拥有近100家工厂的舍弗勒&#xff0c;从2016年开启数字化运营进程&#xff0c;而当前制造、库存、劳动力和物流的数字化&#xff0c;已无法支持其进一步简化工作流程&#xff0c;亟需数字化物理制造环境&#xff0c;打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…

2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望

目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …

[Qt] Box Model | 控件样式 | 实现log_in界面

目录 1、样式属性 &#xff08;1&#xff09;盒模型&#xff08;Box Model&#xff09; 2、控件样式示例 &#xff08;1&#xff09;按钮 &#xff08;2&#xff09;复选框 &#xff08;3&#xff09;单选框 &#xff08;4&#xff09;输入框 &#xff08;5&#xff09…

Golang Gin系列-6:Gin 高级路由及URL参数

在本章中&#xff0c;我们将深入研究使用Gin框架的高级路由和URL参数。我们将介绍如何创建和使用路由组、应用中间件、提取路径参数、处理查询字符串、处理静态文件以及使用HTML模板。 路由分组 为什么要使用路由组&#xff1f; 使用路由组有助于保持代码结构整洁有序。当路由…

【2025】拥抱未来 砥砺前行

2024是怎样的一年 2024在历史画卷上是波澜壮阔的一年&#xff0c;人工智能的浪潮来临&#xff0c;涌现出无数国产大模型。 22年11月ChatGPT发布&#xff0c;它的出现如同在平静湖面上投下一颗巨石&#xff0c;激起了层层波澜&#xff0c;短短五天用户数就达到了100万&#xff0…

FreeRTOS系统移植

前言 学习RTOS之前最重要的就是要学会将系统移植到单片机中&#xff0c;这里可以直接使用cubemx生成移植好的工程&#xff0c;也可以下载库来进行自己移植&#xff0c;这里我选择下载库来自己移植&#xff0c;因为这样可以配合Linux开发stm32单片机程序。 一、下载系统代码 …

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一个整体。MySQL提供一种机制&#xff0c;保证我们…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

arkime安装

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置&#xff0c;覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码&#xff0c;可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRe…

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识&#xff1a; 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…

自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving

1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…

BGP分解实验·9——路由聚合与条件性通告(1)

路由聚合是有效控制缩减BGP路由表的方法之一&#xff0c;路由聚合的前提和IGP一样&#xff0c;需要有路由目标存在BGP表中&#xff0c;与IGP不同的是&#xff0c;BGP路由聚合可以定义按需抑制路由的能力。 实验拓扑如下所示&#xff1a; 现在开始把从R1的R5的基础配置先准备好…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…