Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】

Python爬取天猫商品数据详细教程

一、前期准备

1. 环境配置

  • Python环境:确保已安装Python 3.x版本,建议使用Anaconda或直接从Python官网下载安装。
  • 第三方库
    • requests:用于发送HTTP请求。
    • BeautifulSoup:用于解析HTML内容。
    • lxml:作为BeautifulSoup的解析器,提高解析效率。
    • selenium(可选):用于处理动态加载的内容。
    • pandas(可选):用于数据处理和存储。

安装命令:

pip install requests beautifulsoup4 lxml selenium pandas
2. 了解天猫的反爬机制

天猫等电商平台通常有完善的反爬虫机制,包括但不限于:

  • User-Agent检测:检查请求头中的User-Agent字段。
  • IP限制:频繁请求可能导致IP被封禁。
  • 验证码:部分操作可能需要输入验证码。
  • 动态加载:部分内容通过JavaScript动态加载。

二、爬取天猫商品数据的基本步骤

1. 分析目标页面

  • 打开天猫商品页面:在浏览器中打开天猫商品详情页,右键选择“检查”或按F12打开开发者工具。
  • 查看网络请求:在开发者工具的“Network”选项卡中,刷新页面,查看请求的URL和响应内容。
  • 定位数据:找到包含商品信息的HTML元素,记录其标签名、类名或ID。

2. 发送HTTP请求

使用requests库发送HTTP请求,获取页面内容。

import requestsurl = 'https://detail.tmall.com/item.htm?id=商品ID'  # 替换为实际的商品ID
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}response = requests.get(url, headers=headers)
if response.status_code == 200:html_content = response.text
else:print(f"请求失败,状态码:{response.status_code}")
3. 解析HTML内容

使用BeautifulSoup解析HTML内容,提取商品信息。

import requestsurl = 'https://detail.tmall.com/item.htm?id=商品ID'  # 替换为实际的商品ID
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}response = requests.get(url, headers=headers)
if response.status_code == 200:html_content = response.text
else:print(f"请求失败,状态码:{response.status_code}")


4. 处理动态加载的内容(可选)

如果商品信息是通过JavaScript动态加载的,可以使用selenium模拟浏览器行为。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 配置ChromeDriver路径
driver_path = 'path/to/chromedriver'  # 替换为实际的ChromeDriver路径
driver = webdriver.Chrome(executable_path=driver_path)driver.get(url)
time.sleep(5)  # 等待页面加载完成# 提取动态加载的内容(示例:提取商品标题)
title_element = driver.find_element(By.CSS_SELECTOR, 'span.J_TSearch_Title')
title = title_element.text.strip()print(f"商品标题:{title}")# 关闭浏览器
driver.quit()


5. 存储数据

将爬取的数据保存到本地文件或数据库中。

保存到CSV文件
import pandas as pddata = {'商品标题': [title],'商品价格': [price],'商品销量': [sales]
}df = pd.DataFrame(data)
df.to_csv('tmall_products.csv', index=False, encoding='utf-8-sig')

保存到数据库(以MySQL为例)
import pymysql# 连接数据库
conn = pymysql.connect(host='localhost',user='username',password='password',database='database_name',charset='utf8mb4'
)cursor = conn.cursor()# 创建表(如果不存在)
cursor.execute('''
CREATE TABLE IF NOT EXISTS tmall_products (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255),price VARCHAR(50),sales VARCHAR(50)
)
''')# 插入数据
sql = '''
INSERT INTO tmall_products (title, price, sales)
VALUES (%s, %s, %s)
'''
cursor.execute(sql, (title, price, sales))# 提交事务
conn.commit()# 关闭连接
cursor.close()
conn.close()

三、高级技巧与注意事项

1. 处理分页

如果需要爬取多页商品数据,可以分析分页URL的规律,通过循环实现。

base_url = 'https://list.tmall.com/search_product.htm?q=关键词&s='  # 替换为实际的搜索关键词for page in range(0, 100, 44):  # 每页44个商品,假设爬取前3页url = f"{base_url}{page}"response = requests.get(url, headers=headers)if response.status_code == 200:html_content = response.textsoup = BeautifulSoup(html_content, 'lxml')# 提取当前页的商品信息(示例:提取商品标题)product_tags = soup.find_all('div', class_='product')for product in product_tags:title_tag = product.find('a', class_='product-title')if title_tag:title = title_tag.get_text().strip()print(f"商品标题:{title}")
2. 使用代理IP

