2013-07-07 2 views
2

내 머리를 여러 번 부딪 히고 마침내 여기에와 있습니다.Scrapy 콘텐츠의 재귀적인 다운로드

문제점 : 각 크레이그리스트 게시 내용을 다운로드하려고합니다. 콘텐츠 란 휴대 전화의 설명과 같이 '게시 본문'을 의미합니다. iPhone이 모든 흥분으로 끝난 후 새로운 오래된 전화를 찾고 있습니다.

코드는 에 의해 멋진 작품입니다. Michael Herman.

내 스파이더 클래스

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import * 
from craig.items import CraiglistSampleItem 

class MySpider(CrawlSpider): 
    name = "craigs" 
    allowed_domains = ["craigslist.org"] 
    start_urls = ["http://minneapolis.craigslist.org/moa/"] 

    rules = (Rule (SgmlLinkExtractor(allow=("index\d00\.html",),restrict_xpaths=('//p[@class="nextpage"]',)) 
    , callback="parse_items", follow= True), 
    ) 

    def parse_items(self,response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.select("//span[@class='pl']") 
     items = [] 
     for titles in titles: 
      item = CraiglistSampleItem() 
      item ["title"] = titles.select("a/text()").extract() 
      item ["link"] = titles.select("a/@href").extract() 
      items.append(item) 
     return items 

그리고 항목 클래스

from scrapy.item import Item, Field 

class CraiglistSampleItem(Item): 
    title = Field() 
    link = Field() 

코드가 많은 링크를 통과 것이기 때문에는, 그러므로 나는 sepearte의 CSV하지만 한 번 더 각 휴대폰의 설명을 저장하고 싶었 csv의 열 또한 괜찮을 것입니다.

모든 리드 !!!

답변

5
대신 당신이 반환해야 parse_items 방법/수율 scrapy 항목 페이지 linktitle 당신이 Item의 내부에 전달할 수 있습니다에서 설명을 얻기 위하여 Request 인스턴스의 반환 항목의

하고 meta 사전의 내부 Item :

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.http import Request 
from scrapy.selector import * 

from scrapy.item import Item, Field 


class CraiglistSampleItem(Item): 
    title = Field() 
    link = Field() 
    description = Field() 


class MySpider(CrawlSpider): 
    name = "craigs" 
    allowed_domains = ["craigslist.org"] 
    start_urls = ["http://minneapolis.craigslist.org/moa/"] 

    rules = (Rule(SgmlLinkExtractor(allow=("index\d00\.html",), restrict_xpaths=('//p[@class="nextpage"]',)) 
     , callback="parse_items", follow=True), 
    ) 

    def parse_items(self, response): 
     hxs = HtmlXPathSelector(response) 

     titles = hxs.select("//span[@class='pl']") 
     for title in titles: 
      item = CraiglistSampleItem() 
      item["title"] = title.select("a/text()").extract()[0] 
      item["link"] = title.select("a/@href").extract()[0] 

      url = "http://minneapolis.craigslist.org%s" % item["link"] 
      yield Request(url=url, meta={'item': item}, callback=self.parse_item_page) 

    def parse_item_page(self, response): 
     hxs = HtmlXPathSelector(response) 

     item = response.meta['item'] 
     item['description'] = hxs.select('//section[@id="postingbody"]/text()').extract() 
     return item 

출력 csv 파일에서 실행하여 열을 추가로 확인하십시오.

희망이 있습니다.

+0

코드에 대한 많은 감사를드립니다. 나는 거의 치료에 대한 자신감을 잃었고 lxml과 bs4의 경로로갔습니다. 새로운 사용자의 경우 ... item.py 파일은 별도이고 "cralwer"파일은 별도입니다. 또한 "craig_help.items import CraiglistSampleItem"을 cralwer에 추가 할 수 있습니다. 여기서 craig_help는 전체 프로젝트가 생성 된 폴더입니다. – LonelySoul

+0

문제가 생겨서 죄송합니다. 그러나 "설명"열은 모두 비어있는 것 같습니다. 내가 항목과 크롤러에 대해 다른 파일을 만들어서 뭔가 잘못 했어. – LonelySoul

+0

당신은 오신 것을 환영합니다. 물론, Item 클래스를 적절한 위치에 넣을 수 있습니다. 거기에 3 개의 필드가 있는지 확인하십시오 :'title','link' 및'description'. – alecxe