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

对爬虫、逆向感兴趣的同学可以查看文章,一对一小班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.rhkb.cn/news/4868.html

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

相关文章

大数据学习(37)- Flink运行时架构

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

记一次数据库连接 bug

整个的报错如下&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Metho…

AI 编程工具—Cursor AI 对话模式详解 内嵌对话模式

AI 编程工具—Cursor AI 对话模式详解 内嵌对话模式 前面我们已经学习了Cursor 的两种工作模式,也就是Chat、Composer 更多细节可以看之前的文章 Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式 这一节我们按一下最后一种模式,也就是内嵌对话模式 内嵌对话模式…

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…

Face2face:非深度学习时代如何进行实时的三维人脸重建

本文主要基于开源项目Face2face[1]&#xff08;中间会提及到face3d[2]和eos[3]&#xff09;&#xff0c;对采用传统优化方法从二维图片拟合3DMM的三维人脸重建算法整体流程做一个介绍。由于项目作者没有给出参考文献&#xff0c;笔者是从代码推论出来的整个算法&#xff0c;如有…

单片机基础模块学习——定时器

1.利用stc-isp生成代码 选择定时器计算器&#xff0c;将频率改为12mhz,单位为毫秒&#xff0c;定时长度为1 复制下面代码 void Timer0Init(void) //1毫秒12.000MHz {AUXR | 0x80; //定时器时钟1T模式TMOD & 0xF0; //设置定时器模式TL0 0x20; //设置定时初值TH0 0xD…

《Linux服务与安全管理》| 邮件服务器安装和配置

《Linux服务与安全管理》| 邮件服务器安装和配置 目录 《Linux服务与安全管理》| 邮件服务器安装和配置 1.在Server01上安装dns、postfix、dovecot和telnet&#xff0c;并启动 2&#xff0e;在Server01上配置DNS服务器&#xff0c;设置MX资源记录 3&#xff0e;在server1上…

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

Git下载安装

目录 Win下载安装 Mac下载安装 Git忽略文件IdeaWebstorm 缓冲区大小问题 Win 下载 官网&#xff1a;https://git-scm.com/ 安装 下载完成后得到安装文件直接双击安装 第一步&#xff1a;使用许可声明 第二步&#xff1a;选择安装目录 第三步&#xff1a;选择安装组件 …

2024 年度学习总结

目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…

STM32补充——FLASH

目录 1.内部FLASH构成&#xff08;F1&#xff09; 2.FLASH读写过程&#xff08;F1&#xff09; 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器&#xff08;写入 & 擦除相关&#xff09; 3.FLASH相关HAL库函数简介&#xff08;F1/F4/F7/H7&#xff09; 4.编程实战 …

PyTorch使用教程(8)-一文了解torchvision

一、什么是torchvision torchvision提供了丰富的功能&#xff0c;主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集&#xff0c;如ImageNet、CIFAR-10、MNIST等&#xff0c;方便开发者进行训练和评估。模型模块封装了大量经…

python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;还学习了一种自适应处理方法&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学o…

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1&#xff0c;世界坐标系 从这个世界&#xff08;world&#xff09;的视角来看物体 世界坐标系是3D空间坐标&#xff0c;每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2&#xff0c;相机坐标系 相机本身具有一个坐标系&…

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合&#xff0c;它继承自IEnumerable但具有一些关键的区别&#xff0c;使得它在处理数据库查询时非常有用&#xff0c;普通集…

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

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

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…

gitlab使用多数据库

1. 说明 默认情况下&#xff0c;GitLab 使用一个单一的应用数据库&#xff0c;称为主数据库。为了扩展 GitLab&#xff0c;您可以将 GitLab 配置为使用多个应用数据库。 设置多个数据库后&#xff0c;GitLab 将使用第二个应用数据库用于 CI/CD 功能&#xff0c;称为 CI 数据库…

【博客之星2024】技术创作与成长的全景回顾与突破 —— “千里之行,始于足下“

《热爱生命》 汪国真 我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 我不去想能否赢得爱情 既然钟情于玫瑰 就勇敢地吐露真诚 我不去想身后会不会袭来寒风冷雨 既然目标是地平线 留给世界的只能是背影 我不去想未来是平坦还是泥泞 只要热爱生命 一切&#xff0c;都在意料…

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…