2016-07-25 11 views
0

Ich versuche, die Ergebnisse von here mit scrapy zu kratzen. Das Problem ist, dass nicht alle Klassen auf der Seite angezeigt werden, bis auf die Registerkarte "Weitere Ergebnisse laden" geklickt wird.Wie kann ich zur nächsten Seite in Scrapy springen

enter image description here

Mein Code sieht wie folgt aus:

für diese Website
class ClassCentralSpider(CrawlSpider): 
    name = "class_central" 
    allowed_domains = ["www.class-central.com"] 
    start_urls = (
     'https://www.class-central.com/courses/recentlyAdded', 
    ) 
    rules = (
     Rule(
      LinkExtractor(
       # allow=("index\d00\.html",), 
       restrict_xpaths=('//div[@id="show-more-courses"]',) 
      ), 
      callback='parse', 
      follow=True 
     ), 
    ) 

def parse(self, response): 
    x = response.xpath('//span[@class="course-name-text"]/text()').extract() 
    item = ClasscentralItem() 
    for y in x: 
     item['name'] = y 
     print item['name'] 

    pass 
+0

Nun, wie sieht die URL der zweiten Seite aus? Wenn es wie www.website.com/Recently_Added/2 dann wäre das eine wirklich einfache Lösung. Oder versuchen Sie gerade, die Daten, die im Laden erscheinen, mehr Ergebnisse zu bekommen? – SAMO

+0

es ist nicht funktionieren. Ich weiß nicht, wie man URL Seite 2 bekommt oder [Load the next ..] anruft. – Yato

+0

Wir werden ja das war nur ein Beispiel, ich sagte, wenn sich die URL in einem offensichtlichen Muster ändert, könntest du das ausnutzen. Und okay, also versuchst du nur, die Ergebnisse aus dem Register 'load more results' zu bekommen. – SAMO

Antwort

1

Die zweite Seite scheint über AJAX-Aufruf generiert werden

Das Problem ist hier zu sehen. Wenn Sie in der Registerkarte Netzwerk von jedem Browser Inspektionswerkzeug schauen, sehen Sie, so etwas wie:

firebug network tab

In diesem Fall scheint es eine JSON-Datei von https://www.class-central.com/maestro/courses/recentlyAdded?page=2&_=1469471093134

Nun wurden Abrufen scheint es, dass url Parameter _=1469471093134 tut nichts, so können Sie es einfach wegschneiden zu: https://www.class-central.com/maestro/courses/recentlyAdded?page=2
die Rückkehr json enthält hTML-Code für die nächste Seite:

# so you just need to load it up with 
data = json.loads(response.body) 
# and convert it to scrapy selector - 
sel = Selector(text=data['table']) 

Um dies in Ihrem Code zu replizieren versuchen Sie etwas wie:

from w3lib.url import add_or_replace_parameter 
def parse(self, response): 
    # check if response is json, if so convert to selector 
    if response.meta.get('is_json',False): 
     # convert the json to scrapy.Selector here for parsing 
     sel = Selector(text=json.loads(response.body)['table']) 
    else: 
     sel = Selector(response) 
    # parse page here for items 
    x = sel.xpath('//span[@class="course-name-text"]/text()').extract() 
    item = ClasscentralItem() 
    for y in x: 
     item['name'] = y 
     print(item['name']) 
    # do next page 
    next_page_el = respones.xpath("//div[@id='show-more-courses']") 
    if next_page_el: # there is next page 
     next_page = response.meta.get('page',1) + 1 
     # make next page url 
     url = add_or_replace_parameter(url, 'page', next_page) 
     yield Request(url, self.parse, meta={'page': next_page, 'is_json': True) 
+0

response = json.loads (response.load) Verwenden Sie dies, um Antwort zu antworten ist Json zu Selektor? und yield Request (URL, self.parse, meta = {'Seite': next_page, 'is_json': True}) das letzte '}' am Ende? – Yato

+0

Ich habe 'parse()' Methode in meiner Antwort bearbeitet, um zu tun, was Ihr Parse aber mit Seitenumbruch tut. Ich habe den Code nicht getestet, aber ich denke, Sie können einige Tippfehler beheben, wenn Sie sie selbst finden :) – Granitosaurus

+0

Ein weiterer Fehler, den ich beheben kann. könnte sein. : D. Danke !!! – Yato