Ich habe dieses Scrapy-Programm fast schon runter, abgesehen von diesem letzten Problem. Ich versuche zuScrapy - nur letztes Ergebnis
- Iterierte über eine Liste auf jedem von mehreren Einträgen auf einer Seite
- für jeden Eintrag ein Stück von Daten auf dieser ersten Liste Seite extrahieren [ ‚RStation‘]
- gibt jeweils die Einträge Urls über seinen href
- Extrakt einige Daten, indem Sie auf dieser Seite weiter über eine Liste iterieren
- 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
Sie sind zwingende '__init__' aber Sie anrufen nicht super für scrapy.Spider –
Sie in der Schleife auf dem gleichen Element iteriert. Versuchen Sie 'item = response.meta.get ('item') –