
    <,i0                         d Z ddlZddlZddlZddlmZ ddlmZ ddddd	d
dZg dZ G d d      Z	d Z
edk(  r ej                   e
              yy)u{   
832平台爬虫 - 河南地区商品数据抓取
目标：供应商名称、商品名称、单价、销量、联系方式
    N)datetime)async_playwright
chinadaviddabai123123410000zhenan_products.csvzhttps://ys.fupin832.com/z4https://ys.fupin832.com/product/list?areaCode=410000)usernamepassword	area_codeoutput_file	login_urlproduct_urlu   序号u   供应商名称u   商品名称u   单价(元)u   销量u   联系方式u   商品链接u   抓取时间c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)	Spider832c                 <    d | _         d | _        d | _        g | _        y )N)browsercontextpageproductsselfs    	spider.py__init__zSpider832.__init__$   s    	    c                   K   t        d       t               j                          d{   }|j                  j	                  dd       d{   | _        | j
                  j                  dddd	
       d{   | _        | j                  j                          d{   | _	        t        d       y7 7 k7 @7 w)u   初始化浏览器u   🚀 启动浏览器...NFi  )headlessslow_moi  i8  )widthheightz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)viewport
user_agentu   ✅ 浏览器启动成功)
printr   startchromiumlaunchr   new_contextr   new_pager   )r   
playwrights     r   init_browserzSpider832.init_browser*   s     '(+-3355
'0077 8 
 
 "\\55#t4U 6 
 
 ,,//11	)* 6

 2sE   'C B8$C B:,C ;B<<&C "B>#C :C <C >C c                 <  K   t        d       | j                  j                  t        d          d{    | j                  j	                  d       d{    	 | j                  j                  dd       d{    | j                  j                  d	       d{    | j                  j                  d
       d{   }|r5|j                  t        d          d{    t        dt        d           | j                  j                  d       d{   }|r+|j                  t        d          d{    t        d       | j                  j                  d       d{    | j                  j                  d       d{   }|D ]H  }|j                          d{   }d|v s d|vs%|j                          d{    t        d        n t        d       | j                  j                  d       d{    | j                  j                  }t        d|        | j                  j                  d       d{    t        d       y7 07 7 #  t        d       Y xY w7 7 7 7 l7 M7 "7 7 7 7 7 Gw)u   登录832平台u   🔐 开始登录...r   Nnetworkidleu   text="登录"i  )timeoutu-   未找到登录按钮，尝试其他方式...i  u0   input[placeholder*="账号"], input[type="text"]r   u   ✅ 输入用户名: zinput[type="password"]r	   u   ✅ 输入密码  buttonu   登录u   注册u   ✅ 点击登录按钮u   ⏳ 等待登录验证...u   📍 当前页面: zlogin_status.pngpathu    📸 登录状态截图已保存T)r"   r   gotoCONFIGwait_for_load_stateclickwait_for_timeoutquery_selectorfillquery_selector_all
inner_texturl
screenshot)r   username_inputpassword_inputsubmit_buttonsbtntextcurrent_urls          r   loginzSpider832.login9   sJ    $%iinnVK0111ii++M:::	C))///4/@@@ ii((...  $yy778jkk %%fZ&8999)&*<)=>?  $yy778PQQ %%fZ&8999$% ii((...  $yy;;HEE! 	C))D4HD$8iik!!./	 	)*ii((... iimm#K=12 ii""(:";;;01_ 	2: A	CAB. l9 R9 	/ F)! 	/ 	<s  1JI#"JI&J I, <I)=I, JI? "JJ!J$J%7JJ!J>J?-J,J-"JJJ,J-J6J;JJ;J
JAJJJ&J)I, ,I<9JJJJJJJJJJJc                    K   t        d       t        d       t        d       t        d       t                | j                  j                  d       d{    t        d       y7 w)	u0   等待手动登录（如果自动登录失败）z3
==================================================u.   ⚠️ 请在浏览器中手动完成登录...u   登录后请按回车继续...z3==================================================
zafter_login.pngr/   Nu   📸 登录后截图已保存)r"   inputr   r;   r   s    r   wait_for_manual_loginzSpider832.wait_for_manual_loginm   sW     m>?./mii""(9":::-. 	;s   AA+A)A+c                   K   t        d       | j                  j                  t        d          d{    | j                  j	                  d       d{    | j                  j                  d       d{    | j                  j                  d       d{    t        d       | j                  j                          d{   }t        d	t        |       d
       y7 7 7 r7 P7 %w)u   跳转到商品列表页面u#   🛒 跳转到河南商品列表...r   Nr+   i  zproduct_list.pngr/   u&   📸 商品列表页面截图已保存u   📄 页面长度: u    字符)	r"   r   r1   r2   r3   r5   r;   contentlen)r   rG   s     r   navigate_to_productszSpider832.navigate_to_productsw   s     34 iinnVM2333ii++M:::ii((... ii""(:";;;67 		))++#CL>9: 	4:. 	< ,sW   1C2C("C2C*"C29C,:#C2C.,C2
C0C2*C2,C2.C20C2c                 F  K   t        d       t        d      D ]Z  }| j                  j                  d       d{    | j                  j	                  d       d{    t        d|dz    d       \ | j                  j                  d	
       d{    y7 `7 ?7 	w)u   滚动页面加载更多商品u    📜 开始滚动加载商品...   zwindow.scrollBy(0, 1000)Nr-   u     第    u    次滚动完成zafter_scroll.pngr/   )r"   ranger   evaluater5   r;   )r   is     r   scroll_and_load_productsz"Spider832.scroll_and_load_products   s     01 q 	2A))$$%?@@@)),,T222F1Q3%/01	2 ii""(:";;; A2 	<s3   8B!B"B!B7B!BB!B!B!c                 J  K   t        d       | j                  j                  d       d{   }t        dt        |       d       t        |      dk(  rFt        d       | j                  j                  d       d{   }t        d	t        |       d       |S 7 r7  w)
u   提取商品数据u    🔍 开始提取商品数据...uY  
            () => {
                const results = [];
                
                // 尝试多种选择器
                const selectors = [
                    '.product-item',
                    '.product-list .item',
                    '[class*="product"]',
                    '.goods-item',
                    '.item-product',
                    '.pro-item'
                ];
                
                let items = [];
                for (const sel of selectors) {
                    items = document.querySelectorAll(sel);
                    if (items.length > 0) {
                        console.log('Found selector:', sel, 'with', items.length, 'items');
                        break;
                    }
                }
                
                // 如果没找到，尝试从表格或其他元素提取
                if (items.length === 0) {
                    // 尝试获取所有可能包含商品信息的元素
                    const allDivs = document.querySelectorAll('div');
                    for (const div of allDivs) {
                        const text = div.innerText || '';
                        // 匹配商品名称模式（包含价格等）
                        if (text.match(/\d+元/) && text.length > 10 && text.length < 200) {
                            results.push({
                                name: text.substring(0, 50),
                                raw: text
                            });
                        }
                    }
                }
                
                return results;
            }
        Nu   📊 初步提取到 u
    条数据r   u    🔄 尝试其他提取方式...u  
                () => {
                    const results = [];
                    
                    // 获取页面所有文本内容
                    const bodyText = document.body.innerText;
                    
                    // 尝试查找价格模式
                    const pricePattern = /(\d+\.?\d*元\/\w+)/g;
                    const prices = bodyText.match(pricePattern) || [];
                    
                    // 尝试查找商品列表区域
                    const mainContent = document.querySelector('main') || document.querySelector('.main') || document.body;
                    
                    // 获取所有链接文本，可能包含商品信息
                    const links = document.querySelectorAll('a[href*="product"], a[href*="goods"], a[href*="item"]');
                    links.forEach((link, index) => {
                        const text = link.innerText?.trim();
                        const href = link.href;
                        if (text && text.length > 2 && text.length < 100) {
                            results.push({
                                name: text,
                                url: href,
                                index: index
                            });
                        }
                    });
                    
                    return results.slice(0, 50); // 限制数量
                }
            u   📊 通过链接提取到 )r"   r   rN   rH   )r   products_datas     r   extract_productszSpider832.extract_products   s     01 #ii00 )2 ) )V 	%c-&8%9DE }"45"&))"4"4 6 # M> /M0B/C:NOc)`s"   *B#BAB# B!B#!B#c                 v  K   t        d       	 | j                  j                  d       d{   }t        dt        |j	                                       | j
                  j                          d{   }t        dt        |              y7 c7 # t        $ r}t        d|        Y d}~yd}~ww xY ww)u   尝试通过API获取数据u#   🌐 尝试通过API获取数据...a  () => {
                const items = {};
                for (let i = 0; i < localStorage.length; i++) {
                    const key = localStorage.key(i);
                    items[key] = localStorage.getItem(key);
                }
                return items;
            }Nu   📦 LocalStorage: u   🍪 Cookies数量: u   ⚠️ API获取失败: )	r"   r   rN   listkeysr   cookiesrH   	Exception)r   local_storagerW   es       r   try_api_extractionzSpider832.try_api_extraction   s     34
	2"&))"4"4 6 # M ']-?-?-A(B'CDE !LL0022G(W78 3  	2,QC011	2sQ   B9B BAB 4B5B B9B B 	B6B1,B91B66B9c                   K   | j                   st        d       yt        d   }t        |ddd      5 }t	        j
                  |t              }|j                          t        | j                   d	      D ]  \  }}||j                  d
d      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      t        j                         j                  d      d}|j                  |        	 ddd       t        d|        t        dt        | j                          d       y# 1 sw Y   :xY ww)u   保存数据到CSVu   ⚠️ 没有数据可保存Nr   w z	utf-8-sig)newlineencoding)
fieldnamesrL   suppliernamepricesalescontactr:   %Y-%m-%d %H:%M:%Sr   u   ✅ 数据已保存到: u   📊 共保存 u
    条记录)r   r"   r2   opencsv
DictWriterCSV_HEADERSwriteheader	enumerategetr   nowstrftimewriterowrH   )r   output_pathfwriteridxproductrows          r   save_to_csvzSpider832.save_to_csv  s/    }}01]++sBE 	%^^A+>F  )$-- ; %W!'.{{:r'B$+KK$;#*;;w#;%kk'26$+KK	2$>$+KKr$:$,LLN$;$;<O$P	 $%		%" 	(67DMM 23:>?%	% 	%s   1E C'E9E EE c                    K   | j                   r.| j                   j                          d{    t        d       yy7 w)u   关闭浏览器Nu   🔒 浏览器已关闭)r   closer"   r   s    r   rz   zSpider832.close#  s4     <<,,$$&&&+, &s   *A >A N)__name__
__module____qualname__r   r)   rB   rE   rI   rP   rS   r[   rx   rz    r   r   r   r   #   s8    +2h/;"<Vp24@8-r   r   c                    K   t        d       t        d       t        d       t        dt        j                         j                  d      z          t        d       t	               } 	 | j                          d{    | j                          d{    | j                          d{    | j                          d{    | j                          d{    | j                          d{   }|r || _        | j                          d{    n#t        d       | j                          d{    t        d	       t        d
       t        d       t        d       t#                | j%                          d{    y7 7 7 7 7 7 7 7 b# t        $ r,}t        d|        ddl}|j!                          Y d}~od}~ww xY w7 N# t        d       t#                | j%                          d{  7   w xY ww)u	   主函数z<============================================================u     832平台 河南商品爬虫u     作者: 李狗蛋u
     时间: rg   z=============================================================
Nu4   ⚠️ 未提取到商品数据，尝试API方式...z=
============================================================u     爬虫执行完成！u   ❌ 错误: r   u   
按回车键关闭浏览器...)r"   r   ro   rp   r   r)   rB   rE   rI   rP   rS   r   rx   r[   rX   	traceback	print_excrD   rz   )spiderr   rZ   r   s       r   mainr   )  s    	&M	
*+	
 	,001DE
EF	-[F(!!### lln **,,, ))+++ --///  0022&FO$$&&&HI++---m'(f 	01llnM 	$ 	 	- 	, 	0 3
 ' .  QC ! 	 	01llns   A&H)F <F=F FF ,F-F FF FF 4F5 F F#F 9F:%F (HGHF F F F F F F F 	G'"G	G GG H)HHHH__main__)__doc__asynciori   osr   playwright.async_apir   r2   rk   r   r   r{   runr~   r   r   <module>r      so   
  
 	  1 '+I
	D- D-L2h zGKK r   