
    Ng                        d dl mZ 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 d dlmZ erd d	lmZ d d
lmZ d dlmZmZ d dlmZ  e	e       G d d             Zy)    )annotationsN)defaultdict)TYPE_CHECKING)implementer)ISpiderLoader)walk_modules)iter_spider_classes)
ModuleType)Self)RequestSpider)BaseSettingsc                  Z    e Zd ZdZddZddZddZddZedd       Z	ddZ
ddZdd	Zy
)SpiderLoaderzZ
    SpiderLoader is a class which locates and loads spiders
    in a Scrapy project.
    c                    |j                  d      | _        |j                  d      | _        i | _        t        t              | _        | j                          y )NSPIDER_MODULESSPIDER_LOADER_WARN_ONLY)	getlistspider_modulesgetbool	warn_only_spidersr   list_found_load_all_spiders)selfsettingss     3lib/python3.12/site-packages/scrapy/spiderloader.py__init__zSpiderLoader.__init__   sH    )1)9)9:J)K'//0IJ13?J4?P     c                6   g }| j                   j                         D ]A  \  }}|j                  |D cg c]  \  }}t        |      dkD  rd| d|d| d! c}}       C |r1dj	                  |      }t        j                  d| dt        	       y y c c}}w )
N   z  z named z (in )z

z/There are several spiders with the same name:

z'

  This can cause unexpected behavior.category)r   itemsextendlenjoinwarningswarnUserWarning)r   dupesname	locationsmodclsdupes_strings          r   _check_name_duplicatesz#SpiderLoader._check_name_duplicates&   s    #{{002OD)LL %.$-S9~) WTHE#a8$-  3 !;;u-LMMC. IK$ s   $Bc                    t        |      D ]Y  }| j                  |j                     j                  |j                  |j                  f       || j
                  |j                  <   [ y N)r	   r   r.   append__name__r   )r   modulespclss      r   _load_spiderszSpiderLoader._load_spiders9   sK    (0EKK

#**FOOU^^+LM(-DMM%**% 1r    c           	     8   | j                   D ]$  }	 t        |      D ]  }| j                  |        & | j                          y # t        t        f$ rE | j
                  r5t        j                  dt        j                          d| dt               n Y w xY w)N
z$Could not load spiders from module 'z#'. See above traceback for details.r$   )r   r   r:   ImportErrorSyntaxErrorr   r*   r+   	traceback
format_excRuntimeWarningr3   )r   r.   r8   s      r   r   zSpiderLoader._load_all_spiders>   s    ''D*40F&&v. 1 ( 	##%  - 	>>MMY1134 5((,v .;; "0	 	s   !AABBc                     | |      S r5    )r1   r   s     r   from_settingszSpiderLoader.from_settingsO   s    8}r    c                X    	 | 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.loadS   s8    
	?==-- 	?/}=>>	?s    )c                    | j                   j                         D cg c]  \  }}|j                  |      s| c}}S c c}}w )zT
        Return the list of spider names that can handle the given request.
        )r   r&   handles_request)r   requestr.   r1   s       r   find_by_requestzSpiderLoader.find_by_request]   sD    
 #'--"5"5"7
"7YT33;N;Nw;WD"7
 	
 
s
   A A c                H    t        | j                  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.liste   s     DMM&&())r    N)r   r   )returnNone)r8   r
   rO   rP   )r   r   rO   r   )rG   strrO   ztype[Spider])rK   r   rO   	list[str])rO   rR   )r7   
__module____qualname____doc__r   r3   r:   r   classmethodrD   rH   rL   r   rC   r    r   r   r      s>    
!&.
&"  ?
*r    r   )
__future__r   r?   r*   collectionsr   typingr   zope.interfacer   scrapy.interfacesr   scrapy.utils.miscr   scrapy.utils.spiderr	   typesr
   typing_extensionsr   scrapyr   r   scrapy.settingsr   r   rC   r    r   <module>rb      sR    "   #   & + * 3  '&, ]P* P* P*r    