2016-07-13 3 views
1

アムステルダムで販売するためのデータをhttp://www.funda.nl/koop/amsterdam/で収集しようとしています。メインページには、家の限られた数を示しており、一番下に次のようになりますポケベルがあります:Scrapyで、それ自体がスクレイプされたいくつかのstart_urlsをループする方法

enter image description here

(「Volgendeは」オランダ語で「次へ」を意味)が。これから私は合計255ページあると推測します。これらの各ページにはURL http://www.funda.nl/koop/amsterdam/p2/,http://www.funda.nl/koop/amsterdam/p3/などがあります。すべての家のデータを取得するには、すべてのサブページp1、p2、...、p255を 'ループオーバー'したいと思います。

私は「セットアップする」方法を見ています。単に私は、その後に適用するために異なるstart_urls「を合成する」に、この番号を使用したい番号255を返すバックget_max_page_numberを呼び出しle2

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])  # Link to the page of an individual house, such as http://www.funda.nl/koop/amsterdam/huis-49805292-nieuwendammerdijk-21/ 

    le2 = LinkExtractor(allow=r'%s+p\d+' % start_urls[0]) # Link to a page containing thumbnails of several houses, such as http://www.funda.nl/koop/amsterdam/p10/ 

    rules = (
    Rule(le1, callback='parse_item'), 
    Rule(le2, callback='get_max_page_number') 
    ) 

    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 
       yield item 

    def get_max_page_number(self, response): 
     links = self.le2.extract_links(response) 
     max_page_number = 0 
     for link in links: 
      if link.url.count('/') == 6 and link.url.endswith('/'): 
       page_number = int(link.url.split("/")[-2].strip('p')) 
       if page_number > max_page_number: 
        max_page_number = page_number 
     return max_page_number 

LinkExtractor、:今まで私は、次のコードを書いていますLinkExtractor le1は、各ページの個々の住宅へのリンクを取得します。

scrapyはこれらの要求を非同期的に処理するので、最初に番号255を取得してからその番号を使用して他の要求を生成することはできません。そうであれば、2つのスパイダーを順番に使用してスクリプトから呼び出す必要があり、2番目のスパイダーではstart_urlを変数として渡す必要があります。

「これを設定する」方法の指針はありますか?

答えて

0

ここで問題が複雑すぎます。最大ページを知る必要はありません。

あなたが強制的に使用しない限り、linkextractorを使用してすべての可視ページを抽出することができ、治療が十分にスマートになっているページにアクセスすることができます。

ですから、ここで必要なのはLinkExtractorsを持つ2つのルールである:すべてのリンクを抽出し、parse_itemのコールバックと目に見えるすべてのページを抽出し、コールバックまたはfollow=Truesee docs here

+0

こんにちはGranitosaurusを持っていないものを持っている一つ、私はすべてのページ "p1"を "p255"まで削り取ろうとしています。メインページにはリンクがいくつか含まれています: "p1"から "p7"と "p255"。他のリンクは「次へ」をクリックすると表示されます。だから私はどのように私はメインページ上のリンクのみを使用してすべてのページをこすって見ることができないのですか? –

+0

@khpeekあなたのスパイダーが訪れるすべてのページにあなたの 'rules'が適用されます。したがって、あなたのlinkextractorの 'allow'属性が許可する限り、スパイダーはアクセスするすべてのページからリンクを抽出します。 – Granitosaurus

関連する問題