面向人群:从未写过爬虫、甚至 Python 也是刚入门
目标:把"商品页"变成"表格里的数据"
学完:你能在本地跑通一套通用模板,淘宝 / 京东 / 拼多多 / 1688 想换就换
0. 先讲人话:爬虫到底在干嘛?
把网页 → 看成一串 HTML 文本 → 用 Python 把它"拿"回来 → 用放大镜(解析器)找到价格 / 标题 / 图片 → 存到 Excel / CSV / 数据库。
一句话:"请求→解析→存储" 三板斧,所有商品爬虫万变不离其宗。
1. 先把枪擦亮:环境 5 分钟搞定
-
装 Python 3.9+(官网勾选 Add to PATH)
-
打开终端 / PowerShell,依次敲:
pip install requests beautifulsoup4 lxml pandas openpyxl
如果页面是 JS 渲染再备一个:
pip install selenium webdriver-manager
-
验证:
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 件套:让你的程序多活几天
-
UA & Referer:每次请求带浏览器身份证
-
代理 IP:免费站"快代理",付费"青果/阿布云",requests 加
proxies={'http':'http://ip:port'} -
随机等待:
time.sleep(random.uniform(1,3)) -
重试机制:
requests.adapters.HTTPAdapter(max_retries=3) -
浏览器特征去自动化:见上面 selenium 代码
-
不碰登陆、不碰秒杀、单 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 有禁止就停
-
数据不做商业售卖,学习 / 分析用途
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。