
    3 d                        d Z ddlZddlZddlmZ ddlmZ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mZ dd
lmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$  G d d          Z%d Z&d Z'dS )z:Scrapy Shell

See documentation in docs/topics/shell.rst

    N)is_item)deferthreads)
threadable)
any_to_uri)Crawler)IgnoreRequest)RequestResponse)Settings)Spider)
get_config)DEFAULT_PYTHON_SHELLSstart_python_console)SequenceExclude)load_object)is_asyncio_reactor_installedset_asyncio_event_loop)open_in_browserc                   Z    e Zd ZeeeeefZddZ	ddZ
d Zd ZddZddZd	 Zd
 Zd ZdS )ShellNc                     || _         |pd | _        t          |j        d                   | _        d | _        t          j                     | _        || _	        i | _
        d S )Nc                     d S N )xs    ,lib/python3.11/site-packages/scrapy/shell.py<lambda>z Shell.__init__.<locals>.<lambda>!   s    T     DEFAULT_ITEM_CLASS)crawlerupdate_varsr   settings
item_classspiderr   isInIOThreadinthreadcodevars)selfr!   r"   r(   s       r   __init__zShell.__init__   s\    &:>>%g&67K&LMM&3555				r   Tc                    t          j         t           j        t           j                   |r|                     |||           nN|r|                     ||           n5|r|j        }|                     |||           n|                                  | j        r6t          t          | j        t                      | j
                             d S 	 t                      }d\  }}t          j                            d          }	g }
|	r=|
|	                                                                                    d          z  }
nk|                    ||          r?|
|                    ||                                                                          gz  }
n|
t'          j                    z  }
|
dgz  }
t+          | j
        |
| j
                            dd                     d S )	N)redirect)r#   shellSCRAPY_PYTHON_SHELL,pythonbanner )shellsr2   )signalSIGINTSIG_IGNfetchrequestpopulate_varsr(   printevalglobalsr)   r   osenvirongetstriplowersplit
has_optionr   keysr   pop)r*   urlr9   responser%   r-   cfgsectionoptionenvr4   s              r   startzShell.start(   s   fmV^444 	!JJsFXJ6666 	!JJw'''' 	!&Gx&9999   9 	$ty'))TY7788888 ,,C1OGV*..!677CF 7#))++++--33C88800 73777F3399;;AACCDD/4666xj F 	&x1L1L     r   c                    t                      r!| j        j        d         }t          |           |                     |          t          |          }|                    fd           | j        j                            |           |S )NASYNCIO_EVENT_LOOPc                     | fS r   r   )r   r%   s    r   r   z!Shell._schedule.<locals>.<lambda>W   s    F r   )	r   r!   r#   r   _open_spider_request_deferredaddCallbackenginecrawl)r*   r9   r%   event_loop_pathds     `  r   	_schedulezShell._scheduleP   s    ')) 	4"l34HIO"?333""7F33g&&	++++,,,!!'***r   c                     | j         r| j         S |%| j        j         p| j                                        }|| j        _         | j        j                            |d           || _         |S )NF)close_if_idle)r%   r!   _create_spiderrT   open_spider)r*   r9   r%   s      r   rQ   zShell._open_spider[   sn    ; 	; 	J\(IDL,G,G,I,IF$''e'DDDr   c                 v   ddl m} t          |t                    r|}nPt	          |          }t          |fddi|}|r&t          t          dd                    |j        d<   n
d|j        d<   d }	 t          j	        || j
        ||          \  }}n# t          $ r Y nw xY w|                     |||           d S )	Nr   )reactordont_filterTi,  i  handle_httpstatus_listhandle_httpstatus_all)twisted.internetr^   
isinstancer
   r   r   rangemetar   blockingCallFromThreadrX   r	   r:   )	r*   request_or_urlr%   r-   kwargsr^   r9   rG   rH   s	            r   r8   zShell.fetchg   s    ,,,,,,ng.. 
	=$GG^,,Cc>>t>v>>G =9H#sOO: :566 9=45	&=&   Hff  	 	 	D	8Wf55555s   2B 
BBc                    dd l }|| j        d<   | j        | j        d<   |                                 | j        d<   | j        j        | j        d<   || j        d<   || j        d<   || j        d<   | j        r| j        | j        d	<   t          | j        d
<   | j        | j        d<   | 	                    | j                   | j
        s|                                 | j        d<   d S d S )Nr   scrapyr!   itemr#   r%   r9   rH   r8   viewshelpr2   )rj   r)   r!   r$   r#   r'   r8   r   
print_helpr"   r(   get_help)r*   rH   r9   r%   rj   s        r   r:   zShell.populate_vars~   s    $	(#|	) OO--	& $ 5	*$	(&	) (	*= 	,!%DIg+	&!_	'###y 	2"&--//DIh	2 	2r   c                 H    t          |                                            d S r   )r;   ro   )r*   s    r   rn   zShell.print_help   s    dmmoor   c                 2   g }|                     d           |                     d           t          | j                                                  D ]6\  }}|                     |          r|                     d|dd|            7|                     d           | j        r*|                     d           |                     d           |                     d	           |                     d
           d                    d |D                       S )NzAvailable Scrapy objects:zJ  scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)z  z<10 zUseful shortcuts:ze  fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)zN  fetch(req)                  Fetch a scrapy.Request and update local objects z0  shelp()           Shell help (print this help)z.  view(response)    View response in a browser
c              3       K   | ]	}d | V  
dS )z[s] Nr   ).0lines     r   	<genexpr>z!Shell.get_help.<locals>.<genexpr>   s(      554555555r   )appendsortedr)   items_is_relevantr'   join)r*   bkvs       r   ro   zShell.get_help   s9   	,---	X	
 	
 	
 49??,,-- 	+ 	+DAq  ## +)a)))a))***	$%%%= 	HHZ   HHC   	
CDDD	ABBByy551555555r   c                 J    t          || j                  pt          |          S r   )rc   relevant_classesr   )r*   values     r   r{   zShell._is_relevant   s     %!677I75>>Ir   )NN)NNNNT)NT)NNN)__name__
__module____qualname__r   r   r
   r   r   r   r+   rM   rX   rQ   r8   r:   rn   ro   r{   r   r   r   r   r      s        (HE   & & & &P	 	 	
 
 
6 6 6 6.2 2 2 2$  6 6 60J J J J Jr   r   c                     t          j        t           j                  }t          |j                                      | |           t          j         t           j        |           dS )z*Open a shell to inspect the given response)rH   r%   N)r5   	getsignalr6   r   r!   rM   )rH   r%   sigint_handlers      r   inspect_responser      sS     %fm44N	&.&AAA
M&-00000r   c                      j          j         fd}t          j                    }|                    |            j         r |                     j          j                   |j         |j        c _          _        |S )a  Wrap a request inside a Deferred.

    This function is harmful, do not use it until you know what you are doing.

    This returns a Deferred whose first pair of callbacks are the request
    callback and errback. The Deferred also triggers when the request
    callback/errback is executed (i.e. when the request is downloaded)

    WARNING: Do not call request.replace() until after the deferred is called.
    c                 $    _         _        | S r   )callbackerrback)resultr9   request_callbackrequest_errbacks    r   _restore_callbacksz-_request_deferred.<locals>._restore_callbacks   s    +)r   )r   r   r   DeferredaddBothaddCallbacks)r9   r   rW   r   r   s   `  @@r   rR   rR      s     'oO      
 	AII !!! :	w'999()
AI%GgoHr   )(__doc__r>   r5   itemadapterr   rb   r   r   twisted.pythonr   	w3lib.urlr   scrapy.crawlerr   scrapy.exceptionsr	   scrapy.httpr
   r   scrapy.settingsr   scrapy.spidersr   scrapy.utils.confr   scrapy.utils.consoler   r   scrapy.utils.datatypesr   scrapy.utils.miscr   scrapy.utils.reactorr   r   scrapy.utils.responser   r   r   rR   r   r   r   <module>r      s   
 
			        + + + + + + + + % % % % % %             " " " " " " + + + + + + ) ) ) ) ) ) ) ) $ $ $ $ $ $ ! ! ! ! ! ! ( ( ( ( ( ( L L L L L L L L 2 2 2 2 2 2 ) ) ) ) ) ) U U U U U U U U 1 1 1 1 1 1QJ QJ QJ QJ QJ QJ QJ QJh1 1 1    r   