116 lines
3.3 KiB
TypeScript
116 lines
3.3 KiB
TypeScript
/**
|
||
* 1688 采集配置
|
||
* 从 docs/extension/plan.md §6.2 移植(选择器来自 v1.1.8 生产 bundle)
|
||
*/
|
||
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: ['.title-content', '#dt-tab', '#screen', '#content'],
|
||
readyTimeoutMs: 10_000,
|
||
|
||
// 懒加载真实地址在 data-* 上(顺序不能动)
|
||
defaultSrcProps: ['data-lazyload-src', 'data-src', 'currentSrc', 'src'],
|
||
|
||
refererOrigin: 'https://www.1688.com',
|
||
|
||
textRules: [
|
||
{
|
||
kind: 'title',
|
||
// 标题被拆成多个 .title-text span,必须 join
|
||
selectors: ['.title-content .title-text', '.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'
|
||
},
|
||
{
|
||
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',
|
||
// 四套画廊变体(说明 1688 至少有四个线上版本)
|
||
selectors: [
|
||
'#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: [
|
||
'.pc-sku-wrapper .prop-item-inner-wrapper',
|
||
'.sku-item-wrapper',
|
||
'.specification-cell',
|
||
'.sku-filter-button',
|
||
'.expand-view-item',
|
||
'.feature-item img'
|
||
],
|
||
// SKU 缩略图是 CSS 背景图
|
||
srcProps: ['backgroundImage'],
|
||
// 规格名(五种 DOM 结构)
|
||
nameSelectors: ['.prop-name', '.sku-item-name', '.item-label', '.label-name', '.normal-text'],
|
||
minWidth: 20,
|
||
minHeight: 20
|
||
},
|
||
{
|
||
key: 'detail',
|
||
name: '详情图',
|
||
type: 'img',
|
||
selectors: [
|
||
'.de-description-detail img',
|
||
'#detailContentContainer img',
|
||
'.html-description img'
|
||
],
|
||
minWidth: 300,
|
||
minHeight: 100
|
||
},
|
||
{
|
||
key: 'video',
|
||
name: '视频',
|
||
type: 'video',
|
||
selectors: ['.lib-video video', 'video']
|
||
}
|
||
]
|
||
};
|