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
  1. 验证:

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

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

类型特征工具举例
静态页右键“查看源码”能搜到价格requests+BS41688 大部分商品、淘宝部分商品
动态页源码没有价格,需执行 JSselenium京东、淘宝 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 代码逐行拆

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 完整源码

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 分钟

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

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 有禁止就停

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

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

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值