2016-07-13 16 views
0

アムステルダムで販売する住宅の一覧を表示しているhttp://www.funda.nl/koop/amsterdam/のウェブサイトをクロールしようとしています。サブページのデータは個々の家屋のhttp://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/などです。最初のステップとして、まずこれらのすべてのサブページのリストを取得したいと思います。これまでのところ、私は次のクモを持っている:ScrapyのLinkExtractorでサブページのみを抽出します

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

class FundaSpider(CrawlSpider): 
    name = "Funda" 
    allowed_domains = ["funda.nl"] 
    start_urls = ["http://www.funda.nl/koop/amsterdam/"] 

    le1 = LinkExtractor(allow=r'%s+huis-\d{8}' % start_urls[0], allow_domains='funda.nl') 
    rules = (
    Rule(le1, callback='parse_item'), 
    ) 

    def parse_item(self, response): 
     links = self.le1.extract_links(response) 
     for link in links: 
      item = FundaItem() 
      item['url'] = link.url 
      print("The item is "+str(item)) 
      yield item 

私はscrapy crawl Funda -o funda.jsonとして、この生成JSON出力を実行すると、その結果のfunda.jsonは(唯一の最初の数行)次のようになります。

[ 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/ywavcsbywacbcasxcxq.html"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/print/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/reageer/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/bezichtiging/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/brochure/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/doorsturen/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/meld-een-fout/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/ywavcsbywacbcasxcxq.html"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/print/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/reageer/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/bezichtiging/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/brochure/download/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/doorsturen/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/meld-een-fout/"}, 

ほか希望のサブページhttp://www.funda.nl/koop/amsterdam/huis-49801360-brede-vogelstraat-2/http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/には、私が選択したくない多くの「サブサブページ」もあります。どうすればサブページのみを選択できますか?

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

class FundaSpider(CrawlSpider): 
    name = "Funda" 
    allowed_domains = ["funda.nl"] 
    start_urls = ["http://www.funda.nl/koop/amsterdam/"] 

    le1 = LinkExtractor(allow=r'%s+huis-\d{8}' % start_urls[0]) 
    rules = (
    Rule(le1, callback='parse_item'), 
    ) 

    def house_link(link): 
     url = link.url 
     return url.count('/') == 6 and url.endswith('/') 

    def parse_item(self, response): 
     links = self.le1.extract_links(response) 
     for link in links: 
      if link.url.count('/') == 6 and link.url.endswith('/'): 
       item = FundaItem() 
       item['url'] = link.url 
       print("The item is "+str(item)) 
       yield item 

今すぐscrapy crawl Funda -o funda.jsonによって生成されたJSONファイルがあります。

答えて

0

は、今の私はurlは、スラッシュ(6)の所望の数を持っていることを確認し、スラッシュで終わるif文を追加しました目的のURLの制限数:

[ 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49879212-henri-berssenbruggehof-15/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49713458-jan-vrijmanstraat-29/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49728947-emmy-andriessestraat-374/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49818887-markiespad-19/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801593-jf-berghoefplantsoen-2/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49890140-talbotstraat-9/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49805292-nieuwendammerdijk-21/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801910-claus-van-amsbergstraat-86/"} 
][ 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49713458-jan-vrijmanstraat-29/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49701161-johannes-vermeerstraat-16/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49879212-henri-berssenbruggehof-15/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49728947-emmy-andriessestraat-374/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801593-jf-berghoefplantsoen-2/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49800159-breezandpad-8/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49805292-nieuwendammerdijk-21/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49890140-talbotstraat-9/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49801910-claus-van-amsbergstraat-86/"}, 
{"url": "http://www.funda.nl/koop/amsterdam/huis-49818887-markiespad-19/"} 
] 

もっと洗練されたソリューションを歓迎します。 URLからのリンクの深さを判断することは、すでにメソッド/モジュールがあるという共通の課題です。

関連する問題