Files
twoJob-demo/scripts/__pycache__/collect_fields.cpython-313.pyc
T

102 lines
15 KiB
Plaintext
Raw Normal View History

2026-09-03 15:35:23 +08:00
ó
…KZj”*ãóÜ•SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSr Sr
Sr Sr SSjr
SSjrS rS
rS rS rS
rSrSSjrSrSrSrSrSrSrSrSrSrSr\ S:Xa\"5 gg)uY全站列表页深度采集器 (任务1 + 任务3)。
对�个有 URL 的��功能页:
1) 点「更多/更多�作�等入�, 抓�下拉��里的��功能项(�现之�未扫�到的界�);
2) 点「自定义列/设置字段/选择表头�(#icon-custom-columns 或文字)弹窗, 抓�全部�选字段
(�"系统字段/自定义字段"分组), 远超截图与导出Excel的��字段;
3) 兜底: 抓�默认渲染出的��列头。
结果写 SQLite: page_extras(��入�) + field_specs(完整字段字典)。
å¤�用é�žå�‡åŒ€æ‹Ÿäººé—´éš”与登录æ€�检测。éNzhttp://127.0.0.1:10086/commandÚ2haohrzdb/research.dbzdb/collect_fields.logcó<•[R"X[S.5R5n[R
R
[USS0S9n[R"[R
RXBS9R5R55$)N)ÚactionÚargsÚsessionz Content-Typezapplication/json)ÚdataÚheaders)Útimeout) ÚjsonÚdumpsÚSÚencodeÚurllibÚrequestÚRequestÚDÚloadsÚurlopenÚreadÚdecode)ÚarÚtÚbÚrs ÚA/Users/lucky/Documents/WorkSapce/TwoJob/scripts/collect_fields.pyÚcallrsr€Ü �
Š
˜a¼!Ñ<Ó=×DÑDÓF€AÜ�‰×Ñœq q°>ÐCUÐ2VÐÐW€AÜ �:Š:”f—n‘n×,Ñ,¨QÐ,Ð:×?Ñ?ÓA×HÑHÓJÓ KÐKócó°•[SSU0U5RS05RS5$![anS[U5SS-sSnA$SnAff=f)NÚevaluateÚcoderÚvaluezEXC:éP)rÚgetÚ ExceptionÚstr)r rÚes rÚevr'sW€ð$Ü�J ¨ °Ó2×6Ñ6°v¸rÓB×FÑFÀwÓOÐOøÜ ó$Øœ˜A›˜s ˜ Ñ#Õ#ûð$ús‚-0°
AºAÁ
AÁAcóÆ•[R"S5U-n[USS9 [[S5nUR US-5 SSS5 g!,(df  g=f)Nz %H:%M:%S T)ÚflushrÚ
)ÚtimeÚstrftimeÚprintÚopenÚLOGÚwrite)ÚmÚlineÚfs rÚlogr4sD€Ü �=Š=˜Ó %¨Ñ )€DÜ ˆ$�dÒÜ
Œc�3Œ˜1Ø �‰��t‘ Ô÷
�Žús ´AÁ
A cód•[R"[5n[RUlU$)N)Úsqlite3ÚconnectÚDBÚRowÚ row_factory©Úcs rÚdbr=%s€Ü�ŠœÓ€A¬W¯[©[˜Qœ]À¸(rcó¾•[5nURS5 URS5 URS5 UR5 UR5 g)Nz¦CREATE TABLE IF NOT EXISTS page_extras(
id INTEGER PRIMARY KEY AUTOINCREMENT, node_key TEXT, full_path TEXT, url TEXT,
kind TEXT, label TEXT, ts TEXT)zÎCREATE TABLE IF NOT EXISTS field_specs(
id INTEGER PRIMARY KEY AUTOINCREMENT, node_key TEXT, full_path TEXT, url TEXT,
field TEXT, field_group TEXT, source TEXT, sort_order INTEGER, ts TEXT)zPRAGMA journal_mode=DELETE©r=ÚexecuteÚcommitÚcloser;s rÚensurerC)sO€Ü
‹€A؇I�Ið+ô,ð‡I�IðSôTð‡I�IÐ*Ô+؇H�H„J�—‘• rcó¤•[5nURSU45 URSU45 UR5 UR5 g)Nz(DELETE FROM page_extras WHERE node_key=?z(DELETE FROM field_specs WHERE node_key=?r?)Únkr<s rÚ
clear_pagerF5s<ۆ
‹€A؇I�IÐ8¸2¸%Ô@؇I�IÐ8¸2¸%Ô@؇H�H„J�—‘• rc
óÄ•[5n[R"S5nUHupgURSXX&Xu45 M UR 5 UR 5 g)Nú%Y-%m-%d %H:%M:%SzQINSERT INTO page_extras(node_key,full_path,url,kind,label,ts) VALUES(?,?,?,?,?,?))r=r+r,r@rArB)rEÚfpÚurlÚitemsr<ÚtsÚkindÚlabels rÚ save_extrasrO<sO€Ü
‹€A”4—=’=Ð!4Ó5ˆbÛ‰ ˆØ � ‰ Ðeؘ3 eÐ0ö 2ñð‡H�H„J�—‘• rc óÞ•[5n[R"S5n[U5Hunup‰UR SXX)X„Xv45 M UR 5 UR
5 g)NrHznINSERT INTO field_specs(node_key,full_path,url,field,field_group,source,sort_order,ts) VALUES(?,?,?,?,?,?,?,?))r=r+r,Ú enumerater@rArB)
rErIrJÚfieldsÚsourcer<rLÚiÚgrpÚnames
rÚ save_fieldsrWDs]€Ü
‹€A”4—=’=Ð!4Ó5ˆbÜ# FÖ+‰ˆ‰;ˆCØ � ‰ ð-Ø/1°sÀ#ÈqÐ.Uö Wñ,ð‡H�H„J�—‘• rcó‚•[R"5nUS:Xa5US:a[R"SS5O[R"SS5nO4US:a[R"SS5O[R"SS 5n[SU[R"S
S 5-5n[R
"U5 U$) NÚpagegffffffæ?g @g @g2@gè?gð?g@g@rçš™™™™™Ù?)ÚrandomÚuniformÚmaxÚgaussr+Úsleep)rMrÚds rÚ human_delayraLs…€Ü�
Š
‹€AØ ˆvƒ~Ø()¨C«ŒF�NŠN˜3 Ô $´V·^²^ÀCÈÓ5N‰à()¨D«ŒF�NŠN˜3 Ô $´f·n²nÀSÈ#Ó6NˆÜ ˆC�”V—\’\ ! SÓ)Ñ)Ó*€A܇J‚Jˆq„M˜!�8rcóP•[S5n[U[5=(a SU;$)Nz
location.hrefz/login)r'Ú
isinstancer%)Úhs rÚ
logged_outreVs"ۆ
ˆ?Ó€AÜ �aœÓ × / (¨a¡-Ð/ru(()=>{const kws=['更多','更多æ“�作','更多设置'];
const b=[...document.querySelectorAll('button,a,span,div')].find(x=>x.childElementCount===0&&kws.includes((x.innerText||'').trim())&&x.getBoundingClientRect().width>0);
if(!b)return 'no-more';b.click();return 'clicked';})()u(()=>{const BAD=/�索|�\/页|进入员工端|进入官网|退出登录|个性化设置|按.*排�|��|��|帮助/;
const boxes=[...document.querySelectorAll('[class*=dropdown],[class*=Dropdown],[class*=popper],[class*=popover],[class*=Popover],[role=menu]')]
.filter(m=>{const r=m.getBoundingClientRect();return r.width>0&&r.height>0;});
let out=[];
for(const box of boxes){
const its=[...box.querySelectorAll('li,[role=menuitem],[class*=item],[class*=option]')]
.map(e=>(e.innerText||'').replace(/\s+/g,'').trim()).filter(t=>t&&t.length>1&&t.length<16&&!BAD.test(t));
const uniq=[...new Set(its)];
if(uniq.length>=1&&uniq.length<=15)out=out.concat(uniq); // 超过15视为筛选��污染, 丢弃
}
return JSON.stringify([...new Set(out)]);})()u„(()=>{
const u=[...document.querySelectorAll('use')].find(u=>{const h=(u.getAttribute('xlink:href')||u.getAttribute('href')||'');return h==='#icon-custom-columns'||h==='#icon-setting'&&false;});
if(u){const b=u.closest('button,a,[role=button],span,div');if(b){b.click();return 'icon';}}
const kw=/^(自定义列|设置字段|字段设置|选择表头|表头设置|设置花�册字段|列设置|自定义字段)$/;
const t=[...document.querySelectorAll('button,a,span,div,li')].find(x=>x.childElementCount===0&&kw.test((x.innerText||'').trim())&&x.getBoundingClientRect().width>0);
if(t){t.click();return 'txt';}
return 'none';})()us(()=>{
const pop=[...document.querySelectorAll('div,aside,section')].find(m=>{const t=m.innerText||'';const r=m.getBoundingClientRect();
return r.width>180&&r.width<700&&r.height>200&&/选择表头|已选/.test(t)&&m.querySelectorAll('input[type=checkbox]').length>3;});
if(!pop)return 'no-modal';
const GRPS=['系统字段','自定义字段','基础字段','常用字段','其他字段','个人信�','工作信�','��信�'];
const NOISE=new Set(['选择表头','没有�索到相关内容','全部','清除','�消','确定','��默认','�置','�索','已选']);
let seq=[],cur='';
const walk=el=>{for(const c of el.childNodes){
if(c.nodeType===3){const t=(c.textContent||'').trim();if(t&&t.length<15){if(GRPS.includes(t))cur=t;else if(!NOISE.has(t)&&!/^已选/.test(t))seq.push([cur,t]);}}
else if(c.nodeType===1){if(c.tagName==='LABEL'){const t=(c.innerText||'').trim();if(t&&t.length<15&&!NOISE.has(t))seq.push([cur,t]);}else walk(c);}}};
walk(pop);
const seen=new Set(),out=[];for(const [g,n] of seq){if(seen.has(n))continue;seen.add(n);out.push([g,n]);}
return JSON.stringify(out);})()uç(()=>{const b=[...document.querySelectorAll('a,button,span')].find(x=>x.childElementCount===0&&/ç«‹å�³åˆ·æ–°/.test((x.innerText||'').trim())&&x.getBoundingClientRect().width>0);if(b){b.click();return 'refreshed';}return 'none';})()uþ(()=>{const b=[...document.querySelectorAll('button,a')].find(x=>{const t=(x.innerText||'').trim();return (t==='å�–消'||t==='关闭')&&x.getBoundingClientRect().width>0;});
if(b){b.click();return 'closed';}document.body.click();return 'bodyclick';})()uq(()=>{const BAD=/^(�作|��|全选|选择|处�)$|^\d+日|^\d+$/;
const heads=[...document.querySelectorAll('[role=columnheader],th,[class*=headerCell],[class*=header_] [class*=cell_],[class*=thead] [class*=cell]')]
.map(e=>(e.innerText||'').replace(/\s+/g,'').trim()).filter(t=>t&&t.length<20&&!BAD.test(t));
return JSON.stringify([...new Set(heads)]);})()c óÒ•USUSUSpTn[SXU4-5 [SUSS.5 [R"S5 [ S5H*n[ 5(d O[R"S 5 M, [ 5(a [S
5 g [
[5S :Xa[R"S
5 [U5 /n[ S
5HÇn[
[5S:wa O³[R"SUS--5 [R"[
[55n U (aCU Hn
URSU
45 M [
[5 [R"S5 O)[
[5 [R"S5 MÉ U(a>[!XSXG5 [S[#U5SR%SUSS554-5 /n Sn [
[&5S:waŽ[R"S5 [
[(5n
[+U
[,5(a-U
R/S5(a[R"U
5n Sn [
[5 [R"S5 U (d:[R"[
[055nUVs/sHnSU4PM n nSn U (aA[3XSXKU 5 [S[#U 5U SR%SU SS 554-5 O [S!5 [#U 5$![a /n GN f=f![a /n Nçf=f![a /nN§f=fs snf)"NÚ full_pathrJÚnode_keyz
[%d/%d] %sÚnavigateF)rJÚnewTabééu !! 登录æ€�失效, 中止éÿÿÿÿÚ refreshedéÚclickedg333333ó?gš™™™™™é?Ú more_menugà?rZu! 更多è�œå�•项: %d 个 -> %suã€�c3ó*# •UH oSv• M g7f©éN©)Ú.0Úxs rÚ <genexpr>Úprocess.<locals>.<genexpr>·sé€ÐJdÒYcÐTUÈQÎ4ÒYcùó‚éÚÚnonegø?Ú[Úcustom_columnsÚ visible_colsu$ 字段: %d 个 (æ�¥æº�=%s) -> %sc3ó*# •UH oSv• M g7frsru)rvr3s rrxryÏsé€ÐUpÒdoÐ_`ÐXYÖVZÒdoùrzé
u' 无字段入å�£(å�¯èƒ½é�žè¡¨æ ¼é¡µ))r4rr+r_Úrangerer'ÚREFRESHrFÚ
CLICK_MOREr rÚ
MENU_ITEMSr$ÚappendÚ CLOSE_MODALrOÚlenÚjoinÚ CLICK_COLSETÚ GRAB_FIELDSrcr%Ú
startswithÚ VISIBLE_COLSrW)ÚpÚidxÚtotalrIrJrEÚ_ÚextrasÚattemptrKÚitrRrSÚrawÚcolsr<s rÚprocessr˜•s°€Ø�K‘. ! E¡(¨A¨j©MˆR€B܈ ˜ BÐ'Ñ'Ô(܈˜S¨EÑ2Ô3܇J‚Jˆq„MÜ