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