2011-07-06 10 views
8

Scrapy 문서를 여러 번 읽은 후에도 CrawlSpider 규칙을 사용하고 콜백 메소드에 자체 링크 추출 메커니즘을 구현하는 것과는 차이가 있습니다.다음 링크, Scrapy 웹 크롤러 프레임 워크

나는 후자의 접근 방식을 사용하여 새로운 웹 크롤러를 작성하려고하지만 규칙을 사용하여 과거 프로젝트에서 좋지 않은 경험을했기 때문에. 나는 내가하고있는 일과 그 이유를 정확히 알고 싶다.

이 도구에 익숙한 사람이라면 누구입니까?

도움 주셔서 감사합니다.

답변

10

CrawlSpider는 BaseSpider를 상속합니다. 방금 링크를 추출하고 따라 가기위한 규칙이 추가되었습니다. 이러한 규칙은 당신을 위해 유연 충분하지 경우 - 사용 BaseSpider : BaseSpider의 start_urls 당신을 위해 유연 충분하지 않은 경우에도

class USpider(BaseSpider): 
    """my spider. """ 

    start_urls = ['http://www.amazon.com/s/?url=search-alias%3Dapparel&sort=relevance-fs-browse-rank'] 
    allowed_domains = ['amazon.com'] 

    def parse(self, response): 
     '''Parse main category search page and extract subcategory search link.''' 
     self.log('Downloaded category search page.', log.DEBUG) 
     if response.meta['depth'] > 5: 
      self.log('Categories depth limit reached (recursive links?). Stopping further following.', log.WARNING) 

     hxs = HtmlXPathSelector(response) 
     subcategories = hxs.select("//div[@id='refinements']/*[starts-with(.,'Department')]/following-sibling::ul[1]/li/a[span[@class='refinementLink']]/@href").extract() 
     for subcategory in subcategories: 
      subcategorySearchLink = urlparse.urljoin(response.url, subcategorySearchLink) 
      yield Request(subcategorySearchLink, callback = self.parseSubcategory) 

    def parseSubcategory(self, response): 
     '''Parse subcategory search page and extract item links.''' 
     hxs = HtmlXPathSelector(response) 

     for itemLink in hxs.select('//a[@class="title"]/@href').extract(): 
      itemLink = urlparse.urljoin(response.url, itemLink) 
      self.log('Requesting item page: ' + itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

     try: 
      nextPageLink = hxs.select("//a[@id='pagnNextLink']/@href").extract()[0] 
      nextPageLink = urlparse.urljoin(response.url, nextPageLink) 
      self.log('\nGoing to next search page: ' + nextPageLink + '\n', log.DEBUG) 
      yield Request(nextPageLink, callback = self.parseSubcategory) 
     except: 
      self.log('Whole category parsed: ' + categoryPath, log.DEBUG) 

    def parseItem(self, response): 
     '''Parse item page and extract product info.''' 

     hxs = HtmlXPathSelector(response) 
     item = UItem() 

     item['brand'] = self.extractText("//div[@class='buying']/span[1]/a[1]", hxs) 
     item['title'] = self.extractText("//span[@id='btAsinTitle']", hxs) 
     ... 

, start_requests 메소드를 오버라이드 (override).

+0

정말 고마워요! 나는 아마존을 크롤링하고 있다고 언급하지 않았고, 당신은 믿을 수 없을 정도로 유용한 리소스를 주었다. D. Amazon에는 해시 문자가 포함 된 일부 URL이 있으며 Scrapy는 해당 해시 기호에서 끝까지 URL을 제거합니다. 이 동작을 수정하고 전체 URL을 유지할 수있는 방법이 있습니까? T.I.A, 도와 주셔서 감사합니다. – romeroqj

+0

어디에서 스트리핑합니까? request.url, xpath selector 또는? – warvariuc

+0

확인해도 괜찮다면 새 스레드를 만듭니다. http://stackoverflow.com/questions/6604690/scrapy-hash-tag-on-urls – romeroqj

1

페이지 이동 등의 "다음"링크를 가져 오는 것과 같은 선택적 크롤링을 원하면 자체 크롤러를 작성하는 것이 좋습니다. 그러나 일반 크롤링의 경우 crawlspider를 사용하고 규칙 & process_links 함수를 사용하여 수행 할 필요가없는 링크를 필터링해야합니다.

\scrapy\contrib\spiders\crawl.py의 crawlspider 코드를 살펴보면 너무 복잡하지 않습니다.

+0

바로 그 자리에! 실제로 나는 "다음"링크를 따르려는 것을 언급하는 것을 잊었다! 참조 주셔서 감사합니다. – romeroqj