Files
xhs_crawler_claude/app/__pycache__/user_resolver.cpython-311.pyc
T

62 lines
8.8 KiB
Plaintext
Raw Normal View History

2026-01-12 18:58:23 +08:00
§
sÑdiñãóÜ—dZddlmZddlZddlZddlZddlZddlmZddl m
Z
m Z m Z ddl
mZddlmZej ejd¦«Zdd „Zd d„Zd!d„Zd"d„Zddœd#d„ZdS)$uŠuser_resolver.py
将“数字�红书�(例如 11432840954)�解�� profile_id(/user/profile/{profile_id} 里的那串)。
- 使用 Playwright 打开�索结果页(更接近真实�览器,风险更低)
- 解� HTML:根� '�红书�:<keyword>' 定�,���附近的 profile href
- 强制缓存:data/profile_map.json,�����索造�风控压力
é)Ú annotationsN)Úunescape)ÚDictÚOptionalÚTuple)ÚBrowser)Úconfigzprofile_map.jsonÚreturnúDict[str, str]có—tj t¦«siS t tdd¬¦«5}t j|¦«picddd¦«S#1swxYwYdS#t$ricYSwxYw)NÚrúutf-8©Úencoding)ÚosÚpathÚexistsÚPROFILE_MAP_FILEÚopenÚjsonÚloadÚ Exception)Úfs ú'/mnt/data/xhs_proj/app/user_resolver.pyÚ _load_maprs΀Ý
Œ7�>Š>Õ*Ñ +Ô +ðØˆ ðÝ
Õ" C°'Ð
:Ñ
:Ô
:ð &¸aÝ”9˜Q‘<”<Ð% 2ð &ð &ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &øå ðððØˆ ˆ ˆ ðøøøs4¨A/¿A"Á A/Á"A&Á&A/Á)A&Á*A/Á/ A>Á=A>ÚmÚNonecóÒ—tdz}t|dd¬¦«5}tj||dd¬¦«ddd¦«n #1swxYwYt j|t¦«dS)Nz.tmpÚwrrFé)Ú ensure_asciiÚindent)rrrÚdumprÚreplace)rÚtmprs rÚ _save_mapr&$s¥€Ý
˜VÑ
#€CÝ
ˆc�3 Ð )Ñ )Ô )ð6¨QÝ Œ �!�Q U°1Ð5Ñ5Ô5Ð5ð6ð6ð6ñ6ô6ð6ð6ð6ð6ð6ð6øøøð6ð6ð6ð6å„JˆsÕ$Ñ%Ô%Ð%Ð%Ð%s�AÁAÁ AÚhtmlÚstrÚkeywordú
Optional[str]cóB—|sdSt|¦«}d|›�}| |¦«}|dkrdStd|dz
¦«}tt |¦«|dz¦«}|||…}t jd|¦«}|sdS| d¦«S)uC从 search_result HTML 中解æž�出对应 keyword çš„ profile_id。Nuå°�红书å�·ï¼šéÿÿÿÿriˆz%href="\/user\/profile\/([0-9a-fA-F]+)é)rÚfindÚmaxÚminÚlenÚreÚsearchÚgroup)r'r)ÚmarkerÚidxÚstartÚendÚchunkrs rÚ#extract_profile_id_from_search_htmlr:+s®€à ð؈tå �D‰>Œ>€DØ
(˜wÐ
(Ð
(€FØ
�)Š)�FÑ
Ô
€CØ
ˆb‚y€y؈tå ��3˜‘:Ñ Ô €EÝ
�c�$‰iŒi˜˜t™Ñ
$Ô
$€CØ ��s�ŒO€Eå
Œ Ð:¸EÑBÔB€AØ ð؈tØ �7Š7�1‰:Œ:ÐóÚlineú2Tuple[Optional[str], Optional[str], Optional[str]]cóÜ—| ¦«}|sdS| d¦«s| d¦«rdSd}d|vrC| dd¦«\}}| ¦«}| ¦«pd}| ¦«}|r|d ¦«nd}t|¦«dkr3|s1d |dd…¦« ¦«pd}t jd |¦«}|rd| d¦«|fSt jd
|¦«rd||fSt jd |¦«r|d|fSdd|fS) u;è§£æž�一行 txt,返回 (keywordæ•°å­—, profile_id, label备注) 三者之一。
�许格�:
- 11432840954
- 11432840954 张三
- https://www.xiaohongshu.com/user/profile/<profile_id> ...
- /user/profile/<profile_id> ...
- profile_id(�六进制串)
- 支�行尾 # 备注
)NNNú#z//Nr-rÚú z/user/profile/([0-9a-fA-F]+)z[0-9a-fA-F]{8,}z\d{5,20}) ÚstripÚ
startswithÚsplitr1Újoinr2r3r4Ú fullmatch)r<ÚrawÚlabelÚpartsÚcorers rÚ parse_line_to_keyword_or_profilerK@s‚€ð �*Š*‰,Œ,€CØ ð ØÐð ‡~‚~�cÑÔð ˜cŸnšn¨TÑ2Ô2ð ØÐð
€EØ
ˆc€z€zØ—Y’Y˜s AÑ&Ô&‰
ˆˆUØ�iŠi‰kŒkˆØ— ’ ‘
”
Ð% ˆà �IŠI‰KŒK€EØ$Ð ,ˆ5�Œ8�>Š>Ñ Ô Ð ¨"€DÝ
ˆ5�z„z�A‚~€~˜e€~Ø—’˜˜q˜r˜rœÑ#Ô#×)Ò)Ñ+Ô+Ð3¨tˆõ Œ Ð1°4Ñ8Ô8€AØð'Ø�Q—W’W˜Q‘Z”Z Ð&Ð&õ
„|Ð&¨Ñ-Ô-ð!Ø�T˜5Ð Ð õ
„|�K Ñ&Ô&ð!Ø�T˜5Ð Ð à ��uÐ Ðr;T)Ú slow_modeÚbrowserrrLÚboolúTuple[Optional[str], str]cƒóK—t¦«}||vr
||dfS| ¦«ƒd{V—†}| ¦«ƒd{V—†} tj›d|›d�}| |dd¬¦«ƒd{V—†|r¼| ttj dd ¦«¦«¦«ƒd{V—† |j
  d
tj d d ¦«¦«ƒd{V—†n#t$rYnwxYw| ttj d
d¦«¦«¦«ƒd{V—†| ¦«ƒd{V—†}t||¦«}|s[ | ¦«ƒd{V—†n#t$rYnwxYw | ¦«ƒd{V—†dS#t$rYdSwxYw|||<t#|¦«|df | ¦«ƒd{V—†n#t$rYnwxYw | ¦«ƒd{V—†S#t$rYSwxYw#t$rh} dd| ›�fcYd} ~ | ¦«ƒd{V—†n#t$rYnwxYw | ¦«ƒd{V—†S#t$rYSwxYwd} ~ wwxYw# | ¦«ƒd{V—†n#t$rYnwxYw | ¦«ƒd{V—†w#t$rYwwxYwxYw)uZ将数字 keyword è§£æž�æˆ� profile_id,并写入缓存。返回 (profile_id, message)。ÚcacheNz/search_result?keyword=z&source=unknownÚdomcontentloadedi N)Ú
wait_untilÚtimeouti i@réÈiXi�iè)NÚ not_foundÚokzerror:)rÚ new_contextÚnew_pager ÚXIAOHONGSHU_BASE_URLÚgotoÚwait_for_timeoutÚintÚrandomÚuniformÚmouseÚwheelÚrandintrÚcontentr:Úcloser&)
rMr)rLrÚcontextÚpageÚurlr'ÚpidÚes
rÚresolve_keyword_to_profile_idrjosrèè€å‰ Œ €AØ�!€|€|Ø�Œz˜7Ð"Ð"ð×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)€GØ×!Ò!Ñ#Ô#Ð #Ð #Ð #Ð #Ð #Ð #€Dð ÝÔ,Ð]Ð]ÀWÐ]Ð]Ð]ˆØ�iŠi˜Ð(:ÀEˆiÑJÔJÐJÐJÐJÐJÐJÐJÐJð ð HØ×'Ò'­­F¬N¸3ÀÑ,EÔ,EÑ(FÔ(FÑGÔGÐ GÐ GÐ GÐ GÐ GÐ GÐ Gð
Ø”j×&Ò& q­&¬.¸¸cÑ*BÔ*BÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCøÝð
ð
ð