为了避免IP被封禁,可以使用代理IP。

proxies = {'http': 'http://your_proxy_ip:port','https': 'https://your_proxy_ip:port'
}response = requests.get(url, headers=headers, proxies=proxies)
3. 遵守法律法规和网站规则
  • 遵守robots.txt协议:在爬取前,检查目标网站的robots.txt文件,确保爬取行为符合网站规定。
  • 合理设置请求间隔:避免频繁请求,给服务器造成过大压力。
  • 不侵犯隐私:确保爬取的数据不涉及用户隐私。

4. 异常处理

在实际应用中,应添加异常处理机制,以应对网络请求失败、HTML结构变化等情况。

try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()  # 如果响应状态码不是200,抛出HTTPError异常html_content = response.textsoup = BeautifulSoup(html_content, 'lxml')# 提取商品信息...except requests.exceptions.RequestException as e:print(f"请求发生错误:{e}")
except Exception as e:print(f"发生未知错误:{e}")
四、完整代码示例
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import randomdef crawl_tmall_product(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()html_content = response.textsoup = BeautifulSoup(html_content, 'lxml')# 提取商品标题title_tag = soup.find('span', class_='J_TSearch_Title')title = title_tag.get_text().strip() if title_tag else '未找到商品标题'# 提取商品价格price_tag = soup.find('span', class_='tm-price')price = price_tag.get_text().strip() if price_tag else '未找到商品价格'# 提取商品销量(以月销为例)sales_tag = soup.find('div', class_='tm-detail-hd-sale')sales = sales_tag.find('span').get_text().strip().replace('月销', '') if sales_tag else '未找到商品销量'return {'商品标题': title,'商品价格': price,'商品销量': sales}except requests.exceptions.RequestException as e:print(f"请求发生错误:{e}")return Noneexcept Exception as e:print(f"发生未知错误:{e}")return Nonedef main():# 示例:爬取单个商品product_url = 'https://detail.tmall.com/item.htm?id=商品ID'  # 替换为实际的商品IDproduct_data = crawl_tmall_product(product_url)if product_data:print(f"商品标题:{product_data['商品标题']}")print(f"商品价格:{product_data['商品价格']}")print(f"商品销量:{product_data['商品销量']}")# 保存到CSV文件data = [product_data]df = pd.DataFrame(data)df.to_csv('tmall_products.csv', index=False, encoding='utf-8-sig')print("数据已保存到tmall_products.csv")if __name__ == '__main__':main()
五、总结

通过以上步骤,你可以使用Python爬取天猫商品数据。在实际应用中,需要根据目标网站的具体情况调整代码,并注意遵守相关法律法规和网站规则。希望本教程对你有所帮助!

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

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

相关文章

Symbol as Points: Panoptic Symbol Spotting via Point-based Representation

文章目录 AbstractIntroductionRelated WorkVector Graphics RecognitionPanoptic Symbol SpottingPoint Cloud Segmentation MethodFrom Symbol to PointsPrimitive positionPrimitive feature Panoptic Symbol Spotting via Point-based RepresentationBackboneSymbol Spotti…

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…

[闭源saas选项]Pinecone:为向量数据库而生的实时语义搜索引擎

目录 Pinecone:为向量数据库而生的实时语义搜索引擎 一、什么是 Pinecone? 二、Pinecone 是开源的吗?支持私有化部署吗? 三、为什么需要向量搜索? 四、Pinecone 的核心优势 五、使用 Pinecone 的典型流程 六、在…

【Maniskill】使用Ppo的官方基线训练时出现指标突然“塌陷”的现象

1. 问题描述 1.1 在使用官方代码进行训练的时候“success_once突然掉落到0” 简要说明你在使用官方 examples/baselines/ppo/baselines.sh 脚本训练 PickCube-v1 时,在 early stage(如前 50 k 步)指标正常、success_once 接近 1,…

本地部署大模型实战:使用AIStarter一键安装Ollama+OpenWeb教程(含最新版本更新指南)

大家好!今天给大家带来一个本地部署大模型的详细教程 ,主要介绍如何通过 AIStarter 4.0 一键部署 Ollama OpenWeb 的完整流程。如果你还在为在线大模型不稳定、隐私泄露等问题烦恼,那么本地部署 将是一个非常不错的选择! 首先&am…

Redis大量key集中过期怎么办

当 Redis 中存在大量 key 在同一时间点集中过期时,可能会导致以下问题: 请求延迟增加:Redis 在处理过期 key 时需要消耗 CPU 资源,如果过期 key 数量庞大,会导致 Redis 实例的 CPU 占用率升高,进而影响其他…

【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)

目录 回顾进程优先级与进程调度的引入 内核runqueue图例 关于queue[140]前100个位置 | 实时进程与分时进程 遍历需要调度的进程与bitmap的引入 active、expired指针 结语 回顾进程优先级与进程调度的引入 在我们之前的学习中,我们是有学习过进程优先级这个概…

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API

Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…

微信小程序开发一个自定义组件的详细教程

以下是一个微信小程序自定义组件的详细教程,覆盖开发文档中的核心知识点。我们将以一个包含属性、事件、插槽、生命周期等功能的按钮组件为例进行说明: 一、创建组件 在 components 目录下新建 custom-button 文件夹,包含以下文件&#xff…

模电——第四讲场效应管

定义:具有正向受控作用的半导体器件 分类:MOS(绝缘栅)场效应管和结性场效应管 区别:场效应管相比于晶体管,输入电阻很大,是单极型器件 MOS场效应管: 特性曲线 利用半导体表面的电…

[蓝桥杯]堆的计数

堆的计数 题目描述 我们知道包含 NN 个元素的堆可以看成是一棵包含 NN 个节点的完全二叉树。 每个节点有一个权值。对于小根堆来说,父节点的权值一定小于其子节点的权值。 假设 NN 个节点的权值分别是 1~NN,你能求出一共有多少种不同的小根堆吗&…

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…

WebRTC中的几个Rtp*Sender

一、问题: webrtc当中有几个比较相似的类,看着都是发送RTP数据包的,分别是:RtpPacketToSend 和RtpSenderVideo还有RtpVideoSender以及RTPSender,这说明什么呢?首先,说明我会很多连词&#xff0…

EFI(x64)简易开发环境

文章目录 1 必须文件2 运行环境3 构建应用 (Visual Studio)4 引用 EDK2 头文件 1 必须文件 EDK2: 可以只拉取仓库本身, 不拉取其子仓库(完整构建才需要) qemu: qemu 以源码发布, QEMU for Windows – Installers (64 bit) 这里有民间构建的安装包 2 运行环境 创建一个 root …

八皇后问题深度解析

八皇后问题深度解析 一、八皇后问题的起源与背景1.1 问题起源1.2 历史发展 二、问题描述与约束条件2.1 问题描述2.2 约束条件 三、算法原理:回溯算法3.1 回溯算法概述3.2 八皇后问题的回溯算法实现思路 四、八皇后问题的多语言实现4.1 Python实现4.2 C实现4.3 Java实…

Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束前言项目简介技术栈…

Java中的阻塞队列

阻塞队列是什么? 一、阻塞队列的核心概念与特性 1.1 阻塞队列是什么? 简单来说,阻塞队列是一种特殊的队列,它具备普通队列先进先出(FIFO)的特性,同时还支持两个额外的重要操作: 当…

v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统

v1.0.1版本更新2025年5月22日发布-优雅草星云物联网AI智控系统 开源地址 星云智控官网: 优雅草星云物联网AI智控软件-移动端vue: 优雅草星云物联网AI智控软件-移动端vue 星云智控PC端开源: 优雅草星云物联网AI智控软件-PC端vue: 优雅草星云物联网AI…

Java-IO流之转换流详解

Java-IO流之转换流详解 一、转换流概述1.1 什么是转换流1.2 转换流的作用1.3 转换流的位置 二、InputStreamReader详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例:读取不同编码的文件 三、OutputStreamWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使…

android lifeCycleOwner生命周期

一 Fragment中 viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) 什么时候执行? 让我分析一下相关问题: 关于 onPause 时的数据更新: viewLifecycleOwner.lifecycleScope.launch {viewLifecycleOwner.repeatOnLifecycle(Lifecycle.Sta…