2017-12-09 15 views
0

私は3ページに続くスパイダーを構築しようとしています。私はシェルの応答をテストしましたが、一緒に動作していないように見えますが、私はなぜそれがわかりません。スパイダーリンクを辿っていない - 治療

以下の私のコード:

# -*- coding: utf-8 -*- 
import scrapy 


class CollegiateSpider(scrapy.Spider): 
    name = 'Collegiate' 
    allowed_domains = ['collegiate-ac.com/uk-student-accommodation'] 
    start_urls = ['http://collegiate-ac.com/uk-student-accommodation/'] 

    # Step 1 - Get the area links 

    def parse(self, response): 
     for city in response.xpath('//*[@id="top"]/div[1]/div/div[1]/div/ul/li/a/text').extract(): 
      yield scrapy.Request(response.urljoin("/" + city), callback = self.parse_area_page) 

    # Step 2 - Get the block links 

    def parse_area_page(self, response): 
     for url in response.xpath('//div[3]/div/div/div/a/@href').extract(): 
      yield scrapy.Request(response.urljoin(url), callback=self.parse_unitpage) 

    # Step 3 Get the room links 

    def parse_unitpage(self, response): 
     for url in response.xpath('//*[@id="subnav"]/div/div[2]/ul/li[5]/a/@href').extract(): 
      yield scrapy.Request(response.urljoin(final), callback=self.parse_final) 

    # Step 4 - Scrape the data 

    def parse_final(self, response): 
     pass 

私はthis answerあたりとしてCrawlspiderに変更しようとしたが、それは助けていないようでした。

私は現在、クモのデバッグ方法を検討していますが、それに苦しんで、ここでも意見を得ることは有益だろうと考えました。

+0

output.csvで、最終的なURLを保存します。多分問題を見つけるのに役立つでしょう。あなたは正しいURLを作成するために 'response.urljoin()'を表示することもできます。 – furas

+0

なぜこの変数を持たないなら 'parse_unitpage'の' response.urljoin(final) 'に' final'を使っていますか?エラーメッセージが表示されませんでしたか? – furas

+0

'parse()の' xpath() 'は結果を返しません。 'div/div/div /'の代わりにクラス名を使うことはできませんか? – furas

答えて

2

あなたは、私がURLを取得するために@hrefを使用'//*[@id="top"]/div[1]/div/div[1]/div/ul/li/a/text()'

しかし、その代わりのtext()text()()を忘れてしまいました。 //uk-student-accommodationをスキップするためurljoin('/' + city)に参加

が間違ったURLを作成します - あなたは、urljoin(city)

を使用する必要がallowed_domainsに問題があった - それは、URLのほとんどを遮断しました。


実例。多分 `関数で実行されていない1を参照するために`プリントを()を使用するプロジェクトなしでそれを実行することができ、それが

import scrapy 


class CollegiateSpider(scrapy.Spider): 

    name = 'Collegiate' 

    allowed_domains = ['collegiate-ac.com'] 

    start_urls = ['https://collegiate-ac.com/uk-student-accommodation/'] 

    # Step 1 - Get the area links 

    def parse(self, response): 
     for url in response.xpath('//*[@id="top"]/div[1]/div/div[1]/div/ul/li/a/@href').extract(): 
      url = response.urljoin(url) 
      #print('>>>', url) 
      yield scrapy.Request(url, callback=self.parse_area_page) 

    # Step 2 - Get the block links 

    def parse_area_page(self, response): 
     for url in response.xpath('//div[3]/div/div/div/a/@href').extract(): 
      url = response.urljoin(url) 
      yield scrapy.Request(response.urljoin(url), callback=self.parse_unitpage) 

    # Step 3 Get the room links 

    def parse_unitpage(self, response): 
     for url in response.xpath('//*[@id="subnav"]/div/div[2]/ul/li[5]/a/@href').extract(): 
      url = response.urljoin(url) 
      yield scrapy.Request(url, callback=self.parse_final) 

    # Step 4 - Scrape the data 

    def parse_final(self, response): 
     # show some information for test 
     print('>>> parse_final:', response.url) 
     # send url as item so it can save it in file 
     yield {'final_url': response.url} 

# --- run it without project --- 

import scrapy.crawler 

c = scrapy.crawler.CrawlerProcess({ 
    "FEED_FORMAT": 'csv', 
    "FEED_URI": 'output.csv' 
}) 
c.crawl(CollegiateSpider) 
c.start() 
+0

@furasありがとう - 私は本当にこれを感謝します。特にプロジェクトなしで実行する方法の最後の例! – Maverick