2017-12-09 6 views
0

Ich versuche eine Spinne zu bauen, die durch 3 Seiten folgt, bevor Sie zu der Seite gelangen, die sie kratzt. Ich habe die Antworten in der Shell getestet, aber zusammen scheint es nicht zu funktionieren und ich bin mir nicht sicher warum.Spider nicht folgenden Links - scrapy

Mein Code unten:

# -*- 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 

Ich habe versucht, Crawlspider nach this answer ändern, aber das scheint nicht zu helfen.

Ich bin derzeit in die Suche, wie Spinnen zu debuggen, jedoch, damit zu kämpfen, so dachte, es wäre von Vorteil, Meinungen auch hier zu erhalten.

+0

vielleicht verwenden 'print()' in Funktionen zu sehen, die man nicht ausgeführt wird. Vielleicht hilft es, ein Problem zu finden. Sie können auch 'response.urljoin()' anzeigen, um zu sehen, ob Sie korrekte URLs erstellen. – furas

+0

Warum verwenden Sie 'final' in' response.urljoin (final) 'in' parse_unitpage', wenn Sie diese Variable nicht haben? Hast du keine Fehlermeldung erhalten? – furas

+0

'xpath()' in 'parse()' gibt keine Ergebnisse. Können Sie nicht Klassennamen anstelle von 'div/div/div /' verwenden? – furas

Antwort

2

Sie haben vergessen () in text() in '//*[@id="top"]/div[1]/div/div[1]/div/ul/li/a/text()'

Aber statt text() ich @href URL zu erhalten.

Joining urljoin('/' + city) schafft falsche url weil / Sprünge /uk-student-accommodation - Sie verwenden haben urljoin(city)

Es gab Problem mit allowed_domains - es die meisten Urls blockiert.


Arbeitsbeispiel. Sie können es ohne Projekt laufen und es spart endgültige Urls in output.csv

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

Danke @furas - das schätze ich sehr. Vor allem das letzte Beispiel, wie man es ohne das Projekt laufen lässt! – Maverick