2016-04-23 11 views
1

Ich habe dieses Scrapy-Programm fast schon runter, abgesehen von diesem letzten Problem. Ich versuche zuScrapy - nur letztes Ergebnis

  1. Iterierte über eine Liste auf jedem von mehreren Einträgen auf einer Seite
  2. für jeden Eintrag ein Stück von Daten auf dieser ersten Liste Seite extrahieren [ ‚RStation‘]
  3. gibt jeweils die Einträge Urls über seinen href
  4. Extrakt einige Daten, indem Sie auf dieser Seite weiter über eine Liste iterieren
  5. erstellen ein einzelnes Element mit Daten aus dem Haupt Seite und folgenden Seite

Das Problem ist, dass, wenn ich mein csv öffne, ich nur Duplikate des letzten Eintrags auf der 2. iterierten Liste (für jeden Eintrag der ersten Liste) sehe.

Füge ich die Elemente inkorrekt an oder trenne falsch auf response.meta? Ich habe versucht, der Dokumentation von response.meta zu folgen und kann nicht verstehen, warum das nicht funktioniert.

Jede Hilfe würde sehr geschätzt werden.

import scrapy 
from scrapy.selector import Selector 
from scrapy.http import HtmlResponse 
from fspeople.items import FspeopleItem 

class FSSpider(scrapy.Spider): 
name = "fspeople" 
allowed_domains = ["fs.fed.us"] 
start_urls = [ 
    "http://www.fs.fed.us/research/people/people_search_results.php?3employeename=&keywords=&station_id=SRS&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=RMRS&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=PSW&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=PNW&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=NRS&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=IITF&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=FPL&state_id=ALL", 
    #"http://www.fs.fed.us/research/people/people_search_results.php?employeename=&keywords=&station_id=WO&state_id=ALL" 
] 
def __init__(self): 
    self.i = 0 

def parse(self,response): 
    for sel in response.xpath("//a[@title='Click to view their profile ...']/@href"): 
     item = FspeopleItem() 
     url = response.urljoin(sel.extract()) 
     item['RStation'] = response.xpath("//table[@id='table_id']/tbody/tr/td[2]/i/b/text() | //table[@id='table_id']/tbody/td[2]/text()").extract_first().strip() 
     request = scrapy.Request(url, callback=self.parse_post) 
     request.meta['item'] = item 
     yield request 
    self.i += 1 

def parse_post(self, response): 
    theitems = [] 
    pubs = response.xpath("//div/h2[text()='Featured Publications & Products']/following-sibling::ul[1]/li | //div/h2[text()='Publications']/following-sibling::ul[1]/li") 
    for i in pubs: 
     item = response.meta['item'] 
     name = response.xpath("//div[@id='maincol']/h1/text() | //nobr/text()").extract_first().strip() 
     pubname = i.xpath("a/text()").extract_first().strip() 
     pubauth = i.xpath("text()").extract_first().strip() 
     pubURL = i.xpath("a/@href").extract_first().strip() 
     #RStation = response.xpath("//div[@id='right-float']/div/div/ul/li/a/text()").extract_first().strip() 

     item['link'] = response.url 
     item['name'] = name 
     item['pubname'] = pubname 
     item['pubauth'] = pubauth 
     item['pubURL'] = pubURL 
     #item['RStation'] = RStation 

     theitems.append(item) 
    return theitems 
+0

Sie sind zwingende '__init__' aber Sie anrufen nicht super für scrapy.Spider –

+0

Sie in der Schleife auf dem gleichen Element iteriert. Versuchen Sie 'item = response.meta.get ('item') –

Antwort

0

Erstellen Sie eine neue Instanz des Elements für jede Iteration.

def parse_post(self, response): 
    [...] 
    for i in pubs: 
     item = response.meta['item'] 
     item = item.copy() 
     [...]