2012-01-18 18 views
6

The script (नीचे) this ट्यूटोरियल में दो start_urls शामिल हैं।स्केपर start_urls

from scrapy.spider import Spider 
from scrapy.selector import Selector 

from dirbot.items import Website 

class DmozSpider(Spider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/", 
    ] 

    def parse(self, response): 
     """ 
     The lines below is a spider contract. For more info see: 
     http://doc.scrapy.org/en/latest/topics/contracts.html 
     @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ 
     @scrapes name 
     """ 
     sel = Selector(response) 
     sites = sel.xpath('//ul[@class="directory-url"]/li') 
     items = [] 

     for site in sites: 
      item = Website() 
      item['name'] = site.xpath('a/text()').extract() 
      item['url'] = site.xpath('a/@href').extract() 
      item['description'] = site.xpath('text()').re('-\s[^\n]*\\r') 
      items.append(item) 

     return items 

लेकिन यह केवल इन 2 वेब पृष्ठों को क्यों स्क्रैप करता है? मुझे allowed_domains = ["dmoz.org"] दिखाई देता है लेकिन इन दो पृष्ठों में अन्य पृष्ठों के लिंक भी शामिल हैं जो dmoz.org डोमेन के भीतर हैं! यह उन्हें भी खराब क्यों नहीं करता है?

उत्तर

2

कक्षा में rules संपत्ति नहीं है। http://readthedocs.org/docs/scrapy/en/latest/intro/overview.html पर एक नज़र डालें और एक उदाहरण खोजने के लिए "नियम" खोजें।

+0

http://doc.scrapy.org/en/latest/topics/spiders.html लेकिन नियम क्रॉलस्पाइडर्स के लिए हैं! मैं बेसस्पीडर से उत्तराधिकारी हूं! – DrStrangeLove

+0

बेसस्पीडर केवल प्रारंभ किए गए यूआरएल पर जाता है, इसलिए मुझे लगता है कि मेरा मूल जवाब थोड़ा भ्रामक है। Http://doc.scrapy.org/en/latest/topics/spiders.html#basespider – Glenn

+0

देखें लेकिन यह start_urls के बारे में बताता है: बाद के URL प्रारंभिक URL में मौजूद डेटा से लगातार उत्पन्न होंगे। यह उन (बाद में) यूआरएल क्यों नहीं छीनता है ?? (बेशक, अगर वे यूआरएल dmoz.org डोमेन के भीतर हैं) – DrStrangeLove

2

यदि आप कॉलबैक के अंदर BaseSpider का उपयोग करते हैं, तो आपको अपने वांछित यूआरएल को निकालना होगा और Request ऑब्जेक्ट वापस करना होगा।

यदि आप CrawlSpider का उपयोग करते हैं, तो नियम निष्कर्ष नियमों से जुड़े नियमों और SgmlLinkExtractor की देखभाल करेंगे।

15

start_urls कक्षा विशेषता में यूआरएल शुरू होता है - और कुछ भी नहीं।

class Spider(BaseSpider): 

    name = 'my_spider' 
    start_urls = [ 
       'http://www.domain.com/' 
    ] 
    allowed_domains = ['domain.com'] 

    def parse(self, response): 
     '''Parse main page and extract categories links.''' 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select("//*[@id='tSubmenuContent']/a[position()>1]/@href").extract() 
     for url in urls: 
      url = urlparse.urljoin(response.url, url) 
      self.log('Found category url: %s' % url) 
      yield Request(url, callback = self.parseCategory) 

    def parseCategory(self, response): 
     '''Parse category page and extract links of the items.''' 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select("//*[@id='_list']//td[@class='tListDesc']/a/@href").extract() 
     for link in links: 
      itemLink = urlparse.urljoin(response.url, link) 
      self.log('Found item link: %s' % itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

    def parseItem(self, response): 
     ... 

आप अभी भी शुरू सृजन का अनुरोध करता है अनुकूलित करने के लिए चाहते हैं, ओवरराइड विधि BaseSpider.start_requests()

6

start_urls: के साथ [एक और] कॉलबैक parse कॉलबैक इसी अनुरोध से उपज - आप अन्य पृष्ठों के URL निकाले है, तो आप को स्क्रैप करना चाहते हैं उन लिंक को शामिल करें जिनसे मकड़ी क्रॉलिंग शुरू हो जाती है। यदि आप रिकॉलिव रूप से क्रॉल करना चाहते हैं तो आपको क्रॉलस्पीडर का उपयोग करना चाहिए और इसके लिए नियम परिभाषित करना चाहिए। http://doc.scrapy.org/en/latest/topics/spiders.html उदाहरण के लिए वहां देखें।

1

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

from scrapy.contrib.spiders import BaseSpider, Rule 
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
    from scrapy.selector import HtmlXPathSelector 


    class Spider(BaseSpider): 
     name = 'my_spider' 
     start_urls = ['http://www.domain.com/'] 
     allowed_domains = ['domain.com'] 
     rules = [Rule(SgmlLinkExtractor(allow=[], deny[]), follow=True)] 

    ... 
0

आप यूआरएल क्या आप दो तरह से नियम (crawlspider) reslolve.1.use करने के लिए 2 get.so करना चाहते निपटने के लिए समारोह नहीं लिखा था: लिखना नए यूआरएल को सौदा करने के लिए काम करें। और उन्हें कॉलबैक फ़ंक्शन में रखें।

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