2017-03-06 1 views
0

Crawlen und scrappen Was ich versuche zu tun ist, Unternehmensinformationen (thisisavailable.eu.pn/company.html) zu scrapen und alle Boardmitglieder zum Board dict hinzuzufügen mit ihren jeweiligen Daten von separaten Seiten.Wie man einen Datensatz von mehreren verknüpften Seiten mit Scrapy

So idealerweise die Daten, die ich von Musterseite bekommen wären:

{ 
    "company": "Mycompany Ltd", 
    "code": "3241234", 
    "phone": "2323232", 
    "email": "[email protected]", 
    "board": { 
     "1": { 
      "name": "Margaret Sawfish", 
      "code": "9999999999" 
     }, 
     "2": { 
      "name": "Ralph Pike", 
      "code": "222222222" 
     } 
    } 
} 

Ich habe gesucht Google und SO (wie here und here und Scrapy docs usw.), aber nicht in der Lage, eine Lösung zu finden Problem genau so.

Was ich in der Lage gewesen zusammenschustern:

items.py:

import scrapy 
class company_item(scrapy.Item): 
    name = scrapy.Field() 
    code = scrapy.Field() 
    board = scrapy.Field() 
    phone = scrapy.Field() 
    email = scrapy.Field() 
    pass 

class person_item(scrapy.Item): 
    name = scrapy.Field() 
    code = scrapy.Field()  
    pass 

Spinnen/example.py:

import scrapy 
from try.items import company_item,person_item 

class ExampleSpider(scrapy.Spider): 
    name = "example" 
    #allowed_domains = ["http://thisisavailable.eu.pn"] 
    start_urls = ['http://thisisavailable.eu.pn/company.html'] 

    def parse(self, response): 
     if response.xpath("//table[@id='company']"): 
      yield self.parse_company(response) 
      pass 
     elif response.xpath("//table[@id='person']"): 
      yield self.parse_person(response) 
      pass   
     pass 

    def parse_company(self, response): 
     Company = company_item() 
     Company['name'] = response.xpath("//table[@id='company']/tbody/tr[1]/td[2]/text()").extract_first() 
     Company['code'] = response.xpath("//table[@id='company']/tbody/tr[2]/td[2]/text()").extract_first() 
     board = [] 

     for person_row in response.xpath("//table[@id='board']/tbody/tr/td[1]"): 
      Person = person_item() 
      Person['name'] = person_row.xpath("a/text()").extract() 
      print (person_row.xpath("a/@href").extract_first()) 
      request = scrapy.Request('http://thisisavailable.eu.pn/'+person_row.xpath("a/@href").extract_first(), callback=self.parse_person) 
      request.meta['Person'] = Person 
      return request   
      board.append(Person) 

     Company['board'] = board 
     return Company  

    def parse_person(self, response):  
     print('PERSON!!!!!!!!!!!') 
     print (response.meta) 
     Person = response.meta['Person'] 
     Person['name'] = response.xpath("//table[@id='person']/tbody/tr[1]/td[2]/text()").extract_first() 
     Person['code'] = response.xpath("//table[@id='person']/tbody/tr[2]/td[2]/text()").extract_first() 
     yield Person 

UPDATE: Als Rafael bemerkt, anfängliches Problem war mit allowed_domains falsch - ich habe es vorerst auskommentiert und jetzt, wenn ich es ausführe, bekomme ich (added * 's zu URLs aufgrund niedriger Rep):

scrapy Crawl Beispiel 2017.03.07 09.41.12 [scrapy.utils.log] INFO: Scrapy 1.3.2 gestartet (bot: proov) 2017.03.07 09.41.12 [scrapy.utils.log] INFO: Überschriebene Einstellungen: {'NEWSPIDER_MODULE': 'proov.spiders', 'SPIDER_MODULES': ['proov.spiders'], 'ROBOTSTXT_OBEY': Richtig, 'BOT_NAME': 'proov' } 2017-03-07 09:41:12 [scrapy.middleware] INFO: Aktivierte Erweiterungen: ['scrapy.extensions.logstats.LogStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions .corestats.CoreStats '] 2017-03-07 09:41:13 [scrapy.middleware] INFO: Aktivierter Downloader m iddlewares: [ 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', ‚scrapy .downloadermiddlewares.useragent.UserAgentMiddleware ' 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', ' scrapy.downloadermiddlewares.redirect.RedirectMiddleware ', ' scrapy.downloadermiddlewares.cookies.CookiesMiddleware ', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2017.03.07 09.41.13 [scrapy.middleware] INFO: Aktivierte spider Middle: [ 'scrapy.spidermiddlewares .httperror.HttpErrorMiddleware‘, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2017-03-07 09:41:13 [scrapy.middleware] INFO: Aktivierte Artikel-Pipelines: [] 2017-03-07 09:41:13 [scrapy.core.engine] INFO: Spinne eröffnet 2017-03- 07 09:41:13 [scrap.extensions.logstats] INFO: Crawled 0 Seiten (bei 0 Seiten/Minute), Scraped 0 Elemente (bei 0 Elemente/Minute) 2017-03-07 09:41:13 [scrapy.extensions.telnet] DEBUG: Telnet-Konsole zuhören 127.0.0.1:6023 2017-03-07 09:41:14 [scrapy.core.engine] DEBUG: Crawled (404) http: //*thisisavaila.eu.pn/robots.txt> (Referer: Keine) 2017-03-07 09:41:14 [scrapy.core.engine] DEBUG: Gekratzt (200) http: //*thisisavaila.eu.pn/scrapy/company.html> (Referer: Keine) person.html person2 .html 2017-03-07 09:41:15 [scrapy.core.engine] DEBUG: Gekratzt (200) http://thisisavaila.eu.pn/person2.html> (Referer: http: // * thisisavailable .eu.pn/company.html) PERSON !!!!!!!!!!! 2017-03-07 09:41:15 [scrapy.core.scraper] DEBUG: Geschabt von http: //*thisisavaila.eu.pn/person2.html> {'code': u'222222222 ', 'Name': u'Kaspar K \ xe4nnuotsa '} 2017-03-07 09:41:15 [scrapy.core.engine] INFO: Abschlussspinne (fertig) 2017-03-07 09:41:15 [ scrapy.statscollectors] INFO: Versenkung Scrapy Statistik: { 'Downloader/request_bytes': 936, 'Downloader/request_count': 3, 'Downloader/request_method_count/GET': 3, 'Downloader/response_bytes': 1476, ‚Downloader/response_count ': 3, ' downloader/response_status_count/200 ': 2, ' downloader/response_status_count/404 ': 1,' finish_reason ': ' fertig ',' end_tim e ': datetime.datetime (2017, 3, 7, 7, 41, 15, 571000),' item_scraped_count ': 1,' log_count/DEBUG ': 5, ' log_count/INFO ': 7,' request_depth_max ': 1, 'response_received_count': 3, 'scheduler/dequeued': 2, 'scheduler/dequeued/speicher': 2, 'scheduler/enqueued': 2, 'scheduler/eingereiht/speicher': 2, 'start_time' : datetime.datetime (2017, 3, 7, 7, 41, 13, 404000)} 2017.03.07 09.41.15 [scrapy.core.engine] INFO: Spider (fertig)

geschlossen

und wenn mit "-o file.json" ausgeführt wird, ist der Inhalt der Datei:

[{ "Code": "222222222", "name": "Ralph Pike"}]


So ein bisschen weiter, aber ich bin immer noch bei Verlust, wie es funktioniert .

Kann jemand mir helfen, diese Arbeit zu machen?

Antwort

1

Ihr Problem bezieht sich nicht auf mehrere Objekte, obwohl es in der Zukunft sein wird.

Sie Problem wird in der Ausgabe erklärt

[scrapy.spidermiddlewares.offsite] DEBUG: Gefiltert Offsite Anfrage 'kidplay-wingsuit.c9users.io': http://thisisavailable.eu.pn/scrapy/person2.html> 2017.03.06 10.44 : 33

Es bedeutet, dass zu einer Domäne außerhalb Ihrer Liste allowed_domains geht.

Ihre zulässigen Domänen sind falsch.Es sollte

allowed_domains = ["thisisavailable.eu.pn"] 

Hinweis:

Statt ein anderes Element für Person nur verwenden Sie es als ein Feld in Company mit und dict oder list zuweisen, während

+0

Dank Schaben, Rafael - aktualisiert die Frage. – Esu

Verwandte Themen