Python 零基础写爬虫:一步步抓取商品详情(超细详解)

面向人群:从未写过爬虫、甚至 Python 也是刚入门

目标:把"商品页"变成"表格里的数据"

学完:你能在本地跑通一套通用模板,淘宝 / 京东 / 拼多多 / 1688 想换就换


0. 先讲人话:爬虫到底在干嘛?

把网页 → 看成一串 HTML 文本 → 用 Python 把它"拿"回来 → 用放大镜(解析器)找到价格 / 标题 / 图片 → 存到 Excel / CSV / 数据库。

一句话:"请求→解析→存储" 三板斧,所有商品爬虫万变不离其宗。


1. 先把枪擦亮:环境 5 分钟搞定

  1. 装 Python 3.9+(官网勾选 Add to PATH)

  2. 打开终端 / PowerShell,依次敲:

    pip install requests beautifulsoup4 lxml pandas openpyxl

    如果页面是 JS 渲染再备一个:

    pip install selenium webdriver-manager

  3. 验证:

    import requests, bs4, pandas, selenium
    print("全部装好 ✔")


2. 静态页 VS 动态页:先判断再动手

类型 特征 工具 举例
静态页 右键"查看源码"能搜到价格 requests+BS4 1688 大部分商品、淘宝部分商品
动态页 源码没有价格,需执行 JS selenium 京东、淘宝 95% 以上

判断 10 秒法

Chrome 打开商品页 → F12 → Network → 搜关键词"price" → 若 XHR 里有 JSON,可直接调接口(最快);否则走 selenium 渲染。


3. 静态页实战:1688 商品详情( requests 版)

目标:抓"标题、价格、销量、图集"

3.1 找规律

任意商品 url 格式:
https://detail.1688.com/offer/123456789.html

→ 只有数字变,后面教程全用 {id} 占位。

3.2 代码逐行拆

python 复制代码
import requests, csv, os
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def get_detail(pid):
    url = f'https://detail.1688.com/offer/{pid}.html'
    head = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Referer': 'https://detail.1688.com/'  # 防反爬
    }
    resp = requests.get(url, headers=head, timeout=10)
    resp.raise_for_status()          # 如果不是 200 会抛异常
    soup = BeautifulSoup(resp.text, 'lxml')

    # 标题
    title = soup.select_one('h1.d-title').get_text(strip=True)
    # 价格
    price = soup.select_one('span.price').get_text(strip=True)
    # 销量
    sale = soup.select_one('span.sale-count').get_text(strip=True)
    # 图集
    images = [urljoin(url, img['src']) for img in soup.select('ul.inav li img')]

    return {'pid': pid, 'title': title, 'price': price, 'sale': sale, 'images': '|'.join(images)}

# 批量测试
if __name__ == '__main__':
    ids = ['728510689123', '728510689124']   # 换你想抓的
    with open('1688.csv', 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=['pid','title','price','sale','images'])
        writer.writeheader()
        for i in ids:
            try:
                writer.writerow(get_detail(i))
                print(i, 'ok')
            except Exception as e:
                print(i, 'error:', e)

运行结果 :同级目录出现 1688.csv,Excel 打开即可见数据。


4. 动态页实战:淘宝商品( selenium 版)

淘宝接口加密天天变,直接调接口对新手不友好,这里用"所见即所得"方案:让浏览器先渲染,我们再拿文本。

4.1 安装浏览器驱动(一次搞定)

复制代码
pip install webdriver-manager

代码里会自动下载 ChromeDriver,不用再手动配路径

4.2 淘宝页面结构(2025-06 实测)

  • 标题:<h1 data-spm="1000983">

  • 价格:<span class="notranslate" data-spm="price">

  • 销量:<span data-spm="sales">

  • 主图:<img data-spm="main-img">

4.3 完整源码

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd, time, csv

