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):
geschlossenscrapy 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)
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?
Dank Schaben, Rafael - aktualisiert die Frage. – Esu