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
繁體地址,請注明出處:http://hk.pswp.cn/news/908268.shtml
英文地址,請注明出處:http://en.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…