def taobao_detail(url):
    options = webdriver.ChromeOptions()
    options.add_argument('--disable-blink-features=AutomationControlled')  # 去自动化特征
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.implicitly_wait(8)

    try:
        driver.get(url)
        time.sleep(3)  # 等 JS 渲染完,也可显式 WebDriverWait
        title = driver.find_element(By.CSS_SELECTOR, 'h1[data-spm="1000983"]').text
        price = driver.find_element(By.CSS_SELECTOR, 'span[data-spm="price"]').text
        sales = driver.find_element(By.CSS_SELECTOR, 'span[data-spm="sales"]').text
        pic   = driver.find_element(By.CSS_SELECTOR, 'img[data-spm="main-img"]').get_attribute('src')
        return {'title': title, 'price': price, 'sales': sales, 'pic': pic}
    finally:
        driver.quit()

# 保存
if __name__ == '__main__':
    urls = ['https://item.taobao.com/item.htm?id=728510689125']
    rows = []
    for u in urls:
        try:
            rows.append(taobao_detail(u))
            print('done', u)
        except Exception as e:
            print('fail', u, e)
    pd.DataFrame(rows).to_csv('taobao.csv', index=False, encoding='utf-8-sig')

5. 反爬 6 件套:让你的程序多活几天

  1. UA & Referer:每次请求带浏览器身份证

  2. 代理 IP:免费站"快代理",付费"青果/阿布云",requests 加 proxies={'http':'http://ip:port'}

  3. 随机等待:time.sleep(random.uniform(1,3))

  4. 重试机制:requests.adapters.HTTPAdapter(max_retries=3)

  5. 浏览器特征去自动化:见上面 selenium 代码

  6. 不碰登陆、不碰秒杀、单 IP 日请求 <1k,基本稳


6. 数据清洗 3 分钟

拿到的价格常带"¥""+""起批量",统一洗掉:

python 复制代码
import re, pandas as pd
df = pd.read_csv('1688.csv')
df['price_num'] = df['price'].apply(lambda x: re.findall(r'\d+\.?\d*', x)[0]).astype(float)
df['sales_num'] = df['sale'].str.extract(r'(\d+)').astype(float)
df.to_excel('1688_clean.xlsx', index=False)

7. 可扩展模板:想爬 1 万条只需改 1 行

把"读 ids"换成"搜索列表页":

  • 先爬列表页拿到 100 个商品 id → 写入队列 → 循环调用 get_detail

  • threading.Semaphore(5) 开 5 线程,速度 ×5,代码仓库已封装好(文末 GitHub 链接)


8. 常见错误对照表(复制即用)

错误 原因 解决
403 Forbidden 被反爬 加代理 / 降速 / 换 UA
UnicodeEncodeError 编码 open(..., encoding='utf-8-sig')
selenium 找不到元素 页面没加载 WebDriverWait + expected_conditions
价格为空 选择器失效 F12 重新 copy css selector

9. 法律与道德底线

  • 只抓取公开可见数据,不登录、不破解接口、不逆向 JS 加密

  • robots.txt 有禁止就停

  • 数据不做商业售卖,学习 / 分析用途

如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。

相关推荐
二川bro1 小时前
AutoML自动化机器学习:Python实战指南
python·机器学习·自动化
AI科技星1 小时前
为什么宇宙无限大?
开发语言·数据结构·经验分享·线性代数·算法
杨超越luckly1 小时前
基于 Overpass API 的城市电网基础设施与 POI 提取与可视化
python·数据可视化·openstreetmap·电力数据·overpass api
Appreciate(欣赏)1 小时前
JAVA使用poi类读取xlxs文件内容拼接成添加数据SQL
java·开发语言·sql
oioihoii2 小时前
性能提升11.4%!C++ Vector的reserve()方法让我大吃一惊
开发语言·c++
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于JAVA的恒星酒店客房管理系统为例,包含答辩的问题和答案
java·开发语言
思密吗喽2 小时前
景区行李寄存管理系统
java·开发语言·spring boot·毕业设计·课程设计
Rust语言中文社区2 小时前
【Rust日报】Dioxus 用起来有趣吗?
开发语言·后端·rust
小灰灰搞电子2 小时前
Rust Slint实现颜色选择器源码分享
开发语言·后端·rust