140 lines
4.3 KiB
TypeScript
140 lines
4.3 KiB
TypeScript
/**
|
|
* 1688 采集配置(DOM 兜底路径)
|
|
*
|
|
* 新版(2026-08 实测,快照:宝宝平衡车)DOM 大改,锚点从业务类名换成稳定的
|
|
* id / data-module 属性;旧选择器保留做兼容(旧版页面仍在线上轮转)。
|
|
* 主路径(window.context)见 collector/platforms/1688.ts——DOM 只负责兜底
|
|
* 和补充参数表(#productAttributes)与详情图(#detail)。
|
|
*/
|
|
import type { SiteProfile } from './types';
|
|
|
|
export const profile1688: SiteProfile = {
|
|
id: '1688',
|
|
name: '1688',
|
|
|
|
urlPatterns: [/^https:\/\/detail\.1688\.com\/offer\/\d+\.html/],
|
|
|
|
extractItemId: (url) => url.match(/\/offer\/(\d+)\.html/)?.[1] ?? null,
|
|
|
|
readySelectors: ['#productTitle', '.title-content', '#detail', '#dt-tab', '#screen', '#content'],
|
|
readyTimeoutMs: 10_000,
|
|
|
|
// 懒加载真实地址在 data-* 上(顺序不能动)
|
|
defaultSrcProps: ['data-lazyload-src', 'data-src', 'currentSrc', 'src'],
|
|
|
|
refererOrigin: 'https://www.1688.com',
|
|
|
|
textRules: [
|
|
{
|
|
kind: 'title',
|
|
selectors: [
|
|
'#productTitle .title-content', // 新版:data-module="od_title"
|
|
'.title-content .title-text', // 旧版:标题拆多个 span,必须 join
|
|
'.title-content h1',
|
|
'.od-pc-offer-title',
|
|
'h1',
|
|
],
|
|
extract: 'join',
|
|
required: true
|
|
},
|
|
{
|
|
kind: 'price',
|
|
selectors: ['.price-original', '.od-pc-offer-price-priceRange', '.price .value'],
|
|
extract: 'first'
|
|
},
|
|
// 参数表(新版):#productAttributes 是 antd Descriptions 表格,
|
|
// th(键)/td(值) 成对平铺在 tr 里——用 cells 模式取兄弟节点
|
|
{
|
|
kind: 'params',
|
|
selectors: [
|
|
'#productAttributes th.ant-descriptions-item-label',
|
|
'#productAttributes th',
|
|
],
|
|
extract: 'cells'
|
|
},
|
|
// 参数表(旧版):行式键值表
|
|
{
|
|
kind: 'params',
|
|
selectors: [
|
|
'.offer-attr-list .offer-attr-item',
|
|
'.od-pc-attribute-table tr',
|
|
'.obj-content .table-tr'
|
|
],
|
|
extract: 'table',
|
|
tableKeySelector: '.offer-attr-item-name, td:first-child, .table-th',
|
|
tableValueSelector: '.offer-attr-item-value, td:last-child, .table-td'
|
|
},
|
|
{
|
|
kind: 'desc',
|
|
selectors: ['.de-description-detail', '#detailContentContainer', '.html-description'],
|
|
extract: 'join'
|
|
}
|
|
],
|
|
|
|
imageGroups: [
|
|
{
|
|
key: 'main',
|
|
name: '主图',
|
|
type: 'img',
|
|
selectors: [
|
|
// 新版:模块锚点(data-module / module- 类名)
|
|
'[data-module="od_picture_gallery"] img',
|
|
'.module-od-picture-gallery img',
|
|
// 旧版四套画廊变体
|
|
'#recyclerview .detail-gallery-turn-wrapper .detail-gallery-img',
|
|
'#screen .od-gallery-turn-item-wrapper .od-gallery-img',
|
|
'#content .od-scroller-item .v-image-cover',
|
|
'#content .od-picture-gallery-list .v-image-cover',
|
|
'#dt-tab img',
|
|
'.detail-gallery-turn img.detail-gallery-img',
|
|
'.img-list-wrapper img.od-gallery-img'
|
|
],
|
|
activeSelectors: [
|
|
'.detail-gallery-turn-wrapper.prepic-active .detail-gallery-img',
|
|
'.od-gallery-turn-item-wrapper.prepic-active .od-gallery-img',
|
|
'.v-image-cover.image-item-active'
|
|
],
|
|
minWidth: 200,
|
|
minHeight: 200
|
|
},
|
|
{
|
|
key: 'sku',
|
|
name: 'SKU图片',
|
|
type: 'img',
|
|
selectors: [
|
|
'[data-module="od_sku_selection"] img', // 新版
|
|
'.module-od-sku-selection img',
|
|
'.pc-sku-wrapper .prop-item-inner-wrapper',
|
|
'.sku-item-wrapper',
|
|
'.specification-cell',
|
|
'.sku-filter-button',
|
|
'.expand-view-item',
|
|
'.feature-item img'
|
|
],
|
|
srcProps: ['backgroundImage'],
|
|
nameSelectors: ['.prop-name', '.sku-item-name', '.item-label', '.label-name', '.normal-text'],
|
|
minWidth: 20,
|
|
minHeight: 20
|
|
},
|
|
{
|
|
key: 'detail',
|
|
name: '详情图',
|
|
type: 'img',
|
|
selectors: [
|
|
'#detail img', // 新版:详情容器(实测 69 张,含少量图标需过滤)
|
|
'.de-description-detail img',
|
|
'#detailContentContainer img',
|
|
'.html-description img'
|
|
],
|
|
minWidth: 300,
|
|
minHeight: 100
|
|
},
|
|
{
|
|
key: 'video',
|
|
name: '视频',
|
|
type: 'video',
|
|
selectors: ['.lib-video video', 'video']
|
|
}
|
|
]
|
|
};
|