
    3 d                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ  ee           G d d                      ZdS )	    N)defaultdict)implementer)ISpiderLoader)walk_modules)iter_spider_classesc                   R    e Zd ZdZd Zd Zd Zd Zed             Z	d Z
d Zd	 Zd
S )SpiderLoaderzZ
    SpiderLoader is a class which locates and loads spiders
    in a Scrapy project.
    c                     |                     d          | _        |                    d          | _        i | _        t          t                    | _        |                                  d S )NSPIDER_MODULESSPIDER_LOADER_WARN_ONLY)	getlistspider_modulesgetbool	warn_only_spidersr   list_found_load_all_spiders)selfsettingss     3lib/python3.11/site-packages/scrapy/spiderloader.py__init__zSpiderLoader.__init__   s]    &../?@@!))*CDD!$''         c                     g }| j                                         D ]'\  |                    fdD                        (|r6d                    |          }t	          j        d| dt                     d S d S )Nc           	      T    g | ]$\  }}t                    d k    d| dd| d%S )   z  z named z (in ))len).0modcls	locationsnames      r   
<listcomp>z7SpiderLoader._check_name_duplicates.<locals>.<listcomp>   sY        S9~~)888T88#888  r   z

z/There are several spiders with the same name:

z'

  This can cause unexpected behavior.category)r   itemsextendjoinwarningswarnUserWarning)r   dupesdupes_stringr"   r#   s      @@r   _check_name_duplicatesz#SpiderLoader._check_name_duplicates   s    #{0022 	 	OD)LL    $-       	!;;u--LMKK K K$     	 	r   c                     t          |          D ]B}| j        |j                                     |j        |j        f           || j        |j        <   Cd S N)r   r   r#   append__name__r   )r   modulespclss      r   _load_spiderszSpiderLoader._load_spiders-   sZ    (00 	. 	.EK
#**FOU^+LMMM(-DM%*%%	. 	.r   c           	      *   | j         D ]v}	 t          |          D ]}|                     |           +# t          $ r? | j        r4t          j        dt          j                     d| dt                     n Y sw xY w| 
                                 d S )N
z$Could not load spiders from module 'z#'. See above traceback for details.r%   )r   r   r6   ImportErrorr   r*   r+   	traceback
format_excRuntimeWarningr/   )r   r#   r4   s      r   r   zSpiderLoader._load_all_spiders2   s    ' 	 	D*400 / /F&&v..../ 	 	 	> M;Y133 ; ;(,; ; ; "0	      	 	##%%%%%s   '3AA<;A<c                      | |          S r1    )r!   r   s     r   from_settingszSpiderLoader.from_settingsC   s    s8}}r   c                 ^    	 | j         |         S # t          $ r t          d|           w xY w)z
        Return the Spider class for the given spider name. If the spider
        name is not found, raise a KeyError.
        zSpider not found: )r   KeyError)r   spider_names     r   loadzSpiderLoader.loadG   sF    
	?=-- 	? 	? 	?===>>>	?s    ,c                 N    fd| j                                         D             S )zT
        Return the list of spider names that can handle the given request.
        c                 D    g | ]\  }}|                               |S r>   )handles_request)r   r#   r!   requests      r   r$   z0SpiderLoader.find_by_request.<locals>.<listcomp>U   s@     
 
 
T33;N;Nw;W;W

 
 
r   )r   r'   )r   rG   s    `r   find_by_requestzSpiderLoader.find_by_requestQ   s<    
 
 
 
"&-"5"5"7"7
 
 
 	
r   c                 N    t          | j                                                  S )zW
        Return a list with the names of all spiders available in the project.
        )r   r   keys)r   s    r   r   zSpiderLoader.listY   s      DM&&(()))r   N)r3   
__module____qualname____doc__r   r/   r6   r   classmethodr?   rC   rH   r   r>   r   r   r	   r	      s         
! ! !  &. . .
& & &"   [? ? ?
 
 
* * * * *r   r	   )r:   r*   collectionsr   zope.interfacer   scrapy.interfacesr   scrapy.utils.miscr   scrapy.utils.spiderr   r	   r>   r   r   <module>rT      s         # # # # # # & & & & & & + + + + + + * * * * * * 3 3 3 3 3 3 ]P* P* P* P* P* P* P* P* P* P*r   