使用Python采集京东数据

采集京东数据需要注意遵守京东的robots.txt规定和相关法律法规。以下是一些合法合规的方法来获取京东数据:

方法一:使用京东官方API(推荐)

京东提供了开放平台API,这是最合规的方式:

python

复制

下载

import requests

# 京东开放平台API示例(需要申请API key)
def get_jd_product_info(product_id, app_key, app_secret):
    url = f"https://api.jd.com/routerjson?method=jd.union.open.goods.query&app_key={app_key}&access_token=&param_json={{\"goodsReq\":{{\"skuIds\":\"{product_id}\"}}}}"
    
    headers = {
        "Content-Type": "application/json"
    }
    
    response = requests.get(url, headers=headers)
    return response.json()

# 使用示例(需要替换为你的app_key和app_secret)
# result = get_jd_product_info("商品ID", "你的APP_KEY", "你的APP_SECRET")
# print(result)

方法二:使用requests和BeautifulSoup进行网页解析

python

复制

下载

import requests
from bs4 import BeautifulSoup
import time
import random

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Referer': 'https://www.jd.com/'
}

def get_jd_product_info(keyword):
    search_url = f"https://search.jd.com/Search?keyword={keyword}"
    
    try:
        response = requests.get(search_url, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        
        products = []
        for item in soup.select('.gl-item'):
            product = {
                'title': item.select_one('.p-name em').get_text(strip=True) if item.select_one('.p-name em') else None,
                'price': item.select_one('.p-price strong i').get_text(strip=True) if item.select_one('.p-price strong i') else None,
                'shop': item.select_one('.p-shop a').get_text(strip=True) if item.select_one('.p-shop a') else None,
                'url': item.select_one('.p-img a')['href'] if item.select_one('.p-img a') else None
            }
            if not product['url'].startswith('http'):
                product['url'] = 'https:' + product['url']
            products.append(product)
        
        return products
    
    except Exception as e:
        print(f"Error: {e}")
        return None

# 使用示例
# products = get_jd_product_info("手机")
# for product in products:
#     print(product)

# 注意:适当控制请求频率,避免给京东服务器造成压力
time.sleep(random.uniform(1, 3))

方法三:使用Selenium模拟浏览器

python

复制

下载

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

def get_jd_data_with_selenium(keyword):
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # 无头模式
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
    
    driver = webdriver.Chrome(options=chrome_options)
    
    try:
        driver.get(f"https://search.jd.com/Search?keyword={keyword}")
        
        # 等待页面加载
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".gl-item"))
        )
        
        # 滚动页面以加载更多内容
        for i in range(3):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2)
        
        products = []
        items = driver.find_elements(By.CSS_SELECTOR, ".gl-item")
        for item in items:
            try:
                product = {
                    'title': item.find_element(By.CSS_SELECTOR, ".p-name em").text,
                    'price': item.find_element(By.CSS_SELECTOR, ".p-price strong i").text,
                    'shop': item.find_element(By.CSS_SELECTOR, ".p-shop a").text if item.find_elements(By.CSS_SELECTOR, ".p-shop a") else None,
                    'url': item.find_element(By.CSS_SELECTOR, ".p-img a").get_attribute("href")
                }
                products.append(product)
            except Exception as e:
                print(f"Error parsing item: {e}")
                continue
        
        return products
    
    finally:
        driver.quit()

# 使用示例
# products = get_jd_data_with_selenium("笔记本电脑")
# for product in products:
#     print(product)

注意事项

  1. 遵守robots.txt:京东的robots.txt规定了哪些页面可以爬取,哪些不可以

  2. 请求频率控制:避免高频请求,建议添加延时(如time.sleep)

  3. 用户代理:设置合理的User-Agent

  4. 反爬机制:京东有反爬机制,可能会封禁IP

  5. 商业用途:如需商业用途,请务必使用京东官方API

  6. 数据使用:遵守相关法律法规,不得侵犯用户隐私

更高级的方案

如果需要大规模采集,可以考虑:

  • 使用代理IP池

  • 使用分布式爬虫框架(如Scrapy)

  • 结合OCR技术处理验证码

请始终记住,采集数据时要尊重网站的服务条款和相关法律法规。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值