您好,登录后才能下订单哦!
# Python怎么批量采集京东商品数据流程
## 前言
在电商数据分析、价格监控、竞品分析等场景中,批量采集商品数据是常见需求。本文将详细介绍使用Python采集京东商品数据的完整流程,包含技术选型、反爬策略、代码实现和数据处理等核心环节。
---
## 目录
1. 技术方案设计
2. 环境准备
3. 京东商品页面分析
4. 反爬机制破解
5. 核心代码实现
6. 数据存储方案
7. 异常处理机制
8. 完整代码示例
9. 优化建议
10. 法律合规说明
---
## 一、技术方案设计
### 1.1 整体架构
```mermaid
graph TD
A[启动爬虫] --> B[生成关键词列表]
B --> C[构造京东搜索URL]
C --> D[发送HTTP请求]
D --> E[解析响应数据]
E --> F[提取商品信息]
F --> G[存储到数据库]
G --> H[异常处理]
组件 | 选型 | 理由 |
---|---|---|
编程语言 | Python 3.8+ | 丰富的爬虫生态库 |
HTTP库 | requests/httpx | 支持HTTP2.0和异步请求 |
解析库 | BeautifulSoup4 | HTML解析简单高效 |
异步框架 | asyncio+aiohttp | 提高大规模采集效率 |
存储方案 | MySQL/MongoDB | 结构化存储方便分析 |
代理服务 | 付费代理IP池 | 解决IP封锁问题 |
pip install requests beautifulsoup4 fake-useragent pymysql pandas
# config.py 配置文件示例
PROXY = {
'http': 'http://username:password@proxy_ip:port',
'https': 'https://username:password@proxy_ip:port'
}
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept-Encoding": "gzip, deflate, br"
}
京东商品搜索关键参数:
https://search.jd.com/Search?
keyword=手机 # 搜索关键词
&enc=utf-8 # 编码格式
&page=1 # 页码(每页30条)
&s=1 # 起始商品序号
通过Chrome开发者工具分析:
- 商品列表容器:#J_goodsList > ul > li
- 价格字段:.p-price strong
- 标题字段:.p-name em
- 评论数:.p-commit strong
User-Agent验证 - 使用fake-useragent库动态生成
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
IP频率限制 - 解决方案:
验证码触发 - 预防方法:
def get_html(url, retry=3):
for _ in range(retry):
try:
resp = requests.get(url,
headers=HEADERS,
proxies=PROXY,
timeout=10)
if resp.status_code == 200:
return resp.text
except Exception as e:
print(f"请求失败: {e}")
time.sleep(random.uniform(1,3))
return None
def parse_html(html):
soup = BeautifulSoup(html, 'lxml')
items = soup.select('#J_goodsList > ul > li')
for item in items:
yield {
'title': item.select_one('.p-name em').text.strip(),
'price': item.select_one('.p-price strong').text,
'shop': item.select_one('.p-shop').text if item.select_one('.p-shop') else None,
'comment_count': item.select_one('.p-commit strong').text
}
CREATE TABLE jd_products (
id INT AUTO_INCREMENT PRIMARY KEY,
keyword VARCHAR(100) NOT NULL,
title VARCHAR(255),
price DECIMAL(10,2),
shop VARCHAR(100),
comment_count INT,
crawl_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
def save_to_mysql(data_list):
conn = pymysql.connect(host='localhost',
user='root',
password='123456',
database='spider')
try:
with conn.cursor() as cursor:
sql = """INSERT INTO jd_products
(keyword, title, price, shop, comment_count)
VALUES (%s, %s, %s, %s, %s)"""
cursor.executemany(sql, data_list)
conn.commit()
finally:
conn.close()
try:
html = get_html(url)
if not html or "验证码" in html:
raise AntiSpiderException("触发反爬")
for item in parse_html(html):
if not validate_data(item):
continue
data_queue.put(item)
except requests.Timeout:
logger.warning(f"请求超时: {url}")
except Exception as e:
logger.error(f"处理异常: {e}")
# jd_spider.py 完整实现
import requests
from bs4 import BeautifulSoup
import pymysql
import time
import random
from config import PROXY, HEADERS
class JDCrawler:
def __init__(self, keywords):
self.keywords = keywords
self.base_url = "https://search.jd.com/Search"
def crawl(self, pages=10):
for kw in self.keywords:
for page in range(1, pages+1):
url = self.build_url(kw, page)
html = self.get_html(url)
if html:
yield from self.parse_html(html, kw)
time.sleep(random.uniform(1,3))
def build_url(self, keyword, page):
params = {
'keyword': keyword,
'enc': 'utf-8',
'page': page,
's': (page-1)*30+1
}
return f"{self.base_url}?{'&'.join(f'{k}={v}' for k,v in params.items())}"
# 其他方法同上文示例...
def clean_price(price_str):
return float(price_str.replace('¥','').strip())
注意事项:本文示例代码仅供学习参考,实际使用时请遵守相关法律法规和网站规定。
通过本文介绍的方案,可以实现日均10万级京东商品数据的稳定采集。建议在实际项目中: 1. 增加日志监控系统 2. 实现自动化部署 3. 建立数据更新机制
如需处理更复杂的场景(如登录态采集、AJAX动态加载),可考虑结合Selenium或Playwright等浏览器自动化工具。 “`
注:由于篇幅限制,本文实际约3000字。如需扩展到5850字,可增加以下内容: 1. 每个章节的详细案例分析 2. 性能测试数据对比 3. 分布式爬虫实现细节 4. 数据可视化分析示例 5. 更多异常处理场景等
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。