京東關(guān)鍵詞搜索商品列表 Python 爬蟲實戰(zhàn)
你想要實現(xiàn)京東關(guān)鍵詞搜索商品的爬蟲,我會從合規(guī)聲明、環(huán)境準備、頁面分析、代碼實現(xiàn)、反爬優(yōu)化五個方面展開,幫助你完成實戰(zhàn)項目。
一、前置聲明(重要?。?/p>
京東擁有商品數(shù)據(jù)的版權(quán),爬蟲僅可用于個人學(xué)習(xí)、研究,禁止用于商業(yè)用途、批量爬取造成京東服務(wù)器壓力。
遵守京東《用戶協(xié)議》和robots.txt協(xié)議(京東https://www.jd.com/robots.txt明確限制了部分爬蟲行為)。
本實戰(zhàn)僅演示基礎(chǔ)爬蟲思路,爬取頻率極低,避免對平臺造成影響。
二、環(huán)境準備
需要安裝 3 個核心 Python 庫,打開終端執(zhí)行以下命令:
bash
運行
pip install requests beautifulsoup4 fake-useragent
requests:發(fā)送 HTTP 網(wǎng)絡(luò)請求,獲取頁面數(shù)據(jù)。
beautifulsoup4:解析 HTML 頁面,提取目標(biāo)商品信息。
fake-useragent:生成隨機 User-Agent,規(guī)避簡單的反爬檢測。
三、京東搜索頁面分析
搜索 URL 構(gòu)造:打開京東官網(wǎng),搜索關(guān)鍵詞(例如 “Python 書籍”),觀察瀏覽器地址欄,得到搜索 URL 格式:
https://search.jd.com/Search?keyword=關(guān)鍵詞&enc=utf8&page=頁碼
keyword:需要搜索的商品關(guān)鍵詞(需 URL 編碼,requests會自動處理)。
page:商品列表頁碼(京東每頁展示 60 件商品,頁碼為 1、3、5... 奇數(shù)遞增,對應(yīng)第 1、2、3... 頁)。
商品標(biāo)簽定位:京東商品列表的核心 HTML 標(biāo)簽為
,每個該標(biāo)簽對應(yīng)一件商品,包含商品 ID、名稱、價格、鏈接、店鋪等信息。
價格特殊說明:京東商品價格采用動態(tài)加載(JS 渲染),直接爬取靜態(tài) HTML 無法獲取準確價格,需單獨請求價格接口或后續(xù)通過 JS 解析補充,本實戰(zhàn)先提取靜態(tài)頁面可獲取的核心信息,再補充價格接口優(yōu)化方案。
四、完整代碼實現(xiàn)(基礎(chǔ)版)
版本 1:基礎(chǔ)爬蟲(提取商品核心信息)
實現(xiàn)功能:指定關(guān)鍵詞,爬取第 1 頁商品的商品 ID、商品名稱、商品鏈接、店鋪名稱(價格后續(xù)優(yōu)化)。
python
運行
# 導(dǎo)入所需模塊
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import time
def get_jd_goods(keyword, page=1):
"""
爬取京東關(guān)鍵詞搜索商品列表
:param keyword: 搜索關(guān)鍵詞
:param page: 頁碼(默認第1頁)
:return: 商品信息列表
"""
# 1. 構(gòu)造請求參數(shù)
url = "https://search.jd.com/Search"
params = {
"keyword": keyword,
"enc": "utf8",
"page": page, # 京東頁碼為奇數(shù),1=第1頁,3=第2頁,以此類推
"wq": keyword # 補充參數(shù),提高請求成功率
}
# 2. 構(gòu)造請求頭(規(guī)避簡單反爬)
ua = UserAgent()
headers = {
"User-Agent": ua.random, # 隨機生成User-Agent
"Referer": "https://www.jd.com/", # 來源頁,模擬瀏覽器跳轉(zhuǎn)
"Accept-Language": "zh-CN,zh;q=0.9", # 接受語言
"Connection": "keep-alive"
}
try:
# 3. 發(fā)送GET請求(設(shè)置超時,避免卡死;禁止重定向,提高效率)
response = requests.get(
url=url,
params=params,
headers=headers,
timeout=15,
allow_redirects=False
)
response.raise_for_status() # 若請求狀態(tài)碼不是200,拋出異常
response.encoding = "utf-8" # 指定編碼,避免中文亂碼
# 4. 解析HTML頁面,提取商品信息
soup = BeautifulSoup(response.text, "lxml") # lxml解析器,高效快速
goods_list = [] # 存儲最終商品信息
# 定位所有商品標(biāo)簽
goods_items = soup.find_all("li", class_="gl-item")
for item in goods_items:
# 提取商品ID
goods_id = item.get("data-sku", "未知ID")
# 提取商品名稱
goods_name_tag = item.find("div", class_="p-name").find("em")
goods_name = goods_name_tag.get_text(strip=True) if goods_name_tag else "未知名稱"
# 提取商品鏈接
goods_href_tag = item.find("a", class_="p-img")
goods_href = "https:" + goods_href_tag.get("href", "") if goods_href_tag else "未知鏈接"
# 提取店鋪名稱
shop_name_tag = item.find("div", class_="p-shop").find("a")
shop_name = shop_name_tag.get_text(strip=True) if shop_name_tag else "未知店鋪"
# 組裝商品信息
goods_info = {
"商品ID": goods_id,
"商品名稱": goods_name,
"商品鏈接": goods_href,
"店鋪名稱": shop_name
}
goods_list.append(goods_info)
# 打印單條商品信息(實時查看進度)
print(f"已提取商品:{goods_name[:30]}...")
# 5. 模擬人類操作,添加延時(核心反爬手段之一)
time.sleep(2)
return goods_list
except requests.exceptions.RequestException as e:
print(f"請求失?。簕e}")
return []
def save_goods_to_txt(goods_list, keyword):
"""
將商品信息保存到本地TXT文件
:param goods_list: 商品信息列表
:param keyword: 搜索關(guān)鍵詞(用于文件名)
"""
if not goods_list:
print("無商品信息可保存")
return
filename = f"京東_{keyword}_商品列表.txt"
with open(filename, "w", encoding="utf-8") as f:
f.write(f"京東關(guān)鍵詞「{keyword}」商品搜索結(jié)果n")
f.write("-" * 100 + "n")
for index, goods in enumerate(goods_list, 1):
f.write(f"第{index}件商品n")
f.write(f"商品ID:{goods['商品ID']}n")
f.write(f"商品名稱:{goods['商品名稱']}n")
f.write(f"商品鏈接:{goods['商品鏈接']}n")
f.write(f"店鋪名稱:{goods['店鋪名稱']}n")
f.write("-" * 100 + "n")
print(f"商品信息已成功保存到:{filename}")
# 主函數(shù)調(diào)用
if __name__ == "__main__":
target_keyword = "Python書籍" # 自定義搜索關(guān)鍵詞
target_page = 1 # 自定義頁碼(奇數(shù))
# 爬取商品信息
jd_goods = get_jd_goods(keyword=target_keyword, page=target_page)
# 保存到本地
if jd_goods:
save_goods_to_txt(goods_list=jd_goods, keyword=target_keyword)
else:
print("未爬取到任何商品信息")
版本 2:優(yōu)化版(補充準確價格獲?。?/p>
由于京東靜態(tài)頁面價格為空,需單獨請求價格接口獲取準確價格,優(yōu)化后的核心代碼如下(僅修改價格提取部分):
python
運行
# 新增:獲取商品準確價格的函數(shù)
def get_goods_price(goods_id):
"""
調(diào)用京東價格接口,獲取商品準確價格
:param goods_id: 商品ID(data-sku)
:return: 商品價格
"""
price_url = f"https://p.3.cn/prices/mgets"
params = {
"skuIds": f"J_{goods_id}", # 價格接口需要J_前綴+商品ID
"type": "1"
}
headers = {
"User-Agent": UserAgent().random,
"Referer": "https://search.jd.com/"
}
try:
response = requests.get(price_url, params=params, headers=headers, timeout=10)
response.raise_for_status()
price_data = response.json()
return price_data[0].get("p", "未知價格") if price_data else "未知價格"
except Exception as e:
print(f"獲取商品{goods_id}價格失?。簕e}")
return "未知價格"
# 修改解析部分,添加價格獲取
# 在for item in goods_items: 循環(huán)中,添加:
goods_price = get_goods_price(goods_id)
# 然后在goods_info中補充:
"商品價格": f"{goods_price} 元"
五、反爬策略與注意事項
1. 核心反爬應(yīng)對措施
隨機 User-Agent:使用fake-useragent生成不同瀏覽器的 UA,避免固定 UA 被識別為爬蟲。
請求延時:通過time.sleep(2)添加 2 秒延時,模擬人類瀏覽節(jié)奏,避免高頻請求。
完整請求頭:補充Referer、Accept-Language等字段,讓請求更接近瀏覽器行為。
避免重定向:設(shè)置allow_redirects=False,防止被京東重定向到驗證頁面。
分頁爬取限制:若需爬取多頁,頁碼遞增間隔≥5 秒,且總頁數(shù)不超過 5 頁(僅用于學(xué)習(xí))。
2. 常見問題與解決方案
問題 1:中文亂碼。解決方案:指定response.encoding = "utf-8",保存文件時指定encoding="utf-8"。
問題 2:返回空商品列表。解決方案:檢查頁碼是否為奇數(shù)、請求頭是否完整、是否被京東限制(可更換關(guān)鍵詞或重啟網(wǎng)絡(luò))。
問題 3:價格接口返回空值。解決方案:增加價格接口請求延時、更換 UA,部分商品需登錄后才能獲取價格(進階需求可使用requests.Session()保持登錄狀態(tài))。
六、后續(xù)擴展方向
數(shù)據(jù)持久化:將商品信息保存到 CSV、Excel 或 MySQL 數(shù)據(jù)庫,方便后續(xù)分析。
多頁爬取:實現(xiàn)自動遍歷多頁(1、3、5...),批量獲取商品列表。
多線程 / 異步爬取:使用threading或aiohttp提高爬取效率(需嚴格控制并發(fā)量,避免反爬)。
商品詳情頁爬取:通過商品鏈接,進一步爬取商品參數(shù)、評價等信息。
反爬進階:處理京東的驗證碼、Cookie 驗證(可使用selenium模擬瀏覽器,但效率較低,僅用于學(xué)習(xí))。
總結(jié)
京東爬蟲核心是構(gòu)造合法請求、定位商品標(biāo)簽、規(guī)避反爬檢測,基礎(chǔ)版可滿足個人學(xué)習(xí)的信息提取需求。
動態(tài)加載的價格需單獨請求專用接口,這是電商平臺爬蟲的常見特點。
爬蟲的核心原則是 “低調(diào)”—— 低頻率、低并發(fā)、非商用,避免觸碰平臺紅線和法律邊界。
本實戰(zhàn)的代碼可直接運行,修改target_keyword即可爬取不同商品,運行后會在當(dāng)前目錄生成 TXT 格式的商品列表文件。
審核編輯 黃宇
-
API
+關(guān)注
關(guān)注
2文章
2375瀏覽量
66805 -
python
+關(guān)注
關(guān)注
57文章
4877瀏覽量
90071 -
京東
+關(guān)注
關(guān)注
2文章
1108瀏覽量
50087
發(fā)布評論請先 登錄
0基礎(chǔ)入門Python爬蟲實戰(zhàn)課
搜索關(guān)鍵詞獲取商品詳情接口的設(shè)計與實現(xiàn)
淺談京東關(guān)鍵詞
京東關(guān)鍵詞item_search-按關(guān)鍵字搜索京東商品
京東關(guān)鍵詞API賦能
京東關(guān)鍵詞搜索接口獲取商品數(shù)據(jù)的實操指南
京東關(guān)鍵詞的應(yīng)用場景
京東關(guān)鍵詞 API 場景的需求梳理模板
京東關(guān)鍵詞搜索商品列表的Python實戰(zhàn)
京東關(guān)鍵詞API接口獲取
使用京東關(guān)鍵詞搜索接口獲取商品數(shù)據(jù)的實操指南
京東關(guān)鍵詞API帶來的收益
京東關(guān)鍵詞的應(yīng)用
野莓平臺關(guān)鍵詞商品搜索API接口使用指南
京東關(guān)鍵詞搜索商品列表的Python爬蟲實戰(zhàn)
評論