2012-03-13 17 views
21

मैं वेब पृष्ठों को क्रॉल करने के लिए स्केपर का उपयोग करना चाहता हूं। टर्मिनल से शुरू यूआरएल पास करने का कोई तरीका है?क्रॉलिंग के लिए स्क्रैप के लिए यूआरएल कैसे देना है?

यह documentation में दी गई है कि या तो मकड़ी या URL का नाम दिया जा सकता है, लेकिन जब मैं यूआरएल को देखते हुए यह एक त्रुटि फेंकता है:

// मेरी मकड़ी के नाम उदाहरण है, लेकिन मैं मेरे मकड़ी के नाम के बजाय यूआरएल दे रहा हूं (अगर मैं स्पाइडर नाम देता हूं तो यह ठीक काम करता है)।

scrapy crawl example.com

त्रुटि:

File "/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py", line 43, in create raise KeyError("Spider not found: %s" % spider_name) KeyError: 'Spider not found: example.com'

कैसे मैं टर्मिनल में दिए गए यूआरएल पर अपने मकड़ी का उपयोग करने के scrapy कर सकते हैं ??

+0

क्या example.com आपके मकड़ी के स्वीकृत_डोमेन में जोड़ा गया है? –

+0

yes example.com को अनुमति_डोमेन में जोड़ा गया है। मैं वास्तव में क्या चाहता हूं कमांड लाइन से start_url देना है। मैं यह कैसे कर सकता हूं? –

उत्तर

43

मुझे कमांडलाइन विकल्प के बारे में वास्तव में निश्चित नहीं है। हालांकि, आप इस तरह अपने मकड़ी लिख सकते हैं।

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     self.start_urls = [kwargs.get('start_url')] 

और इसे पसंद शुरू: scrapy crawl my_spider -a start_url="http://some_url"

+0

आपको बहुत बहुत धन्यवाद, यह वही है जो मैं ढूंढ रहा था। यह मेरे लिए ठीक काम करता है :) –

+0

यह दृष्टिकोण केवल एक यूआरएल के लिए काम करता है। यदि आप एक से अधिक यूआरएल प्रदान करना चाहते हैं, तो इस धागे में [मेरा दृष्टिकोण] (http://stackoverflow.com/a/12749782/1125413) देखें। – pemistahl

+1

एकाधिक यूआरएल के लिए: 'self.start_urls = kwargs.pop (' start_urls ')। Split (', ')' जो * सुपर * से पहले * चलाया जाता है। –

3

उपयोग scrapy पार्स आदेश। आप अपने मकड़ी के साथ एक यूआरएल पार्स कर सकते हैं। यूआरएल आदेश से पारित किया गया है।

$ scrapy parse http://www.example.com/ --spider=spider-name 

http://doc.scrapy.org/en/latest/topics/commands.html#parse

+0

दुर्भाग्यवश, स्केलर पार्स में परिणाम को फ़ाइल (विभिन्न प्रारूपों में) को सहेजने के विकल्प नहीं दिखते हैं जैसे कि स्क्रैप क्रॉल – dan3

+0

यदि आप केवल डीबग करना चाहते हैं तो आपका स्पाइडर इस पर असफल क्यों हो रहा है, यह एक आसान विकल्प है। – jeffjv

+0

आसानी से फ़ाइल को सहेज/निर्यात नहीं कर सकता। अन्यथा यह सही होगा। – Citricguy

3

यह इस सूत्र में the approach given by Sjaak Trekhaak लिए एक विस्तार है। दृष्टिकोण अब तक केवल तभी काम करता है जब आप बिल्कुल एक यूआरएल प्रदान करते हैं।

: निम्न अपवादों के साथ समाप्त होगा

-a start_url=http://url1.com,http://url2.com 

तो Scrapy (मैं वर्तमान स्थिर संस्करण 0.14.4 उपयोग कर रहा हूँ): उदाहरण के लिए, अगर आप इस तरह एक से अधिक यूआरएल प्रदान करने के लिए, उदाहरण के लिए चाहते हैं, तो

error: running 'scrapy crawl' with more than one spider is no longer supported 

हालांकि, आप प्रत्येक समस्या यूआरएल के लिए एक अलग चर चुनकर इस समस्या को बाधित कर सकते हैं, साथ ही एक उत्तीर्ण यूआरएल की संख्या रखने वाले तर्क के साथ। कुछ इस तरह:

-a start_url1=http://url1.com 
-a start_url2=http://url2.com 
-a urls_num=2 

तब आप अपने मकड़ी में निम्न कर सकते हैं:

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     urls_num = int(kwargs.get('urls_num')) 

     start_urls = [] 
     for i in xrange(1, urls_num): 
      start_urls.append(kwargs.get('start_url{0}'.format(i))) 

     self.start_urls = start_urls 

यह कुछ हद तक एक बदसूरत हैक है, लेकिन यह काम करता है। बेशक, प्रत्येक यूआरएल के लिए सभी कमांड लाइन तर्कों को स्पष्ट रूप से लिखना कठिन होता है। इसलिए, यह पाइथन subprocess में scrapy crawl कमांड को लपेटने और लूप या कुछ में कमांड लाइन तर्क उत्पन्न करने के लिए समझ में आता है।

उम्मीद है कि यह मदद करता है।:)

+0

यदि मैं इस तरह स्केपर 0.24.4 कहता हूं: 'स्केपर क्रॉल MySpider -a start_urls = http: //example.com/ -o - -t json' सबकुछ अच्छी तरह से काम करता है। प्रारंभ में मैंने -o और - के बीच विकल्प डाले और आपको त्रुटि के समान ही प्राप्त किया। –

10

से क्या पीटर का सुझाव दिया, यूआरएल अल्पविराम से अलग के साथ एक स्ट्रिंग के रूप में उन्हें दे रही है इस तरह से है कई यूआरएल-तर्क अनुमति देने के लिए एक और भी आसान तरीका:

-a start_urls="http://example1.com,http://example2.com" 

मकड़ी क्या तुम करोगी में फिर बस पर स्ट्रिंग विभाजित ',' और यूआरएल की एक सरणी मिल:

self.start_urls = kwargs.get('start_urls').split(',') 
3

Sjaak Trekhaak सही विचार है और यहाँ कैसे अनुमति है गुणकों:

class MySpider(scrapy.Spider): 
    """ 
    This spider will try to crawl whatever is passed in `start_urls` which 
    should be a comma-separated string of fully qualified URIs. 

    Example: start_urls=http://localhost,http://example.com 
    """ 
    def __init__(self, name=None, **kwargs): 
     if 'start_urls' in kwargs: 
      self.start_urls = kwargs.pop('start_urls').split(',') 
     super(Spider, self).__init__(name, **kwargs) 
0

आप भी इस कोशिश कर सकते हैं:

>>> scrapy view http://www.sitename.com 

यह अनुरोध किया गया URL के ब्राउज़र में एक विंडो खुलेगा।

संबंधित मुद्दे