2011-04-28 71 views
21

我有一個關於如何在scrapy中執行此操作的問題。我有一隻蜘蛛抓取物品的頁面。 每次找到一個列表頁面時,都會有一個parse_item()回調函數,用於提取項目數據和產生項目。到目前爲止,一切都很好。Scrapy - 解析頁面以提取項目 - 然後關注並存儲項目URL內容

但是,每個項目都有其他數據,一個URL,有關該項目的更多詳細信息。我想跟隨該網址並在另一個項目字段(url_contents)中存儲該項目網址的獲取內容。

我不知道如何組織代碼來實現這一點,因爲兩個鏈接(列表鏈接和一個特定的項目鏈接)跟隨不同的方式,在不同的時間調用回調,但我必須關聯它們在相同的項目處理。

到目前爲止我的代碼看起來是這樣的:

class MySpider(CrawlSpider): 
    name = "example.com" 
    allowed_domains = ["example.com"] 
    start_urls = [ 
     "http://www.example.com/?q=example", 
    ] 

    rules = (
     Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'), 
     Rule(SgmlLinkExtractor(allow=('item\/detail',)), follow = False), 
    ) 


    def parse_item(self, response): 
     main_selector = HtmlXPathSelector(response) 
     xpath = '//h2[@class="title"]' 

     sub_selectors = main_selector.select(xpath) 

     for sel in sub_selectors: 
      item = ExampleItem() 
      l = ExampleLoader(item = item, selector = sel) 
      l.add_xpath('title', 'a[@title]/@title') 
      ...... 
      yield l.load_item() 

回答

19

經過一番測試和思考,我發現這個解決方案適合我。 這個想法是隻使用第一個規則,它給你的物品清單,而且非常重要的是,添加follow = True的規則。

而在parse_item()中,您必須產生請求而不是項目,但在加載項目後。請求是項目詳細信息url。您必須將加載的項目發送到該請求回調。你在迴應中完成你的工作,並且你在那裏得到這個項目。

左右)parse_item(的結束將是這樣的:

itemloaded = l.load_item() 

# fill url contents 
url = sel.select(item_url_xpath).extract()[0] 
request = Request(url, callback = lambda r: self.parse_url_contents(r)) 
request.meta['item'] = itemloaded 

yield request 

然後parse_url_contents()看起來就像這樣:

def parse_url_contents(self, response): 
    item = response.request.meta['item'] 
    item['url_contents'] = response.body 
    yield item 

如果任何人有其他(更好)的方式,讓我們知道。

Stefan

+0

我就是這麼做的。我認爲唯一的另一種選擇是在存儲/輸出階段重新組合數據。 – Acorn 2011-05-02 15:27:30

+0

是的,我們對scrapy組也有確認,所以我選擇了我的答案 – StefanH 2011-05-02 21:36:51

1

我坐在完全相同的問題,從一個事實,即沒有人已經回答了你的問題,2天,我認爲唯一的解決方案是從parse_item函數內手動關注該URL。我是新來的Scrapy,所以我不會試圖用它(雖然我敢肯定它可能),但我的解決方案將使用urllib和BeatifulSoup手動加載第二頁,提取該信息我自己,並將其保存爲項目的一部分。是的,比Scrapy進行正常解析更麻煩,但它應該以最少的麻煩完成工作。

相關問題