2016-07-13 51 views
0

我試圖從使用Scrapy的頁面中提取所有鏈接,但我努力使用LinkExtractor。我已經試過如下:使用Scrapy的LinkExtractor

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from Funda.items import FundaItem 

class FundaSpider(scrapy.Spider): 
    name = "Funda" 
    allowed_domains = ["funda.nl"] 
    start_urls = [ 
     "http://www.funda.nl/koop/amsterdam/" 
    ] 
    rules = (
    Rule(LinkExtractor(), callback='parse_item') 
    ) 

    def parse_item(self, response): 
     filename = response.url.split("/")[-2] + '.html' 
     with open(filename, 'wb') as f: 
      f.write(response.body) 

我的理解是,包括LinkExtractor()Rule應使response只包含鏈接。但是,如果我查看生成的amsterdam.html文件,它似乎仍包含整個網頁,而不僅僅是鏈接。

我怎樣才能得到response只包含鏈接?

+0

_如何得到響應只包含鏈接?_我不明白你的問題。一些事情:[鏈接提取器](http://doc.scrapy.org/en/latest/topics/link-extractors.html)用於從響應中提取鏈接。 LinkExtractor()。extract_links(response)'返回'''鏈接'對象(帶有'.url'屬性)。 'Rule'對象中的鏈接提取器用於'CrawlSpider'子類,以便蜘蛛遵循鏈接,但是您在回調中獲得的是「response」中的頁面,而不是URL。 –

+0

謝謝Paul,我會試着解釋一下:'start_urls'中的主頁面包含了各個房屋出售頁面的鏈接。最終,我想打開個別房屋的頁面並從中提取數據。文檔中提到'extract_links'返回'scrapy.link.Link'對象列表。正如我從https://github.com/scrapy/scrapy/blob/master/scrapy/link.py#L8瞭解到的那樣,'Link'類具有'url','text','fragment'和'nofollow'屬性,但我怎樣才能從每個鏈接獲得完整的「響應」? –

+0

你必須用URL生成'Request'對象。 Scrapy只理解'請求'。 '鏈接'對象本身只是URL信息的持有者(沒有回調,沒有標題等)。所以在某些時候你需要'返回scrapy.Request(link.url,callback = ......)'。 –

回答

1

你爲什麼會認爲它只包含鏈接?

我想你是誤解了CrawlSpiderrule的說法。在rule之內,您實際上指定了抓取邏輯而不是解析邏輯。在指定callback的函數中正在處理解析。

所以,如果你想要只保存響應的鏈接,你必須首先從響應中提取它們。你甚至可以使用相同的LinkExtractor

class Spider(scrapy.Spider): 
    name = 'spider1' 
    le1 = LinkExtractor() 
    rules = (
     Rule(le1, callback='parse_item') 
    ) 

    def parse_item(self, response): 
     # this will give you Link objects 
     links = self.le1.extract_links(response) 
     # this will give you html nodes of <a> 
     links = response.xpath("//a").extract() 
+0

感謝Granitosaurus。作爲後續問題,我還想'檢查'鏈接中的輸出。我嘗試過'鏈接鏈接:','item = FundaItem()','item ['title'] = link.extract()','yield item',然後嘗試運行scrapy輸出爲scrapy抓取Funda -o funda.csv'。但是,生成的.csv文件是空的。我如何使用第一種方法生成的'links'? –

+0

@khpeek你的蜘蛛是否會返回任何物品?日誌在抓取結束時保持什麼狀態?即「'item_scraped_count':1」? – Granitosaurus