From e695fd5184e7158189e5933dcabdd33778bae078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=AD=E5=9D=A4?= <10372463+ming-kun@user.noreply.gitee.com> Date: Fri, 24 Apr 2026 23:00:59 +0800 Subject: [PATCH 1/2] modified: amazon/__pycache__/approve.cpython-39.pyc new file: amazon/__pycache__/asin_status.cpython-39.pyc modified: amazon/__pycache__/main.cpython-39.pyc modified: amazon/__pycache__/match_action.cpython-39.pyc modified: amazon/__pycache__/price_match.cpython-39.pyc modified: amazon/approve.py modified: amazon/asin_status.py modified: amazon/main.py modified: amazon/match_action.py modified: amazon/price_match.py modified: web_source/brand.html modified: web_source/templates_backup/brand.html --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 32541 -> 32560 bytes .../__pycache__/asin_status.cpython-39.pyc | Bin 0 -> 18456 bytes app/amazon/__pycache__/main.cpython-39.pyc | Bin 17567 -> 17671 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 19231 -> 19235 bytes .../__pycache__/price_match.cpython-39.pyc | Bin 31844 -> 32199 bytes app/amazon/approve.py | 5 +- app/amazon/asin_status.py | 712 ++++++++++++++++++ app/amazon/main.py | 7 +- app/amazon/match_action.py | 2 +- app/amazon/price_match.py | 79 +- 10 files changed, 770 insertions(+), 35 deletions(-) create mode 100644 app/amazon/__pycache__/asin_status.cpython-39.pyc diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc index 42e8fe4bcf750a18fae7a92bef592ea2fd7cf615..94b13e42f6532fc35aae33b3a1eda6485f531d88 100644 GIT binary patch delta 516 zcmX|-!D|yi6vp41-EAk?Y^tf&rb25i3Lb6C-g*E%#fiedqbEy#>9oz5W;dF zLGUNg9Mf=?IB9EIWX2Z4JiM-%5ZDo}enbd!2+hZ0T<}^hbOxh}WNV`nfkU}X+<~@v zVpu&`SPIS5o)?^`6?Tws1t17iOHUU8(tX_eDMMrK_q7G0v%scLlk+?oDA{J@Rg1FWL02W-a+U z#dqs-g?(LI8Up=KV-dEf77XK#G;Sa=lb+|tJ9|Oyq9RL6T delta 528 zcmZ9IPiPZC6o=oN-EFq}r`FcSq(ToZirymBf*>BG9z;+I1W)T1|xZ`b0X^I&Ek^FF>G^Zo$a2k1U@T?=^a zecSUhJMNPr&Z>=Kt8q56Nejg)1ies@mWK|=V{#-GL64w=a+I_!kjLAa%)|l#p@qvI z2$nK5OhaUlCC8e2WRfY(6@CkHDK(x_CzzT@C=&B9K*Z2#?D;gjNgJUL!;fLj8u!NwZ={ZmPgGvhnyF<1#SIM z$>GWExH0_eZRM-73$h&2o%))UrOJ=*B@1@m0(wuXdbVsxAYSCyR*?3#D!Ol!e5r}ouvQ( diff --git a/app/amazon/__pycache__/asin_status.cpython-39.pyc b/app/amazon/__pycache__/asin_status.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9f04f05f218ae406ff01134b8410c8e7b50fea0 GIT binary patch literal 18456 zcmbt+dvp}nnP*jX^}E$-2_XdLQ3x=!jS$#z#=}4YHsFvD#RrI;G{(J+st_$&EpfXV zTRkNQjBUWSY-RnnC0p{_jsd@781Q2@GrODJJ^MVn+1=V#HdgDAf4pbTdjDX~#{2ue zTWWR7;4_(RoxWXl>ps7G@Av(F-@T@GbmWRTNV( z)tr)&ziLY5do88$uP^1}Up=MsuRrDI-#{vWUo98x38sQ7<@M!4J>gWiCz6Wry_$=r zqKMaXv7WkAT~9m}=Xigvz9*4N^faUzdKy!WJ@ZoYI6jbT>Y1OK-_x9G?pcsp(9@D? zQI*>iGiZh$P|T23cfyxii2JY^!F}X}mRe+8V@3~aL#p^|GiKJAakGBdms)HlQcKK+ z)KV*MHl9#b#ad`BKB1T;PpI3J{Xa=vS8B1Abzg6-G8YW0skL_^^^khx=$%UbW?iw`hSdH(RY|Q=mC{nH z-CD;rF6&-Dx`E2QQ~4>Rn_9PTT|Odz*DLEO|6=O~YwZch`mj#zx7y7XFXxTcwbp8D zjk$2phx(V^rKP@=x(Ux0S>Jj=F|V<1dO;b{DJ@DFMm+k4_N#l8doJhDOhgoa5k4q_le$4t58Vl zZbRWv?>*^!ubn-Z?aWXXx30^w(}?a%XY&Vp-G##H={;(t3w>5+Hj_(t9?FPJr)`OX zJHODE%i8JAq7YWTvp;<_lPg+OYE%^S*?d>p&J+$;Zm38%bO5bLn_1z`-?n|%_PyKF zx9r~9u`Rvz_MPclw(i;9N!_dd=(yQ}Z(#=lOQETYX{%z&YNqc21yfcx{rL4;0W&bH z@>J4OK{{BmJ}(EBz@Uafr}oB*4yuh9-lu%(GH)V%4eRP9{c6=$jg9X3g=H^zbWcGEo zbrrM7deq9>y`sOZ2Q$BQ|Fj=cLmPs$N_va-V9bW88OxAx}k zOg3+c*8T16hch+`>nqxAU81+xH@%6<(L@7&L=%FJWYG25nFFrR%2}>{PbO=-VKa-> zkm>d9p9&1SH=w(h(u)04qGzAID6=FGMvUca8+fnuc6i}cxEB=@oS0k$Sm9E9rn1(;K)Kaqy*3D+?)F_Mh3E`JS$qV2^ zTvRQ9IaA!$NBy(_Dw7(^U=$0}o7zE#7bs2aE@eQsLuQyY@ZAG`ugnNi2AsfXxN2cU z5f^lVSQrs3Yt4*Ney*u*rl#&FEJN6=AJkB4%z^GS6NhziyQ&;{_sH#zjz!eaA?Bm) zJ46Cu*Ny!7{JW)FXXZp@(D!x9xlmXm*Tve^duC<{CYD*uS?RPKterGRRwwtDDif>F zm&sR_lUI(MQ#_ycZRyJhdvhz_wC>*vHI9jb(x-iBRLQ7m3$pLqlF#&5n^()~R`0)j z(@YAQ!C!0VE}Cef(ny|n0`0@xr76G@coG-*{Pw$-o2$!`i?49FxL?e}V?hcqStnZP zdLadiD7XfJtJ89F{e_%m^@+t4OxJNA zQ$v{V2{nRmObw`|g|+j(s+_k}aU%+;ng68xX$|oF&*6gRYBvl3nIOzK&BiLgjMFjW z);pT1FI2jH-7o>H>}jt0u?C>tc~#IF2oFNlWA;Z-QWzFL>Zk}~D93k#uIfgDZ1EM$ z+jxhd&WT0}Dq|y7<93HgQsi|MY((%S&7#kb4SBymFA@ecCWeM5KYY1->RqE4r2Fv; zZ}0iRkCPEOxTImk4HWPQucxcE6tq$BrwCkspMX|&!#x>sI875Wsq;v(q{PjX?j{OW zR01BJ#wxLmgmp()OLu#7f7P*I`!m0Ugrzck7ORSQ9rNX>?$I9UqO#kw!acsu)8WtDvdLbaY1} zJsNT}N@db$_&SQTCZ>mvO}&1+{NM-E&zzZj{(*_nlapsYh3zepiYb5cMEUgK#1n(# zpA6$63`II?Cc|#P9+qy|AQ|E$NplDVPD4LxdZyJd=aE4H@PR2hu>%Q1aXGRN4gC16>Va9I#sOjle>b z7SxVLC07S5X$%eO#au|!lB-!GG&_lpbW+*3V;>xy>FAWRnzaNCwweId{}Re6EJ;P zZ^7;mfMCRovTX>DM$8zES?NBMNqOtMyg}r}+M>L`9P?&_0p+x^rOmO?%PO)mRtqpP7+4@;R<#&{L#NjQnogn2El8qC#B z1GoNtFI{4^kx_@n!j?HoWFM}M^^Ia`ue|DHM%o%{yMZ2{1y6S-e?n- z>f=&_UT?0Yc{@A0M^?^`E?qRn6v~Kv*bvJKlHC7k~En>t>3?Cc+8_SmOnmLe&dme({D_TJ<1q??NE^*)x@JG%V(dbGNtBYi!{e{ zRT->O1%43l0u0XPnVOV5h_kM}y_l;&DT2vB^zH4r?7l4-k! zu9B?=moess)EMpW1NE`jB==8$g-?+nK6)xOIQ04C=<$t4F^*WH-IzFb2~iVIy^E-3 zPB`@Egy`2*4C4Uuvb3fiJ70eMX<0z|)%T`8d~KQ#)ilBC;`N;O=U-1V_0fYjPP{W# zK0Z8g=H>BAm&y;1eev<}4nY~FNxK&7s-dF1#FSpI2;xc@vGx0ze6g^H zcsp261uD)$)g*-cM`Q%vwQ_B3tw|%3H;oD+g((C7U$ZW`wsq^CogJ+xbsdI=3ijk( zBt!*q(PP5{DyKh12iD;uh;bDOTN>r_?@wNOy!`3|Ai7hZogBaT5T@bO`44bi+V;&| zmE`^^eWY2J%N($BsgTvvcL?*gz#}&?{I(nzG)1}uO4nDak<&`AGTV<5QsPXP-f*C(gW59)5H3Gn!Ads?f*JE_v__QIJ59 zpf=4!+41u)VSUPVRsQ(?@`Vf2_u{!Ac9&eh_&^Z00*0_`@m+ev$o-qa9bnyQbHPzP99A-&1gd*b zVBui|N~jSKNe5}rH3CaSojvI4(*R=QYQiT;HE4#WtBV1r=y?cWs!_cbX%~TRN7R58 zLT*jf{t)uD;J!uGkq@~wDmS7o_EA{@eCaNL{2`F_M%+-E z0eTt?DxIDot8OfvK2pr&2)d`!JW<3dbdAxyARH~H%uc%MqF_aBKyY5vBOn&Z_#K_m zLJgtjcsLZ}CxrWIKD4~I;9GbX!K~koC=+??;H&e)hu3Q9W@s3M2o7IzJFl<;?61>2 ze_asI>+w8cHawuio41nS(*r8}c&jYkida!AhV;$Desh7@f)eV?YppoSh~gW;lZC?p zfTC;gq~3~}i&4@Nb16znn5#JrYC}0Oa~aYZ=5nNKFoQ6*Yv4m+cgkLPFux3-3*}GG zmtXj#NS6~IJVlpbTu#0A+2rGACQm=dcM}glQN2+<^%f_adgMJMOZr`H+jdvmvD?+Q z?{T%AdtL3vKOhHgxCk!5#=8bdlZl`&jSHi6N9_w_f$`FesMBDb#6yY?;(7Vh2+VQ$ z(WlF2$0knyg)|vbWt5+La~3OX6E3$`4*3 zmGtO?<)L3dq4z+;_pjyjG=J6_eON;G^a`_r5%zW@H6hR%sDfgi{Jyv+rq7X8bBS3Y zW+;G*olak*{t=N=0+`(MX2rd3CWWi-?AY-mc(8*#a8}d8_vfsmR<6@Wxx5dRKq`yH zMLN)iZ+1)>)!0Al10B~u_Y9lJ1n3|+j!e)&z&SsIx&Tpc5401(3wB&?SoPDkRXuI1 zOk>seHm>^N##MV<|MuOxf3(~6!;jf3F01=W_4|!|w-frJ34-gAw%-6Pqk(gM`QCfn z5VXue@{~x0N)&E}HXp^cxQ9}PDFIYfPv2ZI`EtEoe}yCkT1N`h0x6VIyh=()K$D1E z>}m3x)=VNoEQAbLD!)dnK(MyKJB=xnRmR}50Qm(m0}O_QaOLYlEIBSfl6BmZ_u9`_ z0eS+L9Hj~(Hpo}xs}9+q%!tL>9fSL0Ak24B5HD>Y;`j;=IW!9JyN@xnHDh}eCr}vX z*!r4SN|)d$r@h!Rs$y3aQ=7KRIKHuUtEaDok8S%-sn2TjPbIB$Eac(WOYpLVM z{9p%w9iF)}m(ffrZ3LK)IJyHjf)jK?PS}Z<#vr!JDs?~VmATxnEL66ueE8Xr^SJ=2BQKfK*Y62g|+*Lp@{l3ZK76Z6{BaaCGx{KBR3gRhkz zf90FBUS+XtG^DNsn4cItTTx}MPAiF=FonZAP53o!tEa#`#|`t27^y%va-?X9{;lM> zaf4Ekns7$i&`{8Argg6yJqR|FBaeKSwHI0|+mp3BiiFl=wL7l8Sv@5C;38NQFQ6p0Rs03gnhJst~?I2nv?-U|J zKJDx+<^lcT@trrDVm8t%gGgdc88V`-Q0$~_$uwthV}uJ)fxL?sZ0tx13$iJ|uPmNI zQ@>>1`O2}0Up@k~E=6k;$@CcHlzaYuFsZ3?=O^B~pTxneO3Dk!5vBE^m`9MfNU)|x zoGh@7hO5&KD8zIc3B+TRln9t7b53M@Nie{W9B-o``f>MV5W!4qsEI^kre6MqY!Db7 zfGF%L`^T9&BRkQX^4UixP7UEXH%J!XJz)xo1_h){Ls=o(w5uQJ?ahgwA%^|9 zZU8LoV75z+Eg2-?P%uCNwakrqL&HNSeoXN{p@58q8#&l3dNMXa`(#|2@niJxI6VyV z0?L}=1VueS0l^UQ5CtbGI7I=Ai>KBBy5+)G&=m(OaW&fpD)FBora%)=36Q%!0t6ia znkFQi@DZwp)1IFMw8e1bldBR)8Yr1U@9)b<{bF`x27s9pNE27}uL6ET+6frX#p<=d z+l|QC1ebF&(uCAzlt8t?1-)QT1?{bykq)(NN2i~f<$cKePTe9w6^0>N6IRkx;E=@5 zFKuKEY5Q*;2o9;Gzl8P#P-E>1+hFPo6h<6m*#aZ5qtNEMFgX?9*_s(5ml}TIaKx_< zd&t-fQx$@K-Tv29Y!YZ$^)<4)0S9S$n=D8UY*^l~cpdJ^*kK=jspdMWSz4|9B94i( zb5es_6PAS93E z=U+WLC8_e~|7{)#;E zp_#m%eNGH%{WrkQCD=YMHI-b$Km+Gq<}{G2knNl?BTsvtlYoT$JaWrrTVTbI|Got5 zGyk%ErVSvyMLDd91gC{-6k8A&3)sp7PFRK*OLAd8>q%k-ZxF3yED{)Kq*geMQnJ|Q zXks_!lXjEi+YF3FI183?Rfnq-Y08%09ho}!)Wqp0NXL0vi+GH&X7ZhP3_(i&vfBP7 z&2$6qr(}^<==8}!WWqj1`N2~YBgZBlJ3aBs$EV&n1zs`r*$ePzz)9h1N575lO`-!C z+@MDmio_IUJ>-%)^DJB)+zu$W^20CHw1YKWbxcK(68ZL=AVU++o+}T%F85p}pSx84 zNc|2B2*H7WeH$@!w4ieV!}Q>$tVk(eR72;6WlcC*;% z;0%NX%MJ>IonWFyf@qG|i@?>p3%z+ULicQ~{4&+7nHr-iVMwr4e?REpE$R5RhoS%JElCEx{g3lswL-1<#;UJ0SVLyh3 zKJYd14n3~pcBMVcA}W^74a*vO3SDzZoj8MhttxB>8Ds_iAo3^aYAY;UM0$CA8myM4 z>3<05AbhY?jT-x(d_?~OxC_Brh3JYcmkw*l@nk6x7eVTP)`Ty4smQ|7_MYK`Z_3w< zJDFNnOHEbwt}-fn;j54^mvFCJCvjUp0GNqRzl6vjFsOko9K>Itv?vM-}lsCq!Gfunyr(Yz4vh{A3BiDI;Y0 zn3>F!5GDO?#+(Rrae(xwSvP>qJlG@+)>z$t2dq#X>Zi>-SRh;_*wSFb5Nsn1&K5Hp z26fsNGDAg0{BLeuBU`?CXk8Pvj>_7<2>F%n5co?78&||PVd(|~(A@tHwN}~>t8{~G zKk8aQ%#vcb)D|vvVWrfBJmkU~S-&m8E`duXoH*A|Z!Q}2lQqldJf`>&EKvh2(Qfk^ zGX$o{HUNAsj{YwJe`@fUqHHnS2WE{@>Xn}@v)pE50%!lwIXD41&QP#DcE!$n6ZBhTe;}PCXYAn@_NzA5?Nkp zwXZDFD~kUfbI}9LI4w0pe7=bg%43e0?HdixVzC>n zLI@3fYL)@gF?Slj^a}QdBs;4~?IGkDg1K{B%~Js_l+I-fHl2<OvwRLKcv5?EIUxM!82k?nP(o~om#;#CMh`~pFR1eG6r zr~LSZ^3dSq8}H6xk%CNY$E=&3>R=kk_MbS*#CdE%je=Uq4L{jiQvV;mUVi*McEM=7 zjEscb6@2ES>1RHKSs`PxgWv#h!Tyw=*&Uo;?;&2iPr(Bed_ckT2#T!;jPlUA^22Y+ zUR7-EBv+tTS%KYy~!L>C>mH`>=*uwmW`#hi^H=aV3y zu)?Y^aY>U!{~SIi$XbGoQ+AMfcqrhS$QBOaJfbw5;$y1h6ADHdcTK*CPtyWw3(R0bU5gl;^|}(Zqp6+@$VUEi zv_N*9yUDF50^3RGW9HL{3mOe(e&5q)jzBu_qr$Gy;h`Y(FzyigM*OgPe9%xuN|0dYLfv_0_1M|~C6Si3&4!|>5+C(LoIFN!8!%ozUFoX2$ zoyQ;%iz6_9!zuaDM9F})4bb5NI|wf+TSUZ!9bNK~{6^^ENdNzW7ACJFX<^Nb+fmQY z=&?iA!U@l>$iHkGqGkghQ@M+CHByPNS~xZ{T31`6r|-ce`%^VF&HFpnq>jcN@-@Ta z!xl+DauZ2HGFp$PCGt(&lKCv7<{2*Mu{Wyy|9G`;F&oT8uHN&mF5vVnmA2^SLbmeK zyPAM^mG7@61+dQuv$vnHj2Dp{j{F2I)e3i*vMtvzDp`zqK$cJgUXV5L_=DB$_Qrn+ zTi1xRu4ZBn4hqUyu>ayfwA74|Ymf&;$Pev};4qEgkgvbV>)ZV`eOp%Pm3HM`5$fUg z`*G}wFqb^QGk&EOv2=~O(g4~)ORp@QA??WBj-O|7VxZn`G?!z3%)<!;qQlmn8nsOX<1Agjgn@pxvVC|vrx}&{mhvG&mu`I!l!kl7eu~00Z1d^fFWK( zHn!v9b-H>3L6J@}RQw-T=H|qe(?TOCL4ABjRVAGa0HDbA2qvdxOy*FE!U^&zsB`h;0%0N zLcl_^&ES_$07!>|PD*8zZ{u%)vnVu0NK}9dK^wlSu zXR!}$6;$Cl8W8D%XV1t#q1&|-v{68w0EyHHQOLtODO|aY@*ND&gIi~|QY3;R94Ak0 zu)lgVtt_Emko65UbA!=}%+!=)D+<1ZC8L9X)KB5XL0M4!RoEqLn zd@$1|A@q%u>=6oRAZ8u>;-BL7R|N4$luA5K-U&4VKL$ZPdIbf34;;(K*%^R2Itde3 z*Rsc7<2%4N_H59h{TB9RkO!ZD;*9SDa1r;E8>eUxHpA;rr)TIe^L0V`#d({r;yS^_ zfYuB!NWT9jcvz59{gzf*ROJJi@%ejd16w`>hC2cDDj$M>73Y5*J;Tug6>u(rbE4S( zzF);@W(6(;1NU&1->=%_?AO_G>mR}Ca}(RdS=unb7CL_MM!-N2G#jUp**B;`dGjC!d?fR9sQL^SQ0fymi3FlzDQ)m}UX5(Qpl!jduuKC>&|sRwCs(k;hL;YEP7ppi zwN|=GG9ccg{Ufq9w`cmY?PS{8urt+nt{zv$xz;ML3?>@Tgv6z{UGBnya4Iyd2d_%#>cIWkMvT|EycvG6Y2 zMuSAKxfEI}JGQx$ym~IVWyvYAr@WbMV`4UhgFAwb#msuD$-~Rr$pu#@g3SJBDNfqWM`IUVZU zv)-;KbT_se&JG;r;d+uWxp7K5WOi@V^%X_V4fbXF>4hfopXnh}X;!u8>Gn7UtaRsS zQyQX;8no#qTqy7j^B?QQ5WL56=)uLL@A!}RMK1?%a9ztqWdT z3Y~zh+S;f#rtnFhz_8w>LLr8nfY^<*G$DE|zzpIGU#}U)ix$2LH@;;cQu-ZEa7Ad3 z6l%$jT~VBUVP#pztSc^+B|od5<&1ovAg{A`mL~uYFwX3NJvBm=;#8qIe-NjPI9)S# zI4ddXTKo=so$!6KDvco~VlLoUDAo`Muwy64%e#j6Kf(F=n%dUl=#a!h-nE-msEb&k z`ps*o99F1{Nll_xOQ=^+tlPjh;!vy)L$TIDv0lfmT58ujb?oKU%w@GXpkNmb)ZJGH z1 z^8e2XsvStRq@;#A5I_UZ0iLUgmWvhnB(CEZxhn}uQhoE8nl>t6Mtuj{J%5^?R6E|3 zm+!L?n8Ecw!Ve#FfaCI0T&Ln*8+Wr4u8?A%>^8U|@fKt8Ku@+%fUVhSGUylojdGI_ zC~iQodCrHnAo)Z$HXP?XlDGVhnMYWvJd0HuwpDC}R-hcUAMf7fy{#bcD|?i`q2~NY z3jPy<9q1An4dGHi6h!d49*!*vlsS%;Hmg61$!xADg95nx`l$@Q7}TmtO;N^|2g7j zPRqPZ&)JoD1@$S$>1mmQzpLseeE$zLsD9!HN-O~nr{=>Sj*?@mkiJnIi1{1*ex*0* zbfBEg0Udcs;7=L_HVJbc~&ovBkbCoS*owlEm0mTD9P#n~{x%Rwgc}3#pGNj5Uy-*scDwQiA{N>oV)w>ZD__yO zz?_@T$K&<+d^(+~6TSJa&O=4Kvb^Dj8~Mz_)XBHWW%B6L>D|2tdhJqZ#SQCAg{~WJ zO8UgxsL~A)}Y3(l($TFM9kV2f1ozw^jH((xlIAnDK2? zoGju8R9zSw+a4SHm$>J*Scnl<>u{(Ak}^?tK4d0eB}sl;q8(qMzu;=U_-1=~S-6_8 zB<;k+!(pv$@Y#@hyB%m!_z)$C83|e~ZX(0~gJ2zA_)Z_d8{nq!)3X3Qi+ay&I-wS% z=nw^A3L+G|L;)!<-pdztbj2Wz=L8M7oMeKocu}!lW}ZtEN^GIv-ylc@3il9sWsdC5 zyMmL+t>d!?KLi`#&9eVMS-+s5odVJ-IQYn~`pfs3d66HWXRIK|kt1jk%Gag4=xP=m z@id(cXu`UoP4X3t?*JMp1uDq{ZlJ;R7sL7tVHLJ$ExyFhl%?^XDfCyuE(Xos{~Per g5dlg`N8#uN68R_J*5%w-&9q-at6cv>TyIhTAN||FMgRZ+ literal 0 HcmV?d00001 diff --git a/app/amazon/__pycache__/main.cpython-39.pyc b/app/amazon/__pycache__/main.cpython-39.pyc index 46346d6b185fbc0b6f77fd8f6e4c5083cf7364f0..f85175b6092ace254aa20dd0b2f9874105fbbf39 100644 GIT binary patch delta 3506 zcma)8ZA=`;8Q$63+q>hA3E)KIEjJ6f-aR+(+z! zla^}b%=v$jUyEcb`%sFKviX3!m$cTycvL~y24MTFWLh^ZHJznf(a50zTU;rlzkyB2 zyU0!UuG}8gyf>vWaf*y~<%L0MiqM|XH!Sy{togJ8&3|1SbLCyLGR|{O9Fy{r7KFJ? z=7m{7D`E|vM$b=qIm90KG>;eOr5l1)GUL)V%!x!eEnIw1E7i)b3VE_$m>^>WEs|jQ zr^rY*5yoU9jCNarygWf*WtST5aHE9t04?Qdf{jE|Ku> zpR&wO1Rf(tSnb}@`5y)*N#qf5I;O}J$FaqvW(Ts=Na&^+w^Vb89%g5QRa>}%j(`X4 zL%4rTdH`$#>_)H~;@%B5jlTi)(Q}qy5lggO8UYcxfKy2mEq9(w5Ridu#>I2t%8Q!> zlnyW~YtnTx=FYokJ$d3}>b^d1r_X62vma#Q9hqGc3Fd2cY`1LrW((MrqBqMW+KKb+ zLfC<@6X6)^4t0_mmI=lBoaOszF*cMSY(OYQ;M9KsOEm~zL^zCa9N`3j;-M?loMc7C zjSs9x&>?Wm!M|AnAjqP)l8*UA@jt{s6wJqHH6U$fYU!!={ZLdyx(9w@k~v`f*H-mK z`}K@|IZJ!yu-88Jap^~-l6_ECLt5Bh%IZjrg~Ih=Tpm3SV0%o<$Yym-A@oW1Sa@L9 zlW2A8lp0hiqBx+Vfs$NSQ!SmRKMrbwGlh!Sx*egFeG+cz=PdMMeT53&Dk>g_CfkDo ziYGPt1lC+h?XvB|rNkk;x>U@lX?l#Q|9L! z;f!eoo2vO0InT~Uk|e?2kDNZRObdM)9aiyxRXoXUH&rwJx+9SyFvNUDR?qP1*e*-G zKp$ml?dGNjutOPkkSzVOWlMvmk)dJi;D%#2nQ^4m%Wl^;_ARp-^CwbbYOg-j;TY#b>V}*PI zaWj{|jql_m!mPST>6)EB2;T3rH|zdbaRo~BD#8%LI0BznWd5}+MIl zMdGZysh(t6v?&t0i00)SQOZ(Hdr6etX;NjLi($4wnT+fPFFR-&IhxQ9CQ~|J%_;1P zdZs3OPiX?JFDTo45@1k@S2Rrf(Sv8~5|%Cl*dD4s4Qn5uc{Gh7I5K9(xAl-Do7%SN za6MYDAgsGIY~Tw+Mbl>iVnOp#(n<_0bN3v!^s&EhYgSTFw0(Hq$CH+xrjyvThR|og z*2@kwzpPxr)|V0Z2rI099c@zx(+H6twJf@29&0!IyuGzOi`Ewr*7AzBuONICVQItA zNfztSNC*2_M;m#B{jH;goMTm;yU8#+(|NS~OW>NrE9~A2v!A^B`n{h#cki8d==1Eo zPG##^Fuw&CJVwLQ1Io*6yyc@Wp#2*2cQun!Y*$w;G1!@|Q@i;VTFFH_dSOE7O9*R| z0XADUb(JOtXg~Y3t3JMxlmCYujENJB`KWOzp3G?aWj$&m(rXA@nFLFmALP-|II>0=!Z#7Vh45{J zR}sF!_CM4&j)lS*1(zVS zu#)bJGFRQq{I%}ABJ9;)Mr-|**y{oUWsA}Ja_0b*=$FA1^9<;!rc)D+)3!a6u!Y~< zQz3Vt^Dz7Ep1mNi%AShxSHPeIs2}ZoJK`$w9D)atX_>Z^HB5{0^KlefVt(h+i6;z* zy^cNkPZQuZ}da&-QhWH=+~2A$gypSOuB|Dj^&|z*hl( zRKVSsvFIRHixBWopr}FWM!1f^Rls-A>sVbGo|hWXRt``C|7NQo6bW7;iQeLp0`G(2 z!i{0}p8GV_`UJ4X68r+B al!Qn<{NoJabA?=?;JEOgFYFC^$-e=jBqgl? delta 3463 zcma)8Z%|a%6@T}=-M722EPnzE5`|qr-3Llg5F;ug8VLT2jTwnslXb&;!Xo?Ldf!`A zx`=OI|+J0!8>AYz^^utD-cBY-o_@V7|rsv#e zz)&(%-tgP|&N=tobARXDbKlqmdHW0r#PjlU1o-}R z!revctHCpkASeK~&q^dU(~2ikv<8J7mZL@*FnX7>X?Z=l!u}|)X?aT;7B7&Yri{?< zx7hFzWHy1&;VY$g^X|zf?9Ho5E%AL;P7Sq?aza) zl%L~L&_9WKeHC~9xb4JO**3s(K>JcQ=p7*;_AhUQVm^G zL|d$Hu*u<3NSIcSkxaFAv)|_YuA~7|5<-v>!U)UQk8)F_npOK->ldWV4T+@I zQ($Fo2N1+!DL`D3NZ|R8>}Hex9i(ga&;F|<)CTH3icE0@TTH07KShlm%`{_H+&n@% z*pJziv;XRs%W{`f&3?T zyH(dYGVIQ{XXFfV*mtxUGD4sn+|v?Dy9Iqaq~3Gl>Z8PC4!D;`cCzK2@v)EcZxu;& zEr!*I(1fsyohoP~73{|a(atsy>``)PAu5UxoDuuWZM}-KS^xR@VK6pRNf3@A4~fIK6~rE zdvAa5!KF9v-?>BEKtM50x`cgN`73ge-3ld0oE3$;pP3_rs%Y@o?(r4-uI;9Ay;pPU zBOe4&pOMmZ9-b{(@mJ_pc00T@QjZggae~Xzj$5{?-!ybuf)m`(Iup86SDozh@XB3t zTt;(y1`JaJ_6@2jL5Em}A@nzZ{(Mw3(*qXrn?!eh>|xbk%3p;MeGMUjFpR+C zs+|2t^-h;UQGf+c_W`7FFz%I} z1c(OAV+pILZ;sPbsM*0<>*|z#7}~zLnb2biOH0ymR4pJn1F{ZwvF@V6SG|BHe1&8NAhEM(6~>!fb%dmQ5{Ad-|xx)~~CH%_rsm zp$C0pfKeYcj>QtXsvYOC@^sNtsK&k&mCYmR*nml+>}TuNEv)}-Jn`2@p-!4`u9Yf%yNpQsZK^~nVN7m>h!X<>u2(Kf&fpC#cZrF9Q4TgK*is9t& z>gBBY(BcZhT>n+_oaV4-U}(9ZUN~nwqAAqk-WL|(SwVvH!(uH*WnOkuv!AqV5#g`~ zH-~e}al#>l6l>pHQ|feD7d-)@sHabhs~R<-?+$OC2xEn%@n+4Aoz7k#doXtH{+-M9 z_4T0$U4tGh7HQqW_sXsAzdv&C(ygs~yPP6}F2TS`@zY#1<|h~Vz*crN4PT?C?MfM@ zMR|)o4w`7Lb6drF42WWpN>aQISUgl3@ClPgd|M zL_fBCK+b-Ae>z!w^3cY{%$lETwmankttyN?t>)6_Oas?XktCi2$ ziLa0lfw~a3A>da9|0uDggl^G3e9cF|{z0)?Dc*?mECNREG{1LnG`~C_Ek{`p0P|!5 zmHC2~xI}MZQI2VhvUAR*_@rn_rYL{-oheSGMIVH3eA7jm3)5EEZF$ zoYZp9)9m}(eq-gvlkp)#ueS_ifM2%!f_37=+4Q>zi|pL?Zb}+zdO&N%lWIl)yaXRV ZDJBJ^2L3S+zf>RvP6}T<#omCI{1;-{9F_n8 diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc index 33ee5177427969f756cd0702dcdcc0d6cc78ee89..d40d3792cfd33e930a855d76d1a340a1f99da12e 100644 GIT binary patch delta 107 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 P=8LrzR_oUubAbFWxby;= delta 7946 zcmbU`3v^u7aqqtUf3^CrWPL5`vyx@&XG^k#Y}rCK{>UHshp@F??|YI~pWXG{UCTCa zSz?=SEhBv4rJ*TJfHa(jCTV$)5`t~)gp$%jC?o|sbDy-573k@y zbar;`y>sWzotZl`_wEn>KrVhvoIZ!cD!|{G_pbzI-n`dYKrY`~bCLXtxybhb{u9Y+ zn9y|z2a67fea(F>a)VSNH$NaqrE<#y!g>8ELWD_jbHinv621y31si|?hS0arbI zHozw`O<1OGb0R7#!n7b6XNaWFL(DWoPLa4xGAo9o0(~W_Q;dquEkK`Lu}hW_5;=`M zBYJv9u}K!U&?`t5#jY20!iYepCF=;GPXzTu2%2FWX2Q5NHU5HRhw+#AxLz{!CWPQ? zifNM2a|;Ah&vUhorKmWhG|twg82PdUdh@095&W*>tTTW*gHzX~ zsM8lvZ;~=Ob^n1Bc@`({PmyOXAU`T)bMiAO>KsmeCPi)N6@u0%LCu^JVaL$+ z@l}Q}4fy2~rp__niBNFGAm|?cvewNaC3A>*4yjsqm9Si6E77x^##)DAU^L{5syg4{ zh$oFr8XvDwO`N5-Ue!y1fq}VZL!Sei-tj^cB^S`_c~nAY8CaOOJ^o} z_%{Qt*I5m2VkUOt0*IKK81+Wt7R|&;%(@Ebnf-`HBduU7%!TAWw$*$`wxW|vVE;)4 zZ3`cdxrb&ly`@#}A+(5fTRPg7!jg1Z3X~&O0N^J0MBD%b(X6wBICD#D-)2G!*v7KL zi#ABe1Y_GGubkR~S z|7a*8Ys-a0;aGSwnRNbxXk3G0wX$2%zfUq)XGSlnWcO!0Z@(&He>Q?utUt5O&Bf5c zqN+YBAB(E!8^I`D$NoIi?Ya)>IuNuWXlJiyR@oX6MHSE*X3rWgS|pIe81ZtYv5?%7*RB(<>eyWcTj!MYM!{?LF661F zzTgPWV9yrbm6Hw~eTGOh1SYUVhC*R)&^IP0cNN75X<;uF?-<&Ii`;;K%gdF;cY_*J zEpjk6CR1Njrq?5l1wl8C08<(WQ{0bg^o7H6P@)HLlxrciLywbkReRa3C40$s_Aez% zv##9|-3PNOl8(|k(#Guwt^&@$Ia4kPvh|1>pD)k}9ft9*uwzSaY~PInG$H6jz|C+7 zF!~z)QDCF?|Y)WeQhqFkBYPzdsYMJ@t8Dy zajl?{Rf`meghzeH!TrSurR$Ki9e_s<=B=#oEV*{us%09U$l>`&LL1()ynFTFED^6 z^t|%#Me3BM(FL&MECMbVmwAzN84INI`ux#ADELnD`IW^afd@b}Mtz690ZCKnz#Mc1dj(!z{cSJ@dRBfx|I(=}f5+uq9DJYGTV*71pkrAn`(ItyT(8iA0Fn zryY`e26*km)pbXHy-x_%>4j+8r0)1dc63!u;$$>mDU_OFUXfBXyaXz*7Ql;@qUnMe zn4`%gwJOD@bRbc&WR3}w`bbmMq7+YONo%m?lXN5Eq@Hd9dD|4X)IKFHkQk}10~t${ z5`}QO(+lUeNT@75Jq?pP{%CT>uvuCw*(KwI7%zosrF=0x(0|1CuP)2}Pa?!!L^x3d zTVAKQaLZCBn_OLKS+A)OS}&|FF5Mt?Ddnf2v{cGr17y-jhm~^8SR*=Yoon{w)=Jk; zT%$83V^}YBvvtj-WFtG=yf&fjHV-N|BXz>`Sq(@!C_A&HO{j~YC{@Hg3wH<`MEZ^e z^zKFU)tnP*sRq<=gW^`I9uSml#iLX!HPQ{z<|#93l$Es9uAJH@Oqz~hwTY`br7bXP zxw0HQVJl#@(l({`r~vD|sL?T{Wr?XrF@jfZXAidIX7|miY%8dY%=+67_DV~wZl|=1 z{l2A?^s<817*W`{){!6x2*Zl zn1S=VSVLQrkq6E-Y_#nS!q}#Eg{bVMb|p~;6qoLtzWViVRb6_XUAk-H;&-39JpDHp zpFex?xwDt2Zbjs~&vSv%kR?7{wU0ruITjn!n4Mbp zvt9~>p339yh1C)DN_h|;<+C% z)fAM+F%VK-4;;clEG;PN4T36<$Pq0^@sx$R4DJt-#0xsr!i!F?e9W(!s60UB$dFb5 ztk9x=3GzBGH~~J0=tBsm+0OO*$?fd1_0?Itw!zGxnj#}HFJyFjmR(tYIunx{eHsUh z{vjHIf~=S&HXOB;Vn2EaeezsaQTd|Co(83&Hw@*)Y%=*6<9i?5&~>*1!aD!|)M_w_ z?A5N{96kcswz(2)~pCRZ)FfS}Jg$qk)@E6I0H-vO) zUTmA9zQ_pXTt9nb>xY@I;S^ksW&r5+*yzLTSKA&U@3E6T-Q;2Ra!VH)zwk%$*dcda7c zie%gdc!8KJuV2Srl$ojs{0QDaK;C43=gq9=V)13TlW``CHlJDxH~mg>!;XDAa)CY2 zTM1XMzwcd7x|nhIE_f%oarYwys7CF8Pd)bTLl0lQ@9S5ddW!xW7xc2iJrCLb8PPQe zeC&sNIurbm@r@g?bN*a%+oFG{mJr+__(oN0P?jaQOAbQC$BQU4PU7di4>5j%(YC5V zBf?wA{H;n;j~)6vnOa3uU>oxt^HK;O0l1giA@qcO!Q=cc1h&1fxAG8|1ETdJQ>>976gUJPeJqf!Z0B{7eFihSqgPOL zQ4t=MPAV37?SaH6IopM(ZdyMhOdF&$nC((rQKMpMhY~8q!KGM%PrBlQ*DZLaLQe5? zDI=aCWyUiVu?t?i4o2fykOUJZB}0K_A^T=c=;P^1y5xX5htQ>*9lTorqZ|+@7X`wp z2MhQ_v!a7pS&}{=K;`6?@+M3~IP%#-p@GYOO=x%{%a<}|MC{>wmvFuX=XD8fr%c=}HzCMX%VPa4;)5N}7@@ z6;If(^a~C_$!DDuk7q#gcSF6@Bb7*wQCmEZi&3g1vS5Epqjs!b@hNb2pP))5Z`v^< zXl@FUg-GyeHij>%*Cgzt2W{Da> zc#*z}esbMHKdC%#(`oJjFH%*>r8ngh2n^R9IADTo1|Iwwd+9(G1cna|WRhLXaBxGR z54yV{QoX~bjnm~JLVuf*&W|!+xnY}q41r}v2P;}o^rXo)7T{J z!TucbAMCICml@y1jturzf5(tZi!D4-@o>2)Dq~RL2U@j-Ly;(ilt^qes;14wX@4jN z?@q_RC{(L9?KTFFF;r&vcyn^|wYtE8f-VRR7_e@BZ5!6knOSBDcMXqrWR zVld-N@`oy|rr=whM%ph6_Vgndy+;T2Ko}6gYKL3i+&{c$!p%<)ua$P46K;V8I(XS+ z%AxeKd}7oUz?hNK=0FMI1l;(URfjK~1@PW!WltY!YUC0YqnJF_@m=tMH*bP(8T6DAn)?u^b{# z8b%%n5c(quAE{OH;modJJp+ZsDtd6E7V<88IdGPo zX8VU@6}W4-nwKCs-#0J(=3P;9efIJ2p2St8`3-`6m=tpWR&wcEr{A5t{nC?Xpp5q9 z(%m@96Cig|%z|3|a0;c?mmzfA%7l%VXP|X zF$5C`Isic8^BvQwyCt}n0?lv#A7*CDM+=%TDyYr~fBj0OP%}!Ja#z(MQyQXPNVpLw zVCij48EvcLvEX5pYEgzQfXVNmH@^adLK=H(^fFPCKNx!&164dUWqS)J{Tl)wTNYlf z-McZyYhpaG3 ztJb}~(U^QaN~_%@&?>4PgTs8mqS_)+Uo;lc&gfThGD@nMaSLMHJSn@W_FZtM17jNB zxf+ijCccU7d_PU7G8BS(0Kl&mzT^1(PFG?-54~Ke7HoQvjH`E%>WW}A&Q8p7`b>Lvban2&zKi}Tw7TiHaRBdp9y{en zpYu$|-Y;W8pTbd`uFXbk!`0SFghHqgwNQt?idD7tO4^9q^Rb=d`)mtOWpcbe15FEA z2rWwMkZd*kXj}$s9yr!HXUz-8y0r@-KRz3gl%FfE+|@W~zU*wq=DhX3z;Lt$NTAwp zL_S}xP~?-101ZbQS`q!f8Vpb11@?{O_av~!_7KRkJw3a75Xo44edDo$ds-7N#GQ=q z?!U0fgTo%gP9pda0pZ`gkdf8wFHe*-?}a<% zr&f48#BX~-SmLY{K6euFb54lACyn_6L9e&ZK|{eo|4_^q9IS6>WSKXY)_w}CRC5g8 z{qYA1US-ED(0BDa_gp^n)TQK~(OMMk4+wt2d^fu-^*!}1`@8pn?N8oZZUHAL!LbL~ zb2qmYqRHX8;CMt8L+}ZNw3v7+Qfy@zieEdyHf-~h?mr3%Cf5L6)uA;5iVy5-jd zKQ<2{;31If@qTQUfu{P5k#US_S`2*?yQ@)wH3)d*M^D?vAFQ7Qj3o0Xa{df!#$cWC`n-+iTxUW^2zf4qT^vWOnf*z8wNd|>Q|~7K1E(FZN&o-= diff --git a/app/amazon/approve.py b/app/amazon/approve.py index a16c8db..61e3545 100644 --- a/app/amazon/approve.py +++ b/app/amazon/approve.py @@ -1040,7 +1040,8 @@ class ApproveTask: for country_code in country_codes: # 检查是否收到暂停请求 if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "WARNING") + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "ERROR") + driver.close_store() break # 打开店铺 @@ -1058,7 +1059,7 @@ class ApproveTask: import traceback self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in e: + if "与页面的连接已断开" in str(e): iskill = True # 更新已处理国家数 diff --git a/app/amazon/asin_status.py b/app/amazon/asin_status.py index e69de29..5415575 100644 --- a/app/amazon/asin_status.py +++ b/app/amazon/asin_status.py @@ -0,0 +1,712 @@ +import json +import sys +import os +import io +# sys.stdout.reconfigure(encoding='utf-8') + +import time +import re +import traceback +from datetime import datetime +from DrissionPage import Chromium, ChromiumOptions +import requests + +from amazon.del_brand import AmamzonBase, kill_process +from amazon.tool import show_notification, get_shop_info, remove_special_characters, split_currency_values + +from config import runing_task, runing_shop, base_dir, DELETE_BRAND_API_BASE + + +class AmzonePStatus(AmamzonBase): + mark_name = "状态查询" + + def SwitchPage(self): + """ + 切换至 管理所有库存页面 + 1、等待 //navigation-favorites-bar[@class="hydrated"] 出现 + """ + navigation = self.tab.ele('xpath://navigation-favorites-bar[@class="hydrated"]') + navigation.wait.displayed(raise_err=False) + page_btn = navigation.sr('xpath://internal-fav-bar-links[@data-internal="navigation"]').sr( + 'xpath://a[@data-page-id="ezdpc-gui-inventory-mons"]') + page_btn.wait.displayed(raise_err=False) + page_btn.click(timeout=5) + + self.tab.wait.doc_loaded() + # 等待搜索框出现 + search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') + search_region.wait.displayed(raise_err=False, timeout=60) + + def search_asin(self, asin): + search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') + search_region.wait.displayed(raise_err=False) + time.sleep(0.6) + search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( + 'xpath://span[@class="container"]//input[@part="input"]') + search_input.input(asin, clear=True) + sku_ls = [] + for _ in range(3): + search_btn = self.tab.ele("xpath://kat-icon[@name='search']") + search_btn.click() + + load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") + # load_ele.wait.hidden(timeout=3, raise_err=False) + load_ele.wait.deleted(timeout=3, raise_err=False) + time.sleep(0.5) + + sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=3) + if len(sku_ls) > 0: + break + return sku_ls + + def search_asin_action(self, asin: str): + load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) + if len(load_ele) > 0: + load_ele[0].wait.deleted(timeout=3, raise_err=False) + time.sleep(0.5) + + sku_ls = self.search_asin(asin=asin) + print(f"【{self.mark_name}】{asin} 搜索到 {len(sku_ls)} 个SKU") + + def clear_tab(self): + all_tab = self.browser.get_tabs() + close_tab = [] + for tab in all_tab: + tab_id = tab if isinstance(tab, str) else tab.tab_id + if self.tab.tab_id == tab_id: + continue + close_tab.append(tab) + print("需要关闭的标签页", close_tab) + print("当前操作的tab_id", self.tab.tab_id) + self.browser.close_tabs(close_tab) + + def run_page_action(self, appoint_asin: str = None): + """ + + miniprice_info : + { + "B0DSJGJBWV" : "19.81" # asin : 最低价 + } + """ + print(f"【{self.mark_name}】,开始执行") + num = 0 + retry_num = 0 + already_asin = set() + get_page_faild = 0 + + while retry_num < 3: # 最多重试3次 + try: + print(self.mark_name, "指定asin操作", appoint_asin) + self.search_asin_action(asin=appoint_asin) + + load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) + if len(load_ele) > 0: + load_ele[0].wait.deleted(timeout=3, raise_err=False) + time.sleep(0.5) + + # 获取当前页码 + try: + page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) + if len(page_pamel) > 0: + current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text + + # 总页数 + total_page = page_pamel[0].sr.eles( + 'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') + if len(total_page) > 0: + total_page = total_page[-1].text + else: + total_page = 0 + print(f"【{self.mark_name}】当前页码: {current_page} / 总页数: {total_page}") + get_page_faild = 0 + except Exception as e: + print("【{self.mark_name}】", "获取页码失败", e) + get_page_faild += 1 + if get_page_faild > 2: + show_notification(f"【{self.mark_name}】获取页码失败超3次停止任务!") + break + + sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10) + print(f"【{self.mark_name}】获取到 {len(sku_ls)}") + # for sku_ele in sku_ls[0:2]: + if len(sku_ls) == 0: + yield (appoint_asin,"查询不到") + break + + for sku_ele in sku_ls: + asin = sku_ele.ele( + 'xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]', + timeout=3).text + print(f"【{self.mark_name}】ASIN {asin} 找到....") + if asin in already_asin: + print(f"【{self.mark_name}】{asin} 已经处理过了,跳过") + continue + + # 状态 + status_ele = sku_ele.eles('xpath:.//div[contains(@class,"Status-module__container")]//kat-label') + if len(status_ele) > 0: + statu = status_ele[0].attr("emphasis") + else: + statu = "未获取到状态" + + already_asin.add(asin) + yield (asin,statu) + print(f"【{self.mark_name}】",(asin,statu)) + + # 判断是否存在需要翻页的情况 + page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) + if len(page_pamel) == 0: + break + next_page_btn = page_pamel[0].sr('xpath:.//span[@part="pagination-nav-right"]') + class_str = next_page_btn.attr('class') + if "end" in class_str: + break + next_page_btn.click() + num += 1 + print(f"【{self.mark_name}】【程序计算】正在翻页,已翻 {num} 页...") + already_asin = set() + + except Exception as e: + print(f"【{self.mark_name}】处理跟价操作异常", e) + traceback.print_exc() + retry_num += 1 + self.tab.refresh() + self.tab.wait.doc_loaded(raise_err=False, timeout=120) + + +class StatusTask: + country_info = { + "DE": "德国", + "FR": "法国", + "ES": "西班牙", + "IT": "意大利", + "UK": "英国" + } + + def __init__(self, user_info: dict = None): + """初始化审批任务处理器 + + Args: + user_info: 用户信息字典,包含 company, username, password + """ + self.user_info = user_info or {} + self.running = True + + def log(self, message: str, level: str = "INFO"): + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if level == "ERROR": + show_notification(message, "error") + print(f"[{timestamp}] [PriceTask] [{level}] {message}") + + def process_task(self, task_data: dict): + """处理审批任务主入口 + + Args: + task_data: 任务数据 + """ + try: + data = task_data.get("data", {}) + task_id = data.get("taskId") + items = data.get("items", [])[0] + shop_name = items.get("shop_name") + queryAsins = items.get("queryAsins", []) + + user_id = data.get("user_id") + stage_index = data.get("stage_index") + final_stage = bool(data.get("final_stage", True)) + + # 用于测试 + limit = data.get("limit", None) + + if not task_id: + self.log("任务ID为空,跳过", "WARNING") + return + + # if not items: + # self.log("店铺列表为空,跳过", "WARNING") + # return + + if not queryAsins: + self.log("queryAsins 列表为空,跳过", "WARNING") + return + + self.log(f"开始处理审批任务 {task_id},共 1 个店铺,{len(queryAsins)} 个国家") + + from config import runing_task + runing_task[task_id] = { + "status": "running", + "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "total_shops": 1, + "processed_shops": 0, + "total_countries": len(queryAsins), + "processed_countries": 0, + "total_asins": 0, + "processed_asins": 0, + "success_count": 0, + "failed_count": 0, + "stop_requested": False + } + + # 检查是否收到暂停请求 + if task_id in runing_task and runing_task[task_id].get("stop_requested", False): + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") + runing_task[task_id]["status"] = "stopped" + return + + self.log(f"开始处理店铺: {shop_name}") + show_notification(f"开始处理店铺: {shop_name}", "info") + + try: + self.process_shop(items, queryAsins, task_id, user_id, stage_index, + final_stage, limit=limit) + + # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) + # 更新已处理店铺数 + if task_id in runing_task: + runing_task[task_id]["processed_shops"] += 1 + except Exception as e: + import traceback + self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 更新任务状态 + if task_id in runing_task: + if runing_task[task_id].get("stop_requested", False): + runing_task[task_id]["status"] = "stopped" + self.log(f"任务 {task_id} 已被暂停!") + else: + runing_task[task_id]["status"] = "completed" + self.log(f"任务 {task_id} 处理完成!") + + except Exception as e: + import traceback + self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") + if task_id: + from config import runing_task + if task_id in runing_task: + runing_task[task_id]["status"] = "failed" + runing_task[task_id]["error"] = str(e) + + def open_shop(self, max_retries, company_name, shop_name, iskill=False): + error_info = "" + driver = None + for retry in range(max_retries): + try: + self.log(f"尝试打开店铺 {shop_name} (第 {retry + 1}/{max_retries} 次)") + + if iskill: + self.log("重试前先杀掉浏览器进程...") + kill_process("v6") + kill_process("v5") + time.sleep(2) + + # 组装用户信息并创建驱动 + user_info = { + **self.user_info, + "company": company_name + } + driver = AmzonePStatus(user_info) + browser = driver.open_shop(shop_name) + + if browser and browser != "店铺不存在": + self.log(f"成功打开店铺 {shop_name}") + else: + self.log(f"打开店铺失败: {browser}", "WARNING") + driver = None + continue + + # 判断是否需要登录 + need_login = driver.need_login() + print("【是否需要登录】:", need_login) + if need_login: + self.log(f"店铺 {shop_name} 需要登录,正在登录...") + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:", response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] + + login_success = driver.login(password) + if login_success: + self.log(f"店铺 {shop_name} 登录成功,正在重新打开店铺...") + browser = driver.open_shop(shop_name) + if browser and browser != "店铺不存在": + self.log(f"成功打开店铺 {shop_name} 登录后") + break + else: + self.log(f"登录后打开店铺失败: {browser}", "WARNING") + driver = None + else: + self.log(f"店铺 {shop_name} 登录失败", "WARNING") + driver = None + else: + break + + except Exception as e: + import traceback + self.log(f"打开店铺异常: {traceback.format_exc()}", "INFO") + driver = None + error_info = str(e) + time.sleep(10) + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(3) + + # 检查是否成功打开 + if not driver or not browser or browser == "店铺不存在": + error_msg = f"店铺 {shop_name} 打开失败,已重试 {max_retries} 次,跳过该店铺,{error_info}" + self.log(error_msg, "ERROR") + # 从执行列表中移除 + if shop_name in runing_shop: + del runing_shop[shop_name] + return driver + return driver + + def process_shop(self, shop_item: dict, country_codes: list, task_id: int, + user_id=None, stage_index=None, final_stage: bool = True, limit: str = None): + """处理单个店铺 + + Args: + shop_item: 店铺信息 + country_codes: 国家代码列表 + task_id: 任务ID + risk_listing_filter: 风险商品筛选条件 + """ + shop_name = shop_item.get("shopName", "未知店铺") + company_name = shop_item.get("companyName", "") + + + if not company_name: + self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") + return + + if task_id in runing_task: + runing_task[task_id]["current_shop"] = shop_name + + # 将店铺添加到正在执行中的店铺列表 + start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + runing_shop[shop_name] = start_time + self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") + + # 店铺打开重试最多3次 + max_retries = 3 + iskill = False + # 处理每个国家 + for value in country_codes: + country_code = value.get("country") + all_asin = value.get("asins") + # 打开店铺 + driver = self.open_shop(max_retries=max_retries, company_name=company_name, + shop_name=shop_name, iskill=iskill) + if driver is None: + self.log(f"任务 {task_id} 启动店铺失败,结束任务", "ERROR") + for country_code in country_codes: + self.post_result(task_id, shop_name, country_code, "", "", is_done=True) + return + + # 检查是否收到暂停请求 + if task_id in runing_task and runing_task[task_id].get("stop_requested", False): + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "ERROR") + driver.close_store() + break + try: + self.process_country(driver, country_code, task_id, shop_name,all_asin=all_asin ) + except Exception as e: + import traceback + self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + if "与页面的连接已断开" in str(e): + iskill = True + + # 更新已处理国家数 + if task_id in runing_task: + runing_task[task_id]["processed_countries"] += 1 + + # 关闭店铺 + driver.close_store() + + # 最后回传,标记完成 + try: + # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) + if final_stage: + self.post_result(task_id, shop_name, country_code, "", "", is_done=True) + else: + self.post_stage_finished(task_id, user_id, stage_index) + except Exception as e: + self.log(f"回传结果失败: {str(e)}", "ERROR") + + # 从正在执行中的店铺列表中移除 + if shop_name in runing_shop: + del runing_shop[shop_name] + self.log(f"店铺 {shop_name} 已从执行列表中移除") + + def process_country(self, driver: AmzonePStatus, country_code: str, task_id: int, shop_name: str, + all_asin:list, + limit: str = None): + """处理单个国家的审批任务 + + Args: + driver: AmzoneApprove驱动实例 + country_code: 国家代码(如 UK, DE, FR 等) + task_id: 任务ID + shop_name: 店铺名称 + risk_listing_filter: 风险商品筛选条件 + """ + + # 转换国家代码为中文名称 + country_name = self.country_info.get(country_code, country_code) + info_mes = f"开始处理国家: {country_name} ({country_code})" + self.log(info_mes) + show_notification(info_mes, "info") + + # 更新当前处理的国家 + if task_id in runing_task: + runing_task[task_id]["current_country"] = country_name + + # 切换国家,最多重试3次 + max_retries = 3 + switch_success = False + + for retry in range(max_retries): + try: + self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") + if retry > 1: + # 刷新不行就重新打开店铺 + self.log("重试前重新打开店铺...") + try: + driver.close_store() + time.sleep(3) + driver.open_shop(shop_name) + except Exception as e: + self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") + # 如果不是第一次尝试,先刷新页面 + if retry > 0: + self.log("重试前刷新页面...") + try: + driver.tab.refresh() + time.sleep(3) + except Exception as e: + self.log(f"刷新页面失败: {str(e)}", "WARNING") + + switch_success = driver.SwitchingCountries(country_name) + if switch_success: + self.log(f"成功切换到国家 {country_name}") + break + else: + self.log(f"切换到国家 {country_name} 失败", "WARNING") + + except Exception as e: + import traceback + self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + # 如果切换失败,直接返回 + if not switch_success: + error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + self.log(error_message, "ERROR") + if task_id in runing_task: + runing_task[task_id]["processed_countries"] += 1 + return + + # 切换到库存管理页面 + for retry in range(max_retries): + try: + driver.SwitchPage() + self.log(f"已切换到库存管理页面") + except Exception as e: + import traceback + self.log(f"切换页面失败: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + if retry >= max_retries - 1: + if task_id in runing_task: + runing_task[task_id]["processed_countries"] += 1 + self.log(f"切换页面失败重试退出", "ERROR") + return + + + + # 处理所有需要审批的商品(通过yield获取结果) + + # 指定 asin + for ap_asin in all_asin: + print(f"【{driver.mark_name}】开始处理 ->",ap_asin) + for asin, status in driver.run_page_action( + appoint_asin=ap_asin + ): + # 检查是否收到暂停请求 + if task_id in runing_task and runing_task[task_id].get("stop_requested", False): + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") + break + + self.log(f"ASIN {asin} 处理结果: {status}") + + # 更新任务状态 + if task_id in runing_task: + runing_task[task_id]["current_asin"] = asin + runing_task[task_id]["processed_asins"] += 1 + + runing_task[task_id]["failed_count"] += 1 + + # 回传结果到API + try: + self.post_result(task_id, shop_name, country_code, asin, status) + except Exception as e: + self.log(f"回传结果失败: {str(e)}", "ERROR") + + self.log(f"国家 {country_name} 处理完成") + + def post_stage_finished(self, task_id: int, user_id, stage_index): + # import requests + # from config import DELETE_BRAND_API_BASE + + if user_id in (None, "", 0): + raise ValueError("user_id is required for stage completion callback") + if stage_index is None: + raise ValueError("stage_index is required for stage completion callback") + + url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/stage-finished" + payload = {"stage_index": stage_index} + params = {"user_id": user_id} + + max_retries = 3 + for retry in range(max_retries): + try: + self.log(f"Attempting stage completion callback ({retry + 1}/{max_retries})") + response = requests.post( + url, + params=params, + json=payload, + headers={"Content-Type": "application/json"}, + timeout=30, + verify=False, + ) + self.log(f"Stage completion callback response: {response.text}") + data = response.json() if response.text else {} + if response.status_code == 200 and isinstance(data, dict) and data.get("success"): + self.log(f"Stage completion callback succeeded: task={task_id}, stage={stage_index}") + return + self.log(f"Stage completion callback failed, status={response.status_code}", "WARNING") + except Exception as e: + self.log(f"Stage completion callback exception: {str(e)}", "ERROR") + if retry < max_retries - 1: + time.sleep(2) + + raise RuntimeError(f"Stage completion callback failed after retries: task={task_id}, stage={stage_index}") + + def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: dict, + is_done: bool = False): + """回传处理结果到API + + Args: + task_id: 任务ID + shop_name: 店铺名称 + country_code: 国家代码 + asin: ASIN + status: 处理状态 + """ + + url = f"{DELETE_BRAND_API_BASE}/api/query-asin/tasks/{task_id}/result" + + payload = { + "shops": [ + { + "shopName": shop_name, + "countryResults": [ + { + "country": country_code, + "items": [ + { + "asin": asin, + "status": status + } + ] + } + ], + "shopDone": is_done, + "submissionId": f"{int(time.time())}" + } + ] + } + if is_done: + payload["shops"][0]["success"] = is_done + + max_retries = 3 + for retry in range(max_retries): + try: + print("================【跟价】=====================") + self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") + self.log(f"回传URL: {url}") + self.log(f"回传数据: {payload}") + response = requests.post( + url, + json=payload, + headers={"Content-Type": "application/json"}, + timeout=30, + verify=False + ) + self.log(f"回传结果: {response.text}") + data = response.json() if response.text else {} + if response.status_code == 200 and isinstance(data, dict) and data.get("success"): + self.log(f"结果回传成功: {asin} - {status}") + return + else: + self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") + print("=====================================") + + except Exception as e: + self.log(f"调用API异常: {str(e)}", "ERROR") + print("=====================================") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") + raise RuntimeError("已达到最大重试次数,结果回传最终失败") + + +if __name__ == '__main__': + # 使用示例 + user_info = { + "company": "rongchuang123", + "username": "自动化_Robot", + "password": "#20zsg25" + } + shop_name = "魏振峰" + country = "德国" + kill_process('v6') + driver = AmzonePStatus(user_info) + browser = driver.open_shop(shop_name) + sw_suc = driver.SwitchingCountries(country) + driver.SwitchPage() + risk_listing_filter = "Active" + _shopMallName = "WEIZHENFENG168" + ap_asin = "B0F1N18XFW" + skip_asin = [] + for _ in range(3): + try: + sku_ls = driver.search(filter_type=risk_listing_filter) + break + except Exception as e: + print(e) + driver.tab.refresh() + if len(sku_ls) > 0: + print("有数据,开始操作") + for asin, status in driver.run_page_action( + current_shop_name=_shopMallName, + appoint_asin=ap_asin, skip_asin=skip_asin + ): + print(f"ASIN {asin} 的处理结果: {status}") + print("已完成操作") diff --git a/app/amazon/main.py b/app/amazon/main.py index 91b664a..36136d7 100644 --- a/app/amazon/main.py +++ b/app/amazon/main.py @@ -9,6 +9,7 @@ from amazon.del_brand import AmazoneDriver, kill_process from amazon.approve import ApproveTask from amazon.match_action import MatchTak from amazon.price_match import PriceTask +from amazon.asin_status import StatusTask from amazon.tool import get_shop_info,show_notification @@ -55,7 +56,8 @@ class TaskMonitor: task_type_info = { "product-risk-resolve-run" : "产品风险审批", "shop-match-run" : "匹配价格", - "price-track-run" : "跟价" + "price-track-run" : "跟价", + "query-asin-run" : "状态查询" } try: while self.running: @@ -122,7 +124,8 @@ class TaskMonitor: TASK_INFO = { "产品风险审批" : ApproveTask, "匹配价格" : MatchTak, - "跟价" : PriceTask + "跟价" : PriceTask, + "状态查询" : StatusTask } self.log(f"线程 {id(task_data)} 开始处理产品风险审批任务...") # 创建ApproveTask实例并处理任务 diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py index 2a4d3e0..596e22b 100644 --- a/app/amazon/match_action.py +++ b/app/amazon/match_action.py @@ -445,7 +445,7 @@ class MatchTak: import traceback self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in e: + if "与页面的连接已断开" in str(e): iskill = True # 更新已处理国家数 diff --git a/app/amazon/price_match.py b/app/amazon/price_match.py index 73ee741..cb038da 100644 --- a/app/amazon/price_match.py +++ b/app/amazon/price_match.py @@ -46,18 +46,30 @@ def calculate_target_price( # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑 return calculate_standard_competitor_pricing(my_price, total_price) + # # 第一名是自己, 第二名 Amazon US 卖家 的情况 + shop_name_1 = front_end_data.get("top_sellers")[0].get("shop_name") + shop_name_2 = front_end_data.get("top_sellers")[1].get("shop_name") if len(front_end_data.get("top_sellers")) >=2 else "" + if shop_name_1 == current_shop_name and "Amazon" in shop_name_2: + price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 + diff = abs(my_price - price_2) + if diff < 5: + return price_2 -3 + elif 5.0 < diff <= 8.0: + return price_2 -3 + # --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) --- # 分支 A:第一名是 Amazon US 卖家 (特殊强敌优先) price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 if "Amazon." in cart_seller: diff = abs(my_price - price_1) - if diff <= 5.0 or my_price > price_1: - return price_1 - 5.0 + if diff <= 5.0 : + return None elif 5.0 < diff <= 8.0: return price_1 - 3.0 - elif 8.0 < diff <= 12.0: - return None # 跳过,不跟价 + elif diff > 8.0: + return price_1 - 6 # 跳过,不跟价 + # 分支 B:不是 Amazon US,且目前是自己的购物车 @@ -78,7 +90,6 @@ def calculate_target_price( else: return None - # 分支 C:不是 Amazon US,也不是自己的购物车 else: # 正常情况下的普通跟价,调用阶梯逻辑 @@ -104,9 +115,10 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr return base_target - 1.0 elif 1.5 <= diff <= 2.5: return base_target - 1.0 - elif diff > 2.5: - return my_current_price # 差距过大,跳过不跟价 - + elif 2.5 < diff <= 3 : + return None # 差距过大,跳过不跟价 + elif diff > 3: + return base_target @@ -586,18 +598,16 @@ class AmzonePriceMatch(AmamzonBase): # 如果紫鸟里当前价格低于最低价则删除,否则跳过 if mode == "status" and miniprice_info.get(asin): backend_price = float(miniprice_info.get(asin)) - if float(current_price) < backend_price: + if float(current_price) <= backend_price: + # yield (asin, { + # "statu": "删除(当前价格低于最低价)", + # "deleteSkipAsin": True, + # "removeAsin": asin, + # }) yield (asin, { - "statu": "删除(当前价格低于最低价)", - "deleteSkipAsin": True, - "removeAsin": asin, - }) - continue - else: - yield (asin, { - "statu": "跳过(当前价格不低于最低价)", - "deleteSkipAsin": True, - "removeAsin": asin, + "statu": "跳过(当前价格低于或等于最低价)", + "currentPrice": current_price, + "minimumPrice": bottom_price, # 最低价格 }) continue @@ -924,6 +934,11 @@ class PriceTask: skip_asins_by_country = shop_item.get("skip_asins_by_country",{}) asin_rows_by_country = shop_item.get("asin_rows_by_country",{}) skip_asin_details_by_country = shop_item.get("skip_asin_details_by_country",{}) + minimum_price_by_country_and_asin = shop_item.get("minimum_price_by_country_and_asin",{}) + if len(minimum_price_by_country_and_asin) > 0: + country_codes = minimum_price_by_country_and_asin.keys() + + # 指定ASIN的情况 mode = shop_item.get("mode") if not company_name: @@ -955,20 +970,25 @@ class PriceTask: # 检查是否收到暂停请求 if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "WARNING") + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "ERROR") + driver.close_store() break skip_asin = skip_asins_by_country.get(country_code,[]) #需要跳过的asin appoint_asin = asin_rows_by_country.get(country_code,[]) - miniprice_info = {i.get('asin'):i.get('minimumPrice') for i in skip_asin_details_by_country.get(country_code,[])} + if mode == "status": + miniprice_info = {i.get('asin'):i.get('minimumPrice') for i in skip_asin_details_by_country.get(country_code,[])} + else: + miniprice_info = minimum_price_by_country_and_asin.get(country_code,{}) try: self.process_country(driver, country_code, task_id, shop_name, risk_listing_filter, shopMallName=shopMallName,skip_asin=skip_asin, limit=limit, - appoint_asin=appoint_asin,mode=mode,miniprice_info=miniprice_info) + appoint_asin=appoint_asin,mode=mode,miniprice_info=miniprice_info, + ) except Exception as e: import traceback self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in e: + if "与页面的连接已断开" in str(e): iskill = True # 更新已处理国家数 if task_id in runing_task: @@ -994,8 +1014,7 @@ class PriceTask: def process_country(self, driver: AmzonePriceMatch, country_code: str, task_id: int, shop_name: str, risk_listing_filter: str,shopMallName:str,skip_asin:list,appoint_asin:list,mode:str, - miniprice_info:dict={}, - limit: str = None): + miniprice_info:dict={}, limit: str = None): """处理单个国家的审批任务 Args: @@ -1113,7 +1132,7 @@ class PriceTask: for i in range(max_range): if len(appoint_asin) > i: _shopMallName = appoint_asin[i]["shopMallName"] - ap_asin = appoint_asin[i]["shopMallName"] + ap_asin = appoint_asin[i]["asin"] else: _shopMallName = shopMallName ap_asin = None @@ -1278,11 +1297,11 @@ class PriceTask: if __name__ == '__main__': # 使用示例 user_info = { - "company": "rongchuang123", + "company": "尾号5578的公司115", "username": "自动化_Robot", "password": "#20zsg25" } - shop_name = "魏振峰" + shop_name = "林建华" country = "德国" kill_process('v6') driver = AmzonePriceMatch(user_info) @@ -1291,7 +1310,7 @@ if __name__ == '__main__': driver.SwitchPage() risk_listing_filter = "Active" _shopMallName = "WEIZHENFENG168" - ap_asin ="B0F1N18XFW" + ap_asin ="B0FHGQY18W" skip_asin = [] for _ in range(3): try: @@ -1304,7 +1323,7 @@ if __name__ == '__main__': print("有数据,开始操作") for asin, status in driver.run_page_action( current_shop_name=_shopMallName, - appoint_asin=ap_asin,skip_asin=skip_asin + appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin" ): print(f"ASIN {asin} 的处理结果: {status}") print("已完成操作") From 1eb622d33f2494f20f192b05b533a98f1bd154c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=AD=E5=9D=A4?= <10372463+ming-kun@user.noreply.gitee.com> Date: Mon, 27 Apr 2026 00:21:37 +0800 Subject: [PATCH 2/2] modified: amazon/__pycache__/approve.cpython-39.pyc modified: amazon/__pycache__/asin_status.cpython-39.pyc new file: amazon/__pycache__/detail_spider.cpython-39.pyc modified: amazon/__pycache__/main.cpython-39.pyc modified: amazon/__pycache__/match_action.cpython-39.pyc modified: amazon/__pycache__/price_match.cpython-39.pyc modified: amazon/approve.py modified: amazon/asin_status.py new file: amazon/detail_spider.py modified: amazon/main.py modified: amazon/match_action.py modified: amazon/price_match.py modified: assets/convert.js modified: assets/dedupe.js modified: assets/delete-brand.js modified: assets/split.js modified: new_web_source/convert.html modified: new_web_source/dedupe.html modified: new_web_source/delete-brand.html modified: new_web_source/split.html modified: web_source/brand.html --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 32560 -> 32601 bytes .../__pycache__/asin_status.cpython-39.pyc | Bin 18456 -> 18497 bytes .../__pycache__/detail_spider.cpython-39.pyc | Bin 0 -> 52087 bytes app/amazon/__pycache__/main.cpython-39.pyc | Bin 17671 -> 17787 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 19235 -> 19276 bytes .../__pycache__/price_match.cpython-39.pyc | Bin 32199 -> 34191 bytes app/amazon/approve.py | 4 +- app/amazon/asin_status.py | 2 + app/amazon/detail_spider.py | 6907 +++++++++++++++++ app/amazon/main.py | 7 +- app/amazon/match_action.py | 2 +- app/amazon/price_match.py | 322 +- 12 files changed, 7131 insertions(+), 113 deletions(-) create mode 100644 app/amazon/__pycache__/detail_spider.cpython-39.pyc create mode 100644 app/amazon/detail_spider.py diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc index 94b13e42f6532fc35aae33b3a1eda6485f531d88..d75c697034c7cb7ef10f4d96e063a68708db8ed5 100644 GIT binary patch delta 186 zcmdn+kMZU|M&3kTUM>b8us`r7Gi4+1dnaZlE~d@@o$3@A12)$sA7vD%VOYRe!#tZI zMQ$$BLPkc0$&;n-8Z3GKrT80WEv7d-v0>g-@5XJfG0^bY0K0jtQGZGI$voBPJ_l`Z5Y^&dUtv gX0+UVtfYgD@#tp%>KH~wkIidpf|(d2C)FDO05Hlt>i_@% delta 144 zcmcclk8#64M&3kTUM>b8=<|A&X|R#^y%RGd7xU)-PIU^54x8(ek1|dUPF3cYU}UJ} zVPvRMs$p2bm?Ag1HC12Uri87A)s_J)!dk;Rn;}JhF7rZ0MurrQU%nP4>+6-8>^RjGNJX^ZSwxHpau7E2?7{8QnHttqEpg44b8Xi<8TX|a*FM}x6t^DK?Wj1n~r3m9vdXEUTI&ShH2$jDG- zP{THXsYqaQtCk^u3?oCWAW%#Rq$)*e@=+~)`Gyj<8V*|qun21n2T-T-TxO8Y6pmm9 zO_j~U+GR}Qr9wcvp6uTJv}@thB`wbdS=1yH(M#hB6$Mpi3m;^S9>-Tap n9@)Iq!k3lNX7gv;U#yHto8LL>GcpEkmUG?9#8@-=j=K#2_)b2F delta 151 zcmX>&fpNwJM&3kTUM>b8nCtT@lVu}sj|OAO=2;q#89Ay9YS<<)6){Yns%6OU!^lu8 z$jDHoRKu`T(U zYs<(OH~F1jz-9;iUQWhCo6lMJvNBq2ma+TA%9yZO+(n;}F<`U1>s}_ts>!S#HUO*I BD{TM( diff --git a/app/amazon/__pycache__/detail_spider.cpython-39.pyc b/app/amazon/__pycache__/detail_spider.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a8f5b8f8f9065b151e56c9efdf7694da84ede73 GIT binary patch literal 52087 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 literal 0 HcmV?d00001 diff --git a/app/amazon/__pycache__/main.cpython-39.pyc b/app/amazon/__pycache__/main.cpython-39.pyc index f85175b6092ace254aa20dd0b2f9874105fbbf39..667b4bc0baf1febda19294ded6c6954812109559 100644 GIT binary patch delta 3569 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%0AM;o>erN zx8of9K$(i|fhecYGIKOx98RVTUd?fwih`vU(;DhQ%u@|pIuqbfN*;+62L};&)6S!H z0l@K5;|$b3MDyqxLwLma!-me&Nqi1q+~UQjS;>sD#-)4$hgU5Z2Y9hBp!Ictc%gMZ zX(xsj`Ft5i`q+)eMkNKN6Tr-B(l*j`3WrvZ{1W(j*n`Gv$^?#HL*OecG5sd`t{_}R zh%MZ1dgzsTvOVn9w&vC>x?e|FNjCbvf$&X)M+b{ev43sT$u^c~Yas{N^|mI`&pvM3 zL(Z`;+KxoO3ZeYy+=M0%MtG>fCFUCGmeM-ZCWk9MDxx$I^aw(Qv_!U0b2tq!ik zS*H;wo7r0%buU_pehpl4-;e>9AGP4x{q5cL-D&5xSPdXo*YdrYw#ql zv{-5J(x)xwQfEW^`pF3UWZ&=WxVA8lBafWd=%BUofTC`%vXA%QsNH}`d4D#d_4q+{ zBz&jNveBn%NIjcrUAoU_l zBXAY)Q*;|2mzL*N9r~gGrSNAp3qq0LCz9wdDJ}3n83|WJ*ua5m5@izyJ}-2&=I7z` z2pc;X-Nnn|dAZJ>!)(U@6yo^OW+n-5q-87OVvdy7l9}(aUmjfh#QXT{S5@?=s#5Fr zj3>Fp#6$Obf?8S|H8ah&X{Pvlk-rPw4d7(@4#FxWIsT5cspnEgCmt-Tf%SD&vZ1a* KZ^U2dC;tIBtqGq1 diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc index d40d3792cfd33e930a855d76d1a340a1f99da12e..39ebc21a10a2fa5abc6602bc077b64564ac018fd 100644 GIT binary patch delta 161 zcmZ2Hjq%JhM&3kTUM>b8h*o-&IcX#Be=Wv@&Ai(C86|2M7BJQ@&t^!Go6EG2k&&Uw zpoV<{W6_(*S9A>dEf^VU1%P5oAXO>ylSOp({^1mkI&xda`@>)2@Y2m$W>e(Drm)&$EsRn>XugGBQR@zH8vc%qYOLS;O$R FBmmqhGP(c& delta 119 zcmX>zjdAfbM&3kTUM>b8sP}r6nY5AjzZPS_W?t?6j2u-4HS7}@i|$N*qGQOf!N^c6 zz{pUgRKu`%Tn~QVi_@% diff --git a/app/amazon/__pycache__/price_match.cpython-39.pyc b/app/amazon/__pycache__/price_match.cpython-39.pyc index 95a1128b6cc59e5358a3c22e07f03929792d2a95..95e7dc2b46de9963cee9b85a19b1878ba3dd36da 100644 GIT binary patch delta 12243 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 diff --git a/app/amazon/approve.py b/app/amazon/approve.py index 61e3545..54d8e1e 100644 --- a/app/amazon/approve.py +++ b/app/amazon/approve.py @@ -483,8 +483,8 @@ class AmzoneApprove(AmamzonBase): load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) if len(load_ele) > 0: load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) + time.sleep(0.5) # 获取当前页码 try: page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) @@ -1065,6 +1065,8 @@ class ApproveTask: # 更新已处理国家数 if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 + + self.log(f"{task_id}任务处理完成") # 最后回传,标记完成 try: self.post_result(task_id, shop_name, country_code, "", "", is_done=True) diff --git a/app/amazon/asin_status.py b/app/amazon/asin_status.py index 5415575..9160f21 100644 --- a/app/amazon/asin_status.py +++ b/app/amazon/asin_status.py @@ -432,6 +432,8 @@ class StatusTask: # 关闭店铺 driver.close_store() + self.log(f"{task_id}任务处理完成") + # 最后回传,标记完成 try: # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) diff --git a/app/amazon/detail_spider.py b/app/amazon/detail_spider.py new file mode 100644 index 0000000..0558bbb --- /dev/null +++ b/app/amazon/detail_spider.py @@ -0,0 +1,6907 @@ +import json +import sys +import os +import io +# sys.stdout.reconfigure(encoding='utf-8') + +import time +import re +import traceback +from datetime import datetime +from DrissionPage import Chromium, ChromiumOptions +import requests + +from amazon.del_brand import AmamzonBase, kill_process +from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values + +from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE + + +class ChromeAmzone: + mark_name = "亚马逊详情采集" + country_info = { + "英国": { + "url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV", + "zip_code": "SW1A 1AA", + "mark": "SW1A 1" + }, + "德国": { + "url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1", + "zip_code": "10115" + }, + "法国": { + "url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1", + "zip_code": "75001" + }, + "西班牙": { + "url": "https://www.amazon.es/dp/B08ZXVNYNN", + "zip_code": "28001" + }, + "意大利": { + "url": "https://www.amazon.it/dp/B0D1P17T2Q", + "zip_code": "20121" + } + } + + def __init__(self): + """ + 杀死当前谷歌浏览器进程,并使用 drissionpage 启动谷歌浏览器,使用系统安装的浏览器默认用户文件夹 + """ + # 杀死现有的Chrome进程 + print("正在关闭现有的chromium浏览器进程...") + os.system('taskkill /f /t /im chrome.exe') + time.sleep(2) + + print("正在启动chromium浏览器...") + # 配置浏览器选项 + co = ChromiumOptions() + user_data_path = os.path.join(base_dir, "user_data", "chrome_data") + if not os.path.exists(user_data_path): + os.makedirs(user_data_path, exist_ok=True) + co.set_user_data_path(user_data_path) + co.set_local_port(port=19897) + self.browser = Chromium(co) + self.tab = self.browser.latest_tab + print("Chrome浏览器启动成功") + + def close_init_popup(self): + """ + 关闭所有的初始化弹窗 + """ + self.tab.wait.doc_loaded(timeout=60, raise_err=True) + footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]', timeout=5) + if len(footbar) > 0: + do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]') + if len(do_not_remind) > 0: + do_not_remind[0].check() + resume_immediately = footbar[0].eles('xpath:.//button') + if len(resume_immediately) > 0: + resume_immediately[0].click() + + self.tab.wait.doc_loaded(timeout=60, raise_err=True) + accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]', timeout=5) + if len(accept_btn) > 0: + accept_btn[0].click() + + def run(self, country, asin): + """ + 运行亚马逊详情采集任务 + + Args: + country: 国家名称(如:英国、德国、法国、西班牙、意大利) + asin: 亚马逊商品ASIN码 + + Returns: + dict: 包含采集到的数据 + """ + try: + # 验证国家是否支持 + if country not in self.country_info: + error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" + print(error_msg) + show_notification(error_msg, "error") + return None + + # 获取国家配置 + country_config = self.country_info[country] + zip_code = country_config["zip_code"] + mark = country_config.get("mark") + + # 1. 根据国家和ASIN拼接链接 + base_url = country_config["url"] + # 提取域名部分 + domain = base_url.split("/dp/")[0] + # 拼接新的URL + product_url = f"{domain}/dp/{asin}" + print(f"正在访问: {product_url}") + + # 打开链接 + self.tab.get(product_url) + time.sleep(3) # 等待页面初步加载 + self.tab.wait.doc_loaded(timeout=30, raise_err=False) + + self.close_init_popup() + # 2. 切换国家/设置邮编 + print(f"正在检查并设置邮编: {zip_code},标识: {mark}") + self._set_zip_code(zip_code, mark) + + # self.tab.wait.doc_loaded(timeout=5, raise_err=False) + + # 3. 抓取数据 + print("正在抓取商品数据...") + data = self._scrape_data() + + # 添加基本信息 + data['country'] = country + data['asin'] = asin + data['url'] = product_url + data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + print(f"数据抓取完成: {json.dumps(data)}") + return data + + except Exception as e: + error_msg = f"运行出错: {traceback.format_exc()}" + print(error_msg) + show_notification(f"采集失败: {str(e)}", "error") + return None + + def _set_zip_code(self, zip_code, mark=None): + """ + 设置邮编 + + Args: + zip_code: 目标邮编 + """ + try: + # 检查当前邮编 + zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) + + if zip_display: + current_text = zip_display.text + # print(f"当前地址信息: {current_text}") + # 先检查标识 + if mark is not None and mark in current_text: + print(f"邮编检测到标识: {mark},无需修改") + return True + # 检查是否已经包含目标邮编 + if zip_code in current_text: + print(f"邮编已经设置为: {zip_code},无需修改") + return True + + # 需要设置邮编 + print(f"正在设置邮编为: {zip_code}") + + # 点击地址选择按钮 + location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) + if not location_link: + print("找不到地址设置按钮") + return False + + location_link.click() + time.sleep(1) + + # 等待邮编输入框出现 + zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10) + if not zip_input: + print("找不到邮编输入框") + return False + + # 输入邮编 + zip_input.input(zip_code, clear=True) + time.sleep(0.5) + + # 点击提交按钮 + submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10) + if not submit_btn: + print("找不到提交按钮") + return False + + submit_btn.click() + + continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]', + timeout=10) + if len(continue_btn) > 0: + continue_btn[0].click() + + # 等待提交按钮消失(表示请求已发送) + print("等待邮编更新...") + time.sleep(2) + + # 等待页面加载完成 + self.tab.wait.doc_loaded(timeout=30, raise_err=False) + time.sleep(2) + + # 验证邮编是否设置成功 + zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) + if zip_display_after: + updated_text = zip_display_after.text + # print(f"更新后的地址信息: {updated_text}") + + if zip_code in updated_text: + print(f"邮编设置成功: {zip_code}") + return True + else: + # print(f"邮编设置可能失败,当前显示: {updated_text}") + return False + + return True + + except Exception as e: + print(f"设置邮编时出错: {traceback.format_exc()}") + return False + + def _scrape_data(self): + """ + 抓取商品数据 + + Returns: + dict: 抓取到的数据 + """ + data = { + 'image_url': "", + 'title': "" + } + + try: + # 等待页面加载 + # time.sleep(3) + title_ele = self.tab.ele('xpath://h1[@id="title"]',timeout=30) + title = title_ele.text + data["title"] = title + imge_ele = self.tab.ele('xpath://div[@id="imgTagWrapperId"]//img',timeout=20) + image_url = imge_ele.attr("src") + data["image_url"] = image_url + return data + + except Exception as e: + print(f"抓取数据时出错: {traceback.format_exc()}") + return data + + def close(self): + """关闭浏览器""" + try: + if self.browser: + self.browser.quit() + print("浏览器已关闭") + except Exception as e: + print(f"关闭浏览器时出错: {str(e)}") + + +class SpiderTask: + mark_name = "亚马逊采集" + + def __init__(self, user_info: dict = None): + """初始化审批任务处理器 + + Args: + user_info: 用户信息字典,包含 company, username, password + """ + self.user_info = user_info or {} + self.running = True + + def log(self, message: str, level: str = "INFO"): + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if level == "ERROR": + show_notification(message, "error") + print(f"[{timestamp}] [PriceTask] [{level}] {message}") + + def process_task(self, task_data: dict): + """处理审批任务主入口 + + Args: + task_data: 任务数据 + """ + try: + data = task_data.get("data", {}) + task_id = data.get("taskId") + items = data.get("rows", []) + + # 用于测试 + limit = data.get("limit", None) + + if not task_id: + self.log("任务ID为空,跳过", "WARNING") + return + + + self.log(f"开始处理爬取任务 {task_id},{len(items)} 个任务") + + from config import runing_task + runing_task[task_id] = { + "status": "running", + "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "total_shops": 1, + "processed_shops": 0, + "total_countries": len(items) , + "processed_countries": 0, + "total_asins": 0, + "processed_asins": 0, + "success_count": 0, + "failed_count": 0, + "stop_requested": False + } + + # 检查是否收到暂停请求 + if task_id in runing_task and runing_task[task_id].get("stop_requested", False): + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") + runing_task[task_id]["status"] = "stopped" + return + max_retry = 3 + show_notification(f"开始爬取数据", "info") + chrome = ChromeAmzone() + try: + for index,i in enumerate(items): + asin = i.get("asin") + country = i.get("country") + return_data = None + for _ in range(max_retry): + try: + return_data = chrome.run(country, asin) + self.log(f"抓取结果->{return_data}") + break + except Exception as e: + if "与页面的连接已断开" in str(e): + chrome = ChromeAmzone() + # 提交结果 + # 'image_url': "", + # 'title': "" + + item_data = { + "id": i.get("id"), + "asin": asin, + "country": country, + "url": return_data.get("image_url"), + "title": return_data.get("title"), + } + # task_id: int, chunkIndex:int,chunkTotal: int, country_code: str, asin: str, status: dict,error:str="", + # item_data:dict={}, + is_done = index == len(items)-1 + self.post_result(task_id=task_id,chunkIndex=index+1,chunkTotal=len(items), + asin=asin,item_data=item_data,is_done=is_done) + + try: + chrome.close() + except Exception as e: + print("退出浏览器出错",e) + # 更新已处理店铺数 + if task_id in runing_task: + runing_task[task_id]["processed_shops"] += 1 + except Exception as e: + import traceback + self.log(f"处理店铺 {task_id} 失败: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 更新任务状态 + if task_id in runing_task: + if runing_task[task_id].get("stop_requested", False): + runing_task[task_id]["status"] = "stopped" + self.log(f"任务 {task_id} 已被暂停!") + else: + runing_task[task_id]["status"] = "completed" + self.log(f"任务 {task_id} 处理完成!") + + except Exception as e: + import traceback + self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") + if task_id: + from config import runing_task + if task_id in runing_task: + runing_task[task_id]["status"] = "failed" + runing_task[task_id]["error"] = str(e) + + def post_result(self, task_id: int, chunkIndex:int,chunkTotal: int, asin: str, error:str="", + item_data:dict={}, + is_done: bool = False): + """回传处理结果到API + """ + + url = f"{DELETE_BRAND_API_BASE}/api/appearance-patent/tasks/{task_id}/result" + + payload ={ + "submissionId": f"{int(time.time())}", + "chunkIndex": chunkIndex, + "chunkTotal": chunkTotal, + "error": error, + "items": [ + item_data + ], + "done": is_done + } + + max_retries = 3 + for retry in range(max_retries): + try: + print("================【详情采集】=====================") + self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") + self.log(f"回传URL: {url}") + self.log(f"回传数据: {payload}") + response = requests.post( + url, + json=payload, + headers={"Content-Type": "application/json"}, + timeout=30, + verify=False + ) + self.log(f"回传结果: {response.text}") + data = response.json() if response.text else {} + if response.status_code == 200 and isinstance(data, dict) and data.get("success"): + self.log(f"结果回传成功: {asin} - {item_data}") + return + else: + self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") + print("=====================================") + + except Exception as e: + self.log(f"调用API异常: {str(e)}", "ERROR") + print("=====================================") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") + raise RuntimeError("已达到最大重试次数,结果回传最终失败") + +if __name__ == '__main__': + spide = SpiderTask() + task_data = { + "success": True, + "message": "操作成功", + "data": { + "taskId": 4188, + "sourceFilename": "17.xlsx", + "totalRows": 1601, + "acceptedRows": 716, + "droppedRows": 885, + "aiPrompt": "请帮我排查以下亚马逊商品在英国及欧洲地区是否存在知识产权侵权风险。 请直接给出明确结论(有侵权风险 或 未发现明显侵权风险),并严格按照以下三个维度提供精简的排查理由: 外观维度: 评估产品外形、图案设计是否与欧洲/英国常见外观专利雷同。 专利维度: 评估产品的核心技术或物理结构是否存在侵权可能。 标题维度: 排查标题中是否包含大牌商标、敏感词或版权保护词汇。 结论:XX", + "items": [ + { + "rowIndex": 2, + "sourceId": "1", + "displayId": "1", + "asin": "B0D792ND9V", + "country": "英国", + "url": "", + "title": "低" + }, + { + "rowIndex": 3, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0D14L34S7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 7, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0CWQFZMGY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 9, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0CX87XXWJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 10, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0CR3PMR8L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 11, + "sourceId": "6", + "displayId": "6", + "asin": "B0DK3L6FD4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 12, + "sourceId": "8", + "displayId": "8", + "asin": "B0D9QNV6FT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 13, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0DBZG716J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 14, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0CX8K4F8Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 15, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0C4KXJWW1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 28, + "sourceId": "13", + "displayId": "13", + "asin": "B0D62LNNKQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 29, + "sourceId": "14", + "displayId": "14", + "asin": "B0DK3K3GF5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 30, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0C1HN8GY6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 57, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0B71WMDDF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 58, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0DSZNF73N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 60, + "sourceId": "19", + "displayId": "19", + "asin": "B0897Y5QDC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 61, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0FNCLNS68", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 62, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B009U2SCMW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 67, + "sourceId": "24", + "displayId": "24", + "asin": "B0FBLY2ZRD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 68, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B08LP7DW3M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 69, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0FPBZLD6R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 80, + "sourceId": "30", + "displayId": "30", + "asin": "B09LV1TNHK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 81, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0DSKS214Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 86, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0BZBW8KL5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 88, + "sourceId": "3", + "displayId": "3", + "asin": "B0CR3LS3R7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 89, + "sourceId": "4", + "displayId": "4", + "asin": "B097TS2MNQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 90, + "sourceId": "5", + "displayId": "5", + "asin": "B09LV4WGTR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 91, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0916ZQP1V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 93, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0C9WHZ67N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 96, + "sourceId": "9", + "displayId": "9", + "asin": "B0F8QKVS1D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 97, + "sourceId": "10", + "displayId": "10", + "asin": "B0D49974HV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 98, + "sourceId": "11", + "displayId": "11", + "asin": "B0F2DXMKVF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 99, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B08YX48NZ2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 100, + "sourceId": "14", + "displayId": "14", + "asin": "B0BGM3HF9C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 101, + "sourceId": "15", + "displayId": "15", + "asin": "B0CJJM9KZV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 102, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B09HDSTGT4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 103, + "sourceId": "17", + "displayId": "17", + "asin": "B0CX9HK5NL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 104, + "sourceId": "18", + "displayId": "18", + "asin": "B0C2BV83D3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 105, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D5WDK7GW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 107, + "sourceId": "20", + "displayId": "20", + "asin": "B09NR1PZYD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 108, + "sourceId": "21", + "displayId": "21", + "asin": "B0DC45N1Y8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 109, + "sourceId": "23", + "displayId": "23", + "asin": "B01AVHJQY2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 110, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0F3VSJ9Q2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 117, + "sourceId": "27", + "displayId": "27", + "asin": "B0CLXCXW6W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 118, + "sourceId": "28", + "displayId": "28", + "asin": "B07PSPN1XH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 119, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B09PHQYR6Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 122, + "sourceId": "30", + "displayId": "30", + "asin": "B0CT2H94WV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 123, + "sourceId": "1", + "displayId": "1", + "asin": "B0FRRK9V73", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 124, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0B3RNHXV8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 125, + "sourceId": "4", + "displayId": "4", + "asin": "B09FF115TW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 126, + "sourceId": "5", + "displayId": "5", + "asin": "B0CYGXDWBT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 127, + "sourceId": "6", + "displayId": "6", + "asin": "B0F9FT3ZPY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 128, + "sourceId": "7", + "displayId": "7", + "asin": "B0F295JTQZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 129, + "sourceId": "8", + "displayId": "8", + "asin": "B0FPJZ1N51", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 130, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B08B8SP7XT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 131, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B002P7HGEO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 132, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B09X268FXC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 134, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0170OT3X8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 136, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0859793H1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 138, + "sourceId": "17", + "displayId": "17", + "asin": "B0FP8KHCPX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 139, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B09H6KR87N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 146, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D9778Q65", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 147, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0CPJCBZR8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 148, + "sourceId": "21", + "displayId": "21", + "asin": "B0CZ63NGNQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 149, + "sourceId": "22", + "displayId": "22", + "asin": "B0CR4795W6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 150, + "sourceId": "23", + "displayId": "23", + "asin": "B0CR45ZB5Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 151, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0CYB255ST", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 153, + "sourceId": "25", + "displayId": "25", + "asin": "B0BMYWFKTF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 154, + "sourceId": "26", + "displayId": "26", + "asin": "B0BMYTPRD6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 155, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0DK1MGDZM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 157, + "sourceId": "28", + "displayId": "28", + "asin": "B006FUXS30", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 158, + "sourceId": "30", + "displayId": "30", + "asin": "B00BLPUXCI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 159, + "sourceId": "1", + "displayId": "1", + "asin": "B09N79DR4C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 160, + "sourceId": "2", + "displayId": "2", + "asin": "B006O74WTI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 161, + "sourceId": "3", + "displayId": "3", + "asin": "B006O75DIC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 162, + "sourceId": "4", + "displayId": "4", + "asin": "B09323MXYP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 163, + "sourceId": "5", + "displayId": "5", + "asin": "B00K2NTEPC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 164, + "sourceId": "6", + "displayId": "6", + "asin": "B09C19Y6B3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 165, + "sourceId": "7", + "displayId": "7", + "asin": "B00L2HK0S2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 166, + "sourceId": "8", + "displayId": "8", + "asin": "B00666DQBW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 167, + "sourceId": "9", + "displayId": "9", + "asin": "B00666FLII", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 168, + "sourceId": "10", + "displayId": "10", + "asin": "B00666GVM8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 169, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B07KWJCVVN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 173, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B00F0KAGKO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 179, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0C695NBMR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 180, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0F2FXYCG4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 182, + "sourceId": "16", + "displayId": "16", + "asin": "B0FPGC8Z84", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 183, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0D8HXBGGB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 184, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0DDG8GJP9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 188, + "sourceId": "19", + "displayId": "19", + "asin": "B0FLCZVDDH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 189, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B07WZZW6V9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 191, + "sourceId": "21", + "displayId": "21", + "asin": "B0GT3SJ6J1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 192, + "sourceId": "22", + "displayId": "22", + "asin": "B077R1GRW1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 193, + "sourceId": "23", + "displayId": "23", + "asin": "B0D2TMYX23", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 194, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B00AXTKYCM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 195, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0D45CB5SS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 197, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0852JR7RD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 198, + "sourceId": "27", + "displayId": "27", + "asin": "B0GR9F93JL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 199, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0CCJ3NY78", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 200, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0D1V26VBG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 201, + "sourceId": "1", + "displayId": "1", + "asin": "B0CN5VVWB2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 202, + "sourceId": "2", + "displayId": "2", + "asin": "B0DLNJTKFB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 203, + "sourceId": "3", + "displayId": "3", + "asin": "B0CSD7S964", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 204, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0GLP8L4TT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 205, + "sourceId": "5", + "displayId": "5", + "asin": "B0FGJB6LLV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 206, + "sourceId": "6", + "displayId": "6", + "asin": "B0DZ67MYZN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 207, + "sourceId": "7", + "displayId": "7", + "asin": "B0G3XP9VYB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 208, + "sourceId": "8", + "displayId": "8", + "asin": "B0FNWMRMSZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 209, + "sourceId": "9", + "displayId": "9", + "asin": "B0FNWP3K72", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 210, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0DQTMRNLC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 212, + "sourceId": "11", + "displayId": "11", + "asin": "B0DZ62KT5N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 213, + "sourceId": "13", + "displayId": "13", + "asin": "B0DZ65VCDC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 214, + "sourceId": "16", + "displayId": "16", + "asin": "B0DZ67P85P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 215, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0F6LRCZXW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 216, + "sourceId": "18", + "displayId": "18", + "asin": "B0DPYVJMLK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 217, + "sourceId": "19", + "displayId": "19", + "asin": "B0FDKZJTY5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 218, + "sourceId": "20", + "displayId": "20", + "asin": "B0D9VFN9QW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 219, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0BW46XZ2G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 222, + "sourceId": "22", + "displayId": "22", + "asin": "B0FLCBQ92M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 223, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0F6JW61SR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 225, + "sourceId": "24", + "displayId": "24", + "asin": "B0CNZ27HCF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 226, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B001DKRB8A", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 232, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B00NH5DWIW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 236, + "sourceId": "28", + "displayId": "28", + "asin": "B01IOKEOGS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 237, + "sourceId": "29", + "displayId": "29", + "asin": "B08YJVVPBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 238, + "sourceId": "30", + "displayId": "30", + "asin": "B0FG29NPDK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 239, + "sourceId": "1", + "displayId": "1", + "asin": "B0FRFHFXXZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 240, + "sourceId": "3", + "displayId": "3", + "asin": "B0FMQ5G18V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 241, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0DPDKD5PB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 242, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FS6JDGNW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 248, + "sourceId": "8", + "displayId": "8", + "asin": "B0DZBM5VRX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 249, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0D4Q2KB8X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 250, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B098B3XKRS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 251, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B09F9JM8F9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 252, + "sourceId": "14", + "displayId": "14", + "asin": "B08H5M3ZQ7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 253, + "sourceId": "15", + "displayId": "15", + "asin": "B0DG3NXCCF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 254, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0FJX2FSM1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 256, + "sourceId": "17", + "displayId": "17", + "asin": "B089KHDH15", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 257, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0CPWP6W5M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 264, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D4LXTCSZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 265, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0CK682F4T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 267, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0B9CGJDBV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 268, + "sourceId": "23", + "displayId": "23", + "asin": "B0DV55H9DD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 269, + "sourceId": "25", + "displayId": "25", + "asin": "B0FJ8B8RJS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 270, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0D426K41D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 275, + "sourceId": "27", + "displayId": "27", + "asin": "B0CTD4BF7S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 276, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0CGXGQ43L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 279, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0BDM3B6LY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 283, + "sourceId": "1", + "displayId": "1", + "asin": "B0FS1SJGJ5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 284, + "sourceId": "2", + "displayId": "2", + "asin": "B0FJ1RH4JV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 285, + "sourceId": "3", + "displayId": "3", + "asin": "B0B9MBTX28", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 286, + "sourceId": "4", + "displayId": "4", + "asin": "B0FV2VLSX1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 287, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0BRYKW1GD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 289, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0CT5G9YWM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 291, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0D927DZ6B", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 294, + "sourceId": "9", + "displayId": "9", + "asin": "B0DSDY3G29", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 295, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0CWRRSV9H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 296, + "sourceId": "11", + "displayId": "11", + "asin": "B0DNDTT9Z4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 297, + "sourceId": "13", + "displayId": "13", + "asin": "B0CP5VD5SG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 298, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0BV2Q24YK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 300, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0F3JD29KW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 302, + "sourceId": "16", + "displayId": "16", + "asin": "B0C818XVYT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 303, + "sourceId": "17", + "displayId": "17", + "asin": "B0FJRYQ3QV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 304, + "sourceId": "18", + "displayId": "18", + "asin": "B0CP3NYG8J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 305, + "sourceId": "19", + "displayId": "19", + "asin": "B0F6C7XH75", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 306, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0FXX9N5VH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 308, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0CFJPCSDP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 310, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0FQJHS1MZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 311, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0D5VJN99L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 313, + "sourceId": "26", + "displayId": "26", + "asin": "B07MCDWVJG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 314, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0CKYJCJGD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 319, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0CQXPR4H4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 321, + "sourceId": "29", + "displayId": "29", + "asin": "B08S2913J7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 322, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0CXPL3GSW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 323, + "sourceId": "1", + "displayId": "1", + "asin": "B0D7JVZWZF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 324, + "sourceId": "2", + "displayId": "2", + "asin": "B0FKMXP3ZR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 325, + "sourceId": "3", + "displayId": "3", + "asin": "B0FGP7YJC8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 326, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F9PDZTCJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 328, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0CTLXM3C6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 331, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0CSYB8BPK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 335, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B01I1CEEXW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 340, + "sourceId": "8", + "displayId": "8", + "asin": "B0G2Y49LCY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 341, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0F3HK55L6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 343, + "sourceId": "10", + "displayId": "10", + "asin": "B0GWJ69JK1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 344, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B09Z877C17", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 345, + "sourceId": "12", + "displayId": "12", + "asin": "B0GLDX9NB1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 346, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FPC1Y19B", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 348, + "sourceId": "14", + "displayId": "14", + "asin": "B0C65438CP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 349, + "sourceId": "17", + "displayId": "17", + "asin": "B0F6MNZB6F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 350, + "sourceId": "18", + "displayId": "18", + "asin": "B0BVPLLLRP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 351, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0FK2B5FK2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 353, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0BPNFMKQV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 354, + "sourceId": "22", + "displayId": "22", + "asin": "B0G4BLRDW6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 355, + "sourceId": "23", + "displayId": "23", + "asin": "B0F93QCQF1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 356, + "sourceId": "24", + "displayId": "24", + "asin": "B0FHHPYP9K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 357, + "sourceId": "28", + "displayId": "28", + "asin": "B0F1K9KDX6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 358, + "sourceId": "29", + "displayId": "29", + "asin": "B0F52ZXD55", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 359, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B07GDGSKK6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 361, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B08BPHJ34D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 362, + "sourceId": "2", + "displayId": "2", + "asin": "B07ZFWRH75", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 363, + "sourceId": "3", + "displayId": "3", + "asin": "B0G5PVP3Y3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 364, + "sourceId": "4", + "displayId": "4", + "asin": "B0FXXLPC1T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 365, + "sourceId": "5", + "displayId": "5", + "asin": "B0GQB1K38X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 366, + "sourceId": "6", + "displayId": "6", + "asin": "B0C1TCDZ5N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 367, + "sourceId": "8", + "displayId": "8", + "asin": "B0FHD3QCLW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 368, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0F1THT9XW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 370, + "sourceId": "11", + "displayId": "11", + "asin": "B0DYJ8743N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 371, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0FD3Q2RGP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 373, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0BV66T3PQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 374, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0CDVYLTB4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 383, + "sourceId": "16", + "displayId": "16", + "asin": "B0CNKGFWKR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 384, + "sourceId": "17", + "displayId": "17", + "asin": "B0D4VQF22F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 385, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0C5TBR8LB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 387, + "sourceId": "19", + "displayId": "19", + "asin": "B0DDH3G9PG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 388, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0D8VRMWP2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 390, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0BFWXWNTC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 395, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B096ZCL4JX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 399, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0CFDXR5FC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 400, + "sourceId": "25", + "displayId": "25", + "asin": "B0G6DN5QC7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 401, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0CNRL9R1F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 402, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0BJK6D2D4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 403, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0DPFDTL7W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 405, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0G5N9KGXC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 406, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0F73X9X8D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 408, + "sourceId": "1", + "displayId": "1", + "asin": "B0CJTJB8PV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 409, + "sourceId": "2", + "displayId": "2", + "asin": "B0FBGD3QJ2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 410, + "sourceId": "3", + "displayId": "3", + "asin": "B0F98TGSQ1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 411, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F329ZXH5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 412, + "sourceId": "5", + "displayId": "5", + "asin": "B0G191SX5F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 413, + "sourceId": "6", + "displayId": "6", + "asin": "B0F7XT5TNY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 414, + "sourceId": "7", + "displayId": "7", + "asin": "B0FVS7K78Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 415, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0FYFZBQLT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 418, + "sourceId": "10", + "displayId": "10", + "asin": "B0FG2LHWB3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 419, + "sourceId": "11", + "displayId": "11", + "asin": "B0F9WX88T1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 420, + "sourceId": "12", + "displayId": "12", + "asin": "B0F7XNDBNN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 421, + "sourceId": "14", + "displayId": "14", + "asin": "B0DT7GV9NS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 422, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0DKF26TYN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 423, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0D1FP339J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 424, + "sourceId": "20", + "displayId": "20", + "asin": "B0CNCBQCMG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 425, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0CHRR45X7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 427, + "sourceId": "23", + "displayId": "23", + "asin": "B0C1RPB8BQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 428, + "sourceId": "24", + "displayId": "24", + "asin": "B0BVPPBH7D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 429, + "sourceId": "25", + "displayId": "25", + "asin": "B0BHQKQMG8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 430, + "sourceId": "26", + "displayId": "26", + "asin": "B0C7QQPNC9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 431, + "sourceId": "27", + "displayId": "27", + "asin": "B0FHKT5CBC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 432, + "sourceId": "29", + "displayId": "29", + "asin": "B0DR5XVMN7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 433, + "sourceId": "30", + "displayId": "30", + "asin": "B08HPS68Q4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 434, + "sourceId": "1", + "displayId": "1", + "asin": "B0C4KLQPDZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 435, + "sourceId": "2", + "displayId": "2", + "asin": "B0F6TT21VN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 436, + "sourceId": "3", + "displayId": "3", + "asin": "B08MFB5W4Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 437, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B07C9Z5CG5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 441, + "sourceId": "5", + "displayId": "5", + "asin": "B07589LNBP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 442, + "sourceId": "6", + "displayId": "6", + "asin": "B08HRLZVX2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 443, + "sourceId": "7", + "displayId": "7", + "asin": "B08K7B3T6P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 444, + "sourceId": "8", + "displayId": "8", + "asin": "B09T9YYYTS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 445, + "sourceId": "9", + "displayId": "9", + "asin": "B081ZVNH98", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 446, + "sourceId": "10", + "displayId": "10", + "asin": "B0F6T4XMXY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 447, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B07QH4X4Y5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 449, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B096S27HMH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 460, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FB9DWYXF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 462, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B08R58FBXZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 494, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0CRK8YNNY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 496, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B09C8F7J2H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 504, + "sourceId": "17", + "displayId": "17", + "asin": "B0F6TK2KP3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 505, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0BYJHNBWM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 515, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0DJBZXCDP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 516, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0FMRGW63W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 518, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0D175WMJC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 519, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B07FLD65NM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 521, + "sourceId": "24", + "displayId": "24", + "asin": "B0DRFWYNNV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 522, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0DZX3JWQP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 524, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0F5X5G34F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 530, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0BJDL1D9W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 544, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0BYJMMMLX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 545, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B092M4RJVV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 552, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B092M49F1Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 565, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0FMRFHRZR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 566, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0DZWVVM6F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 570, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0BCNZZ32X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 580, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0BRC8PXMW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 581, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B07RL77RM9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 582, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0FMRBN7H4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 584, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0FMRGHCPK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 587, + "sourceId": "10", + "displayId": "10", + "asin": "B0G4BWPCK7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 588, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0CJJ4Y8SB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 589, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0DYY436WG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 591, + "sourceId": "14", + "displayId": "14", + "asin": "B0G64PMQ94", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 592, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0CST698J6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 593, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B00U7LUWR8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 594, + "sourceId": "18", + "displayId": "18", + "asin": "B0DHRJX1VS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 595, + "sourceId": "20", + "displayId": "20", + "asin": "B0CY9NB8VS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 596, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B08ML38H24", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 599, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0BXVBVJ6G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 605, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B08HS69FQG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 608, + "sourceId": "25", + "displayId": "25", + "asin": "B0F281WHDB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 609, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0007RN382", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 610, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0F2JDR3Y5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 612, + "sourceId": "28", + "displayId": "28", + "asin": "B0FX9L2JJ4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 613, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0FD9NVNFT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 615, + "sourceId": "30", + "displayId": "30", + "asin": "B0B72HD5B9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 616, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0F53FQ9Y4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 618, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0GHDHPQ7J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 629, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B07B9ZP8TK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 631, + "sourceId": "6", + "displayId": "6", + "asin": "B0DPWW9P2V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 632, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0CR43DTKJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 659, + "sourceId": "8", + "displayId": "8", + "asin": "B0G8K4C3D6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 660, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0F52TLKVM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 662, + "sourceId": "11", + "displayId": "11", + "asin": "B0BGH6Y6KB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 663, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0D28VG1C3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 667, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0D3LLKF7C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 670, + "sourceId": "14", + "displayId": "14", + "asin": "B09KT2VBJL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 671, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B07F6P6C3F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 672, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0GCZH5V2P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 709, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0FH5RNFZQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 710, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0CSFMDTSR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 714, + "sourceId": "21", + "displayId": "21", + "asin": "B0GR9TS4N8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 715, + "sourceId": "22", + "displayId": "22", + "asin": "B0D9GWVPGJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 716, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0GF2BKHJK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 717, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0GQZ8SPZZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 719, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0D3LQF6P5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 720, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0GF2ML2NY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 722, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0C28BCVH6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 723, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0C1CRZPMS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 730, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0F8HKX897", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 734, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0GSKSC1KR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 735, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0GSQGF76K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 736, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0F9WTNVXP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 738, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F47S987P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 740, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0F4Y4F5TC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 741, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0DYNW29NB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 748, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0GF29HX77", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 749, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0GM2WBVXF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 751, + "sourceId": "9", + "displayId": "9", + "asin": "B0GGWW658M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 752, + "sourceId": "10", + "displayId": "10", + "asin": "B0F32R7JTF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 753, + "sourceId": "11", + "displayId": "11", + "asin": "B0DZ67TBHQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 754, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0CLC6KSZH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 755, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0F8QW1FS1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 760, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0F6LHFVJ3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 768, + "sourceId": "16", + "displayId": "16", + "asin": "B0DZH72GF6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 769, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B099N1FB4K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 771, + "sourceId": "18", + "displayId": "18", + "asin": "B0BS678GBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 772, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0F5Y4KSQJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 778, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0D584KC9W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 805, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0GK1D75ZF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 810, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0DPWXNWV5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 812, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0G64ZCGTV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 813, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B07VHK16YV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 815, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0GS3QV5F2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 816, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DC7TR9B5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 821, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FH634932", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 824, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0CY2XN6JF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 826, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0GKR5WMXK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 829, + "sourceId": "30", + "displayId": "30", + "asin": "B0GH4KYZH5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 830, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0FD76KJ9P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 831, + "sourceId": "3", + "displayId": "3", + "asin": "B0836NDGM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 832, + "sourceId": "4", + "displayId": "4", + "asin": "B0DYJWTS4N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 833, + "sourceId": "5", + "displayId": "5", + "asin": "B089X4VCPY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 834, + "sourceId": "6", + "displayId": "6", + "asin": "B0CQZR1LZX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 835, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0GSVTDQBX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 837, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0D9TK3VMD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 839, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0GDZWHF6D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 841, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0C8N1LZT9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 842, + "sourceId": "12", + "displayId": "12", + "asin": "B0GWHQHKJS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 843, + "sourceId": "13", + "displayId": "13", + "asin": "B0BTTJKZDC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 844, + "sourceId": "14", + "displayId": "14", + "asin": "B0DZPDJ7Q4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 845, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0D5W9F2DS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 849, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0CGCPLWV1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 850, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B09VT58BM4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 852, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B07XZT797H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 854, + "sourceId": "20", + "displayId": "20", + "asin": "B0GW9TR89X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 856, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B09ZKT7QW6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 859, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0CJYRW7RL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 861, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DSZ4V9PJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 862, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B09TKN8F9W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 863, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B09SW82GSP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 871, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B001F4OSJY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 878, + "sourceId": "3", + "displayId": "3", + "asin": "B091BK7ZF3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 879, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B07HSL53DY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 883, + "sourceId": "5", + "displayId": "5", + "asin": "B07HSDTYC8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 884, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FKN7JZ6B", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 886, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B071XJDSBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 889, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B006UITUJ8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 890, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0CBPWL6NZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 891, + "sourceId": "11", + "displayId": "11", + "asin": "B0G3Q9B48L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 892, + "sourceId": "12", + "displayId": "12", + "asin": "B0BYJV8P98", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 893, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0G8DTQP1F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 897, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0CYP192B6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 898, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0CCN8TJCD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 903, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0FWKJVMNK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 906, + "sourceId": "19", + "displayId": "19", + "asin": "B0GD11NDH2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 907, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0BC2NFJBP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 911, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0D9RRCC93", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 913, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0DLSZFMM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 918, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0GFBG4HSR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 919, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B07TBCFGPT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 920, + "sourceId": "27", + "displayId": "27", + "asin": "B0GSZRFZGZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 921, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B008OB1AZ6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 922, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B09XLVPYPR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 930, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0FZK5NCWK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 933, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0DYJTRT6K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 934, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0CL664TZX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 936, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0DN6XQ5W4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 938, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B002HNNWLM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 943, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0F5HHHR65", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 946, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0G5739C1J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 951, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0G11TTQPT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 952, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0G579K29G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 957, + "sourceId": "10", + "displayId": "10", + "asin": "B0G57DKM85", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 958, + "sourceId": "11", + "displayId": "11", + "asin": "B0DGFW14PB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 959, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0DK3YXKS5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 960, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FGTHRS1R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 961, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0FP2FDZPZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 963, + "sourceId": "15", + "displayId": "15", + "asin": "B002HO7QQ8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 964, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B002HNS1TU", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 966, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B004KL50HS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 967, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B07QK3B4Q5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 972, + "sourceId": "19", + "displayId": "19", + "asin": "B08DVGHKLL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 973, + "sourceId": "20", + "displayId": "20", + "asin": "B08K3ZYRGC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 974, + "sourceId": "21", + "displayId": "21", + "asin": "B0DZWVCVK1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 975, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0CT29V1D5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 977, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B01N7G9ALO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 978, + "sourceId": "25", + "displayId": "25", + "asin": "B0CQLN3T6N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 979, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FJKTYHSV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 981, + "sourceId": "28", + "displayId": "28", + "asin": "B0FRFNVTKX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 982, + "sourceId": "1", + "displayId": "1", + "asin": "B0DJQWP543", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 983, + "sourceId": "3", + "displayId": "3", + "asin": "B0D7M543CT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 984, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F21QQQL1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 987, + "sourceId": "5", + "displayId": "5", + "asin": "B0CMZR1JJD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 988, + "sourceId": "6", + "displayId": "6", + "asin": "B0F66NTL6T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 989, + "sourceId": "7", + "displayId": "7", + "asin": "B0D976JCLF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 990, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0FP2DMFMG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 991, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0CTDM36PB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 994, + "sourceId": "10", + "displayId": "10", + "asin": "B0DY76XFLY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 995, + "sourceId": "11", + "displayId": "11", + "asin": "B0CQ4PS256", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 996, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0C15RDVDK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 997, + "sourceId": "13", + "displayId": "13", + "asin": "B0F5Y8Y58T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 998, + "sourceId": "14", + "displayId": "14", + "asin": "B0B5CBKC17", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 999, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0FMXVRQM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1000, + "sourceId": "18", + "displayId": "18", + "asin": "B0DC2WX8Q2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1001, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0FVR6L7NP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1004, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0DFQMCBS7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1006, + "sourceId": "21", + "displayId": "21", + "asin": "B07TSMHP3T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1007, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B09DY2KCLB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1008, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0GRTXKMGZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1010, + "sourceId": "26", + "displayId": "26", + "asin": "B0BG4TTWWW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1011, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FC2QBR9T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1012, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B09Y2H27PS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1013, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0CTGLQFCD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1016, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B01MCVO50E", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1017, + "sourceId": "3", + "displayId": "3", + "asin": "B0FJXM3T1S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1018, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0C8MG6NF7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1019, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0C7NK648Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1020, + "sourceId": "6", + "displayId": "6", + "asin": "B0DYFDXD8N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1021, + "sourceId": "7", + "displayId": "7", + "asin": "B0GGMLRZWF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1022, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0D45VVD1Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1024, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0CC6KP279", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1046, + "sourceId": "12", + "displayId": "12", + "asin": "B0FRZYQYGT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1047, + "sourceId": "13", + "displayId": "13", + "asin": "B0DK447HBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1048, + "sourceId": "14", + "displayId": "14", + "asin": "B0788GRQT1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1049, + "sourceId": "15", + "displayId": "15", + "asin": "B0F93QPPVD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1050, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0BRQG6CKG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1051, + "sourceId": "17", + "displayId": "17", + "asin": "B09DCW6XN1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1052, + "sourceId": "18", + "displayId": "18", + "asin": "B0FSQDHC9V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1053, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D25DHV1T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1054, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0DJF4Z91G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1056, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0F3J3B1R2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1060, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0F3J6WJZJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1062, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FQTWP8GM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1065, + "sourceId": "28", + "displayId": "28", + "asin": "B0FPQL1ZW9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1066, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0B77PQ12W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1068, + "sourceId": "30", + "displayId": "30", + "asin": "B0FXWTDY16", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1069, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0D6ZV5F22", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1070, + "sourceId": "2", + "displayId": "2", + "asin": "B0BF13CW1W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1071, + "sourceId": "3", + "displayId": "3", + "asin": "B0F52CM3X1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1072, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0043RJSSG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1095, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B07V2G46J7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1096, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B07X4V22PW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1098, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0GQXDVW6C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1099, + "sourceId": "8", + "displayId": "8", + "asin": "B0BK888623", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1100, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0BFWC5SZQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1102, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0F1C9ZQKD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1106, + "sourceId": "11", + "displayId": "11", + "asin": "B09F5VV8DW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1107, + "sourceId": "12", + "displayId": "12", + "asin": "B0BWMT9LFC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1108, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0FJLQLRNT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1112, + "sourceId": "15", + "displayId": "15", + "asin": "B08ZCNVYTK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1113, + "sourceId": "16", + "displayId": "16", + "asin": "B0CMZLKY9T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1114, + "sourceId": "17", + "displayId": "17", + "asin": "B0GJZXZ2F9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1115, + "sourceId": "18", + "displayId": "18", + "asin": "B07BMFCKCR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1116, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0DK46T977", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1118, + "sourceId": "20", + "displayId": "20", + "asin": "B08HCPX1MB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1119, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0D8L6WRCM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1121, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B09NDN8NV1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1122, + "sourceId": "24", + "displayId": "24", + "asin": "B0GT2527XG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1123, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0FNRCLHNS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1127, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DQS8GKLG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1129, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B003NGLFYI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1132, + "sourceId": "28", + "displayId": "28", + "asin": "B0CR4FTMGG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1133, + "sourceId": "29", + "displayId": "29", + "asin": "B0DK9ZBBKS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1134, + "sourceId": "30", + "displayId": "30", + "asin": "B0D1XX28FN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1135, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B003KHEEY8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1151, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0F9WRKC84", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1153, + "sourceId": "3", + "displayId": "3", + "asin": "B08BHKGYJ7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1154, + "sourceId": "4", + "displayId": "4", + "asin": "B0FT1562DX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1155, + "sourceId": "5", + "displayId": "5", + "asin": "B0F8QRJ9JB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1156, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0070OARSO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1168, + "sourceId": "7", + "displayId": "7", + "asin": "B07XJ4W6SW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1169, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0C1V86KMX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1170, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0CGM1Z2VG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1171, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B004699SWM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1220, + "sourceId": "11", + "displayId": "11", + "asin": "B0GT281VQK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1221, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B09BCSR7NQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1222, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B003YCKTIE", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1223, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B092CGQN2K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1224, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B001WSDMBI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1225, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B079C2CDLD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1227, + "sourceId": "5", + "displayId": "5", + "asin": "B077WX43MH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1228, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FQ2YC11V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1229, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0DRFQJ6CX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1231, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0BX65MF93", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1233, + "sourceId": "9", + "displayId": "9", + "asin": "B0CT5ZR247", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1234, + "sourceId": "10", + "displayId": "10", + "asin": "B0BFXLLR2F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1235, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0FDQT4X7W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1236, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FQ2XD95Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1238, + "sourceId": "15", + "displayId": "15", + "asin": "B094RDMZ3Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1239, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0DMZHTJY2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1240, + "sourceId": "18", + "displayId": "18", + "asin": "B0CS2TQGM5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1241, + "sourceId": "19", + "displayId": "19", + "asin": "B0DG2XK945", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1242, + "sourceId": "21", + "displayId": "21", + "asin": "B0G2LNGQPK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1243, + "sourceId": "22", + "displayId": "22", + "asin": "B0G4R1RHYH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1244, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0GSRZM4XB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1245, + "sourceId": "25", + "displayId": "25", + "asin": "B0D926NJN9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1246, + "sourceId": "26", + "displayId": "26", + "asin": "B01LZBHEKJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1247, + "sourceId": "27", + "displayId": "27", + "asin": "B09LQL4S9Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1248, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0CQTPF6BJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1256, + "sourceId": "30", + "displayId": "30", + "asin": "B0DZVY2F7M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1257, + "sourceId": "1", + "displayId": "1", + "asin": "B0GMYGQ2G6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1258, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0C5WQ6DFB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1261, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0DJVK3SC4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1262, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B000N324DU", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1267, + "sourceId": "6", + "displayId": "6", + "asin": "B074F6YQZW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1268, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B09MD5W6Z5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1269, + "sourceId": "8", + "displayId": "8", + "asin": "B0F94GJX9D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1270, + "sourceId": "9", + "displayId": "9", + "asin": "B0DP298J3J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1271, + "sourceId": "10", + "displayId": "10", + "asin": "B010W3V6Z2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1272, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0F24BSV4V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1273, + "sourceId": "12", + "displayId": "12", + "asin": "B0B9MKBPH9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1274, + "sourceId": "13", + "displayId": "13", + "asin": "B0BHHKC5JQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1275, + "sourceId": "14", + "displayId": "14", + "asin": "B0B4RFNK72", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1276, + "sourceId": "15", + "displayId": "15", + "asin": "B01LXD3KE6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1277, + "sourceId": "17", + "displayId": "17", + "asin": "B010W3V1W0", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1278, + "sourceId": "18", + "displayId": "18", + "asin": "B095JNPP53", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1279, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0D7DSBNNH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1281, + "sourceId": "21", + "displayId": "21", + "asin": "B0B935PV25", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1282, + "sourceId": "22", + "displayId": "22", + "asin": "B0B67XDHPQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1283, + "sourceId": "24", + "displayId": "24", + "asin": "B072Z1PQM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1284, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0CT1J5HWX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1285, + "sourceId": "26", + "displayId": "26", + "asin": "B097G2DXSQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1286, + "sourceId": "27", + "displayId": "27", + "asin": "B010W3VLE8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1287, + "sourceId": "28", + "displayId": "28", + "asin": "B00R39MP4A", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1288, + "sourceId": "29", + "displayId": "29", + "asin": "B095JMYSQ9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1289, + "sourceId": "30", + "displayId": "30", + "asin": "B0F8F5H3MG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1290, + "sourceId": "1", + "displayId": "1", + "asin": "B0DNM4R43P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1291, + "sourceId": "2", + "displayId": "2", + "asin": "B0FCFB3X78", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1292, + "sourceId": "3", + "displayId": "3", + "asin": "B0CN4KXVWF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1293, + "sourceId": "4", + "displayId": "4", + "asin": "B0D455HLWT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1294, + "sourceId": "5", + "displayId": "5", + "asin": "B0B1HYLLYT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1295, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0F1TKQG14", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1296, + "sourceId": "7", + "displayId": "7", + "asin": "B0F32CLT9F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1297, + "sourceId": "8", + "displayId": "8", + "asin": "B0DJXYDPFC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1298, + "sourceId": "9", + "displayId": "9", + "asin": "B0B3RRLNCT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1299, + "sourceId": "10", + "displayId": "10", + "asin": "B0F2DR94NT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1300, + "sourceId": "11", + "displayId": "11", + "asin": "B0BL7HRF5R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1301, + "sourceId": "12", + "displayId": "12", + "asin": "B0B6PT6D7Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1302, + "sourceId": "13", + "displayId": "13", + "asin": "B0FF4FLHM4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1303, + "sourceId": "14", + "displayId": "14", + "asin": "B07L2476DB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1304, + "sourceId": "15", + "displayId": "15", + "asin": "B0CK4379VH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1305, + "sourceId": "16", + "displayId": "16", + "asin": "B0BRFW6XF4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1306, + "sourceId": "17", + "displayId": "17", + "asin": "B07BZT7699", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1307, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0D8W4JRTY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1308, + "sourceId": "19", + "displayId": "19", + "asin": "B0F9NQMWGC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1309, + "sourceId": "20", + "displayId": "20", + "asin": "B07CF8KD48", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1310, + "sourceId": "21", + "displayId": "21", + "asin": "B0F9NWBVD8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1311, + "sourceId": "22", + "displayId": "22", + "asin": "B0DSZK41Z9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1312, + "sourceId": "23", + "displayId": "23", + "asin": "B0DHP1TPQL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1313, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0DPHSPQRP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1314, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0BVZ3VKNX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1320, + "sourceId": "26", + "displayId": "26", + "asin": "B0FPX7363M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1321, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0F9KCHB7F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1323, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B07L3H5DDW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1325, + "sourceId": "30", + "displayId": "30", + "asin": "B003K5S4NW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1326, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0BNVHXLDN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1328, + "sourceId": "2", + "displayId": "2", + "asin": "B0FC2R299V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1329, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0BNVJPSDT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1330, + "sourceId": "5", + "displayId": "5", + "asin": "B0CCRNRHYW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1331, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FP2NQM67", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1334, + "sourceId": "7", + "displayId": "7", + "asin": "B0DRSD66T3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1335, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0DM6CS4KG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1336, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0GQ2YGFTR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1338, + "sourceId": "10", + "displayId": "10", + "asin": "B0F1LNXRSH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1339, + "sourceId": "11", + "displayId": "11", + "asin": "B0GJ59NQTT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1340, + "sourceId": "12", + "displayId": "12", + "asin": "B0GKY1T54N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1341, + "sourceId": "13", + "displayId": "13", + "asin": "B0FZNMHLDY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1342, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0DHWYL3JP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1344, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0CW5DD6SC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1351, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0CRH7T5WG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1353, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0CRR6F9JX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1354, + "sourceId": "20", + "displayId": "20", + "asin": "B09D3XG1PT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1355, + "sourceId": "22", + "displayId": "22", + "asin": "B00AFGCL42", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1356, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0CXP3619X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1357, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0CW5GFQX3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1363, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0CZDK561H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1364, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FKLRMG14", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1373, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0DFQWC297", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1383, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0DGPV9QY8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1386, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0GV3W42MJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1388, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0DK4JV5YY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1402, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0CV4K3HSW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1403, + "sourceId": "9", + "displayId": "9", + "asin": "B0FN5YD344", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1404, + "sourceId": "10", + "displayId": "10", + "asin": "B01HY4XZE2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1407, + "sourceId": "13", + "displayId": "13", + "asin": "B0D485JG3T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1408, + "sourceId": "15", + "displayId": "15", + "asin": "B0GC584NTL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1409, + "sourceId": "16", + "displayId": "16", + "asin": "B0FDQLKJL3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1410, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0D6RBQR4Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1418, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0CSLMZ4XS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1419, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0FC64KYP9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1421, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0FH234TL6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1445, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0F6D4Z3WB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1455, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0F8RCZ91V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1465, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0FP5Q7B7X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1476, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0FM88JBRX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1477, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0CKMT72MX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1486, + "sourceId": "27", + "displayId": "27", + "asin": "B0C4JT7PHB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1487, + "sourceId": "28", + "displayId": "28", + "asin": "B0C1RMVGTZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1488, + "sourceId": "29", + "displayId": "29", + "asin": "B07BFQJ3G5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1489, + "sourceId": "30", + "displayId": "30", + "asin": "B074VGHYF8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1490, + "sourceId": "1", + "displayId": "1", + "asin": "B015AK9JXI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1491, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B084WSGN9C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1492, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0FHWJ42Q8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1497, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0CZDTGFSQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1498, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0F7XKNY9L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1499, + "sourceId": "6", + "displayId": "6", + "asin": "B0DWLFKPNW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1500, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0CWDPSJG4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1512, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0G488Z8JG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1514, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0BYRQ5TBY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1515, + "sourceId": "10", + "displayId": "10", + "asin": "B0CWH1MRCV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1516, + "sourceId": "11", + "displayId": "11", + "asin": "B0FSCXLBHZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1517, + "sourceId": "12", + "displayId": "12", + "asin": "B0GH6YJX2L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1518, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0GMQ29YQ9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1519, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0BQLX4QP3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1521, + "sourceId": "15", + "displayId": "15", + "asin": "B0FXVHQNQ4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1522, + "sourceId": "16", + "displayId": "16", + "asin": "B072DVNZYH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1523, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0G198MZH3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1524, + "sourceId": "18", + "displayId": "18", + "asin": "B0F7HGQHLP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1525, + "sourceId": "19", + "displayId": "19", + "asin": "B0B9M83MZV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1526, + "sourceId": "20", + "displayId": "20", + "asin": "B074P9YRGW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1527, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0G3YJ32Q4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1528, + "sourceId": "22", + "displayId": "22", + "asin": "B0D8RXPCH6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1529, + "sourceId": "24", + "displayId": "24", + "asin": "B0CBPKKT98", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1530, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0DGG82L25", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1531, + "sourceId": "26", + "displayId": "26", + "asin": "B0FXVNDFHC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1532, + "sourceId": "27", + "displayId": "27", + "asin": "B0CYY2YJ2S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1533, + "sourceId": "28", + "displayId": "28", + "asin": "B0FC34Z9P6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1534, + "sourceId": "29", + "displayId": "29", + "asin": "B0018MQIVO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1535, + "sourceId": "30", + "displayId": "30", + "asin": "B018OQ66AE", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1536, + "sourceId": "1", + "displayId": "1", + "asin": "B0FNMK6R7Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1537, + "sourceId": "3", + "displayId": "3", + "asin": "B0CTJ8WRWZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1538, + "sourceId": "4", + "displayId": "4", + "asin": "B0CTJ9522Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1539, + "sourceId": "5", + "displayId": "5", + "asin": "B0CTJ88CKR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1540, + "sourceId": "6", + "displayId": "6", + "asin": "B07DL3PBL7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1541, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0C96V7HFN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1543, + "sourceId": "8", + "displayId": "8", + "asin": "B079HQKBP3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1544, + "sourceId": "9", + "displayId": "9", + "asin": "B0BZHW8VQ6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1545, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B019RKRGWS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1547, + "sourceId": "11", + "displayId": "11", + "asin": "B0DCLSFGQS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1548, + "sourceId": "12", + "displayId": "12", + "asin": "B07FL8Y4BP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1549, + "sourceId": "14", + "displayId": "14", + "asin": "B01NBVCL86", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1550, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0C8J5Z7VN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1551, + "sourceId": "16", + "displayId": "16", + "asin": "B0CP73M8ST", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1552, + "sourceId": "18", + "displayId": "18", + "asin": "B0G2XVTF2R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1553, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B08GCVHM9S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1555, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0B5X3YGMP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1557, + "sourceId": "22", + "displayId": "22", + "asin": "B07VM7QS8C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1558, + "sourceId": "23", + "displayId": "23", + "asin": "B0F93G7KFF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1559, + "sourceId": "24", + "displayId": "24", + "asin": "B098B8QTM1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1560, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0F4WSK73F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1561, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DC5M4XT7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1564, + "sourceId": "27", + "displayId": "27", + "asin": "B07SD5DWFT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1565, + "sourceId": "28", + "displayId": "28", + "asin": "B082ZNZG3X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1566, + "sourceId": "29", + "displayId": "29", + "asin": "B084M4ZGC3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1567, + "sourceId": "30", + "displayId": "30", + "asin": "B0FXH7SVWV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1568, + "sourceId": "3", + "displayId": "3", + "asin": "B07RM4MB3H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1569, + "sourceId": "4", + "displayId": "4", + "asin": "B0154H395G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1570, + "sourceId": "5", + "displayId": "5", + "asin": "B08CHFDRJT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1571, + "sourceId": "6", + "displayId": "6", + "asin": "B09YQ3D7CW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1572, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B087YTMRK8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1574, + "sourceId": "8", + "displayId": "8", + "asin": "B08WKDDV96", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1575, + "sourceId": "9", + "displayId": "9", + "asin": "B0GFMG4SFT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1576, + "sourceId": "10", + "displayId": "10", + "asin": "B07KWY3XLW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1577, + "sourceId": "11", + "displayId": "11", + "asin": "B07RQTKPSK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1578, + "sourceId": "12", + "displayId": "12", + "asin": "B0CRHC42M2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1579, + "sourceId": "14", + "displayId": "14", + "asin": "B07RGG2TCV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1580, + "sourceId": "15", + "displayId": "15", + "asin": "B0CTJNQ5MH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1581, + "sourceId": "16", + "displayId": "16", + "asin": "B0GGZSVY7G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1582, + "sourceId": "17", + "displayId": "17", + "asin": "B0G3WTPGMG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1583, + "sourceId": "18", + "displayId": "18", + "asin": "B0GH136M59", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1584, + "sourceId": "19", + "displayId": "19", + "asin": "B0G3WJP9HJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1585, + "sourceId": "20", + "displayId": "20", + "asin": "B0814RZNHY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1586, + "sourceId": "21", + "displayId": "21", + "asin": "B09ZXZH432", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1587, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0BWY99XXS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1589, + "sourceId": "23", + "displayId": "23", + "asin": "B0849Y6VYJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1590, + "sourceId": "24", + "displayId": "24", + "asin": "B0FKBBNN2G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1591, + "sourceId": "25", + "displayId": "25", + "asin": "B07SBWB2X9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1592, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DK4JNBM3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1593, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FFZ3636F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1594, + "sourceId": "29", + "displayId": "29", + "asin": "B0BRGZKXN7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1602, + "sourceId": "2", + "displayId": "2", + "asin": "B0GSTM85H3", + "country": "英国", + "url": "", + "title": "" + } + ] + }, + "code": None +} + spide.process_task(task_data) \ No newline at end of file diff --git a/app/amazon/main.py b/app/amazon/main.py index 36136d7..1b8a035 100644 --- a/app/amazon/main.py +++ b/app/amazon/main.py @@ -10,6 +10,7 @@ from amazon.approve import ApproveTask from amazon.match_action import MatchTak from amazon.price_match import PriceTask from amazon.asin_status import StatusTask +from amazon.detail_spider import SpiderTask from amazon.tool import get_shop_info,show_notification @@ -57,7 +58,8 @@ class TaskMonitor: "product-risk-resolve-run" : "产品风险审批", "shop-match-run" : "匹配价格", "price-track-run" : "跟价", - "query-asin-run" : "状态查询" + "query-asin-run" : "状态查询", + "appearance-patent-run" : "亚马逊采集", } try: while self.running: @@ -125,7 +127,8 @@ class TaskMonitor: "产品风险审批" : ApproveTask, "匹配价格" : MatchTak, "跟价" : PriceTask, - "状态查询" : StatusTask + "状态查询" : StatusTask, + "亚马逊采集" : SpiderTask, } self.log(f"线程 {id(task_data)} 开始处理产品风险审批任务...") # 创建ApproveTask实例并处理任务 diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py index 596e22b..7745f20 100644 --- a/app/amazon/match_action.py +++ b/app/amazon/match_action.py @@ -451,7 +451,7 @@ class MatchTak: # 更新已处理国家数 if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 - + self.log(f"{task_id}任务处理完成") # 最后回传,标记完成 try: # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) diff --git a/app/amazon/price_match.py b/app/amazon/price_match.py index cb038da..ebdaa18 100644 --- a/app/amazon/price_match.py +++ b/app/amazon/price_match.py @@ -17,6 +17,97 @@ from amazon.tool import show_notification,get_shop_info,remove_special_character from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE +class RepricingLogic: + + @staticmethod + def situation_1_general_decrease(my_price, rank1_price, is_first_time=False): + """ + 情况1:常规递减跟价 (最左侧独立长图块) + 当不是自己购物车时,按总价当作第一名递减。 + """ + if is_first_time: + return rank1_price - 0.3 + + diff = abs(my_price - rank1_price) + + # 精简了原图中长串的阶梯逻辑 + if diff <= 0.3: + return rank1_price - 0.5 + elif diff <= 0.8: + return rank1_price - 0.7 + elif diff <= 10.5: + # 0.8 到 10.5 之间,原图逻辑全部是“减1” + return rank1_price - 1.0 + else: + return None # 相差10.5以上,跳过 + + @staticmethod + def situation_2_own_buybox(my_price, rank2_price): + """ + 情况2:已经是自己购物车 + 逻辑:判断与第二名的差价,如果拉开足够差距,则稍微降一点点(减0.5)保持优势,防止卖太便宜。 + """ + diff = abs(rank2_price - my_price) + + # 1. 绝对差价2欧以上 + if diff >= 2.0: + return rank2_price - 0.3 + + # 2. 产品售价区间判定 (是否要提高价格) + if (20 <= my_price < 30 and diff >= 4) or \ + (30 <= my_price < 60 and diff >= 8) or \ + (60 <= my_price <= 150 and diff >= 15): + return rank2_price - 0.3 # 满足区间大差价,提价至第二名之下 + + return my_price # 不满足条件则保持原价 + + @staticmethod + def situation_3_not_own_buybox(my_price, rank1_price): + """ + 情况3:不是自己购物车 (常规情况) + """ + diff = abs(my_price - rank1_price) + + if diff <= 0.3: + return rank1_price - 0.5 + elif 0.5 <= diff <= 0.8: + return rank1_price - 0.7 + elif 0.8 < diff <= 2.5: + return rank1_price - 1.0 + elif diff > 2.5: # 2.5-3.5以上跳过 + return None + + return rank1_price - 0.3 # 默认按第一名减0.3 + + @staticmethod + def situation_4_encounter_amz_us_1st(my_price, amz_us_price): + """ + 情况4:第一名是 Amazon US 卖家 + """ + diff = abs(my_price - amz_us_price) + + if diff <= 3: + return amz_us_price - 2 + elif 4 <= diff <= 6: + return amz_us_price - 3 + elif 8 <= diff <= 12: + return None # 跳过不跟价 + + return amz_us_price - 3 # 默认直接按照 Amazon US 减去3 + + @staticmethod + def situation_5_im_1st_amz_us_2nd(my_price, amz_us_price): + """ + 情况5:自己是第一名,第二名是 Amazon US 卖家 + """ + diff = abs(amz_us_price - my_price) + + if diff <= 7: + return None # 相差5以内跳过 (保持原价) + else: + return amz_us_price - 5 + + def calculate_target_price( front_end_data,current_Price,current_shop_name, recommended_price,recommended_shipping @@ -35,65 +126,44 @@ def calculate_target_price( # --- Step 2: 紫鸟后台特殊判定 (最高优先级) --- if recommended_shipping > 0: - backend_base_price = recommended_price - backend_shipping = recommended_shipping - total_price = backend_base_price + backend_shipping - - if is_my_buybox: - # 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整 - return None - else: - # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑 - return calculate_standard_competitor_pricing(my_price, total_price) + price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 + return RepricingLogic.situation_1_general_decrease(my_price,price_1,is_my_buybox) + # backend_base_price = recommended_price + # backend_shipping = recommended_shipping + # total_price = backend_base_price + backend_shipping + # + # if is_my_buybox: + # # 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整 + # return None + # else: + # # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑 + # return calculate_standard_competitor_pricing(my_price, total_price) # # 第一名是自己, 第二名 Amazon US 卖家 的情况 shop_name_1 = front_end_data.get("top_sellers")[0].get("shop_name") shop_name_2 = front_end_data.get("top_sellers")[1].get("shop_name") if len(front_end_data.get("top_sellers")) >=2 else "" if shop_name_1 == current_shop_name and "Amazon" in shop_name_2: price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 - diff = abs(my_price - price_2) - if diff < 5: - return price_2 -3 - elif 5.0 < diff <= 8.0: - return price_2 -3 + return RepricingLogic.situation_5_im_1st_amz_us_2nd(my_price,price_2) # --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) --- # 分支 A:第一名是 Amazon US 卖家 (特殊强敌优先) price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 - if "Amazon." in cart_seller: - diff = abs(my_price - price_1) - if diff <= 5.0 : - return None - elif 5.0 < diff <= 8.0: - return price_1 - 3.0 - elif diff > 8.0: - return price_1 - 6 # 跳过,不跟价 - + if "Amazon" in shop_name_1: + return RepricingLogic.isituation_4_encounter_amz_us_1st(my_price,price_1) # 分支 B:不是 Amazon US,且目前是自己的购物车 elif is_my_buybox: price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 - diff_with_2nd = price_2 - my_price - if diff_with_2nd >= 2.0: - return price_2 - 0.3 - else: - # 提价区间判定 - if (20 <= my_price <= 30) and diff_with_2nd >= 4: - return price_2 - 0.3 - elif (30 <= my_price <= 60) and diff_with_2nd >= 8: - return price_2 - 0.3 - elif (60 <= my_price <= 150) and diff_with_2nd >= 15: - return price_2 - 0.3 - else: - return None + return RepricingLogic.situation_2_own_buybox(my_price,price_2) # 分支 C:不是 Amazon US,也不是自己的购物车 else: # 正常情况下的普通跟价,调用阶梯逻辑 - return calculate_standard_competitor_pricing(my_price, price_1) + return RepricingLogic.situation_3_not_own_buybox(my_price, price_1) # ===================================================================== @@ -107,7 +177,7 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr diff = abs(my_current_price - target_competitor_price) # 根据阶梯执行跟价扣减 - if diff <= 0.3: + if 0 < diff < 0.5: return base_target - 0.5 elif 0.5 <= diff <= 0.8: return base_target - 0.7 @@ -117,12 +187,13 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr return base_target - 1.0 elif 2.5 < diff <= 3 : return None # 差距过大,跳过不跟价 - elif diff > 3: + # elif diff > 3: + # return base_target + else: return base_target - class ChromeAmzone: mark_name = "亚马逊详情采集" @@ -531,8 +602,8 @@ class AmzonePriceMatch(AmamzonBase): current_country_ele = self.tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]', timeout=20) current_country = current_country_ele.text.strip() - - while retry_num < 3: # 最多重试3次 + max_retry_num = 5 + while retry_num < max_retry_num: # 最多重试3次 try: if appoint_asin is not None: print(self.mark_name,"指定asin操作",appoint_asin) @@ -548,7 +619,7 @@ class AmzonePriceMatch(AmamzonBase): page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) if len(page_pamel) > 0: current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - + # yield (None,{"page":int(current_page.strip())}) # 总页数 total_page = page_pamel[0].sr.eles( 'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') @@ -567,6 +638,14 @@ class AmzonePriceMatch(AmamzonBase): sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10) print(f"【{self.mark_name}】获取到 {len(sku_ls)}") + + if len(sku_ls) == 0: + retry_num += 1 + print(f"没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}") + self.tab.refresh() + self.tab.wait.doc_loaded(raise_err=False, timeout=120) + continue + # for sku_ele in sku_ls[0:2]: for sku_ele in sku_ls: @@ -636,6 +715,7 @@ class AmzonePriceMatch(AmamzonBase): chrome = ChromeAmzone(tab=new_tab) front_end_data = chrome.run(country=current_country) chrome.close() + self.clear_tab() print(self.mark_name,"亚马逊前台抓取到数据",front_end_data) if front_end_data is None or len(front_end_data.get("top_sellers")) == 0: yield (asin, { @@ -698,8 +778,28 @@ class AmzonePriceMatch(AmamzonBase): "firstPlace": price_1, "secondPlace": price_2, "cartShopName" : cartShopName, + "shippingFee" : f"{shipping_fee}", "priceChangeStatus" : "改价成功", }) + else: + recommendedPrice = recommend_price + shipping_fee + price_1 = float(front_end_data.get("top_sellers")[0].get("price")) if len( + front_end_data.get("top_sellers")) >= 2 else "" # 实际第一名价格 + price_2 = float(front_end_data.get("top_sellers")[1].get("price")) if len( + front_end_data.get("top_sellers")) >= 2 else "" # 实际第二名价格 + cartShopName = front_end_data.get("cart_seller") + yield (asin, { + "statu": "跳过,无需改价", + "currentPrice": current_price, + "recommendedPrice": f"{recommendedPrice}", + "minimumPrice": bottom_price, # 最低价格 + "firstPlace": price_1, + "secondPlace": price_2, + "cartShopName": cartShopName, + "shippingFee": f"{shipping_fee}", + "priceChangeStatus": "跳过,无需改价", + }) + already_asin.add(asin) # 判断是否存在需要翻页的情况 @@ -714,6 +814,7 @@ class AmzonePriceMatch(AmamzonBase): num += 1 print(f"【{self.mark_name}】【程序计算】正在翻页,已翻 {num} 页...") already_asin = set() + retry_num = 0 except Exception as e: print(f"【{self.mark_name}】处理跟价操作异常", e) @@ -937,7 +1038,7 @@ class PriceTask: minimum_price_by_country_and_asin = shop_item.get("minimum_price_by_country_and_asin",{}) if len(minimum_price_by_country_and_asin) > 0: country_codes = minimum_price_by_country_and_asin.keys() - + # 指定ASIN的情况 mode = shop_item.get("mode") @@ -1006,6 +1107,7 @@ class PriceTask: self.post_stage_finished(task_id, user_id, stage_index) except Exception as e: self.log(f"回传结果失败: {str(e)}", "ERROR") + self.log(f"{task_id}任务处理完成") # 从正在执行中的店铺列表中移除 if shop_name in runing_shop: @@ -1136,32 +1238,35 @@ class PriceTask: else: _shopMallName = shopMallName ap_asin = None + for _ in range(max_retries): + for asin, status in driver.run_page_action( + current_shop_name=_shopMallName, + appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode, + miniprice_info=miniprice_info + ): + if asin is None: + continue + # 检查是否收到暂停请求 + if task_id in runing_task and runing_task[task_id].get("stop_requested", False): + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") + break - for asin, status in driver.run_page_action( - current_shop_name=_shopMallName, - appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode, - miniprice_info=miniprice_info - ): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break + self.log(f"ASIN {asin} 处理结果: {status}") - self.log(f"ASIN {asin} 处理结果: {status}") + # 更新任务状态 + if task_id in runing_task: + runing_task[task_id]["current_asin"] = asin + runing_task[task_id]["processed_asins"] += 1 - # 更新任务状态 - if task_id in runing_task: - runing_task[task_id]["current_asin"] = asin - runing_task[task_id]["processed_asins"] += 1 + runing_task[task_id]["failed_count"] += 1 - runing_task[task_id]["failed_count"] += 1 - - # 回传结果到API - try: - self.post_result(task_id, shop_name, country_code, asin, status,shopMallName) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") + # 回传结果到API + try: + self.post_result(task_id, shop_name, country_code, asin, status,shopMallName) + except Exception as e: + self.log(f"回传结果失败: {str(e)}", "ERROR") + break self.log(f"国家 {country_name} 处理完成") @@ -1216,18 +1321,6 @@ class PriceTask: """ url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result" - """ - (asin,{ - "statu" : "改价成功", - "currentPrice" : current_price, - "recommendedPrice" : f"{recommendedPrice}", - "minimumPrice" : bottom_price, #最低价格 - "firstPlace": price_1, - "secondPlace": price_2, - "cartShopName" : current_shop_name, - "priceChangeStatus" : "改价成功", - }) - """ payload = { "shops": [ @@ -1248,6 +1341,7 @@ class PriceTask: "deleteSkipAsin": status.get("deleteSkipAsin",False), "removeAsin": status.get("removeAsin") if status.get("removeAsin") else "", # "modifyCount": "2", + "shippingFee" : status.get("shippingFee") if status.get("shippingFee") else "", "status": status.get("statu") } ] @@ -1296,34 +1390,44 @@ class PriceTask: if __name__ == '__main__': # 使用示例 - user_info = { - "company": "尾号5578的公司115", - "username": "自动化_Robot", - "password": "#20zsg25" - } - shop_name = "林建华" - country = "德国" - kill_process('v6') - driver = AmzonePriceMatch(user_info) - browser = driver.open_shop(shop_name) - sw_suc = driver.SwitchingCountries(country) - driver.SwitchPage() - risk_listing_filter = "Active" - _shopMallName = "WEIZHENFENG168" - ap_asin ="B0FHGQY18W" - skip_asin = [] - for _ in range(3): - try: - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - print(e) - driver.tab.refresh() - if len(sku_ls) > 0: - print("有数据,开始操作") - for asin, status in driver.run_page_action( - current_shop_name=_shopMallName, - appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin" - ): - print(f"ASIN {asin} 的处理结果: {status}") - print("已完成操作") + # user_info = { + # "company": "尾号5578的公司115", + # "username": "自动化_Robot", + # "password": "#20zsg25" + # } + # shop_name = "刘建煌" + # country = "德国" + # kill_process('v6') + # driver = AmzonePriceMatch(user_info) + # browser = driver.open_shop(shop_name) + # sw_suc = driver.SwitchingCountries(country) + # driver.SwitchPage() + # risk_listing_filter = "Active" + # _shopMallName = "Jianhuang 888" + # ap_asin ="B0BGHRP6BS" + # skip_asin = [] + # for _ in range(3): + # try: + # sku_ls = driver.search(filter_type=risk_listing_filter) + # break + # except Exception as e: + # print(e) + # driver.tab.refresh() + # if len(sku_ls) > 0: + # print("有数据,开始操作") + # for asin, status in driver.run_page_action( + # current_shop_name=_shopMallName, + # appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin" + # ): + # print(f"ASIN {asin} 的处理结果: {status}") + # print("已完成操作") + + front_end_data = {"top_sellers": [{"rank": 1, "price": "36.81", "stock": "5", "shop_name": "Windera"}, {"rank": 2, "price": "36.50", "stock": "100", "shop_name": "Jianhuang 888"}], "cart_seller": "Windera", "timestamp": "2026-04-25 09:32:58"} + current_Price = 36.50 + current_shop_name = "Jianhuang 888" + recommended_price = 36.81 + recommended_shipping = 0 + calculate_target_price( + front_end_data, current_Price, current_shop_name, + recommended_price, recommended_shipping + ) \ No newline at end of file