[PYTHON] Sammeln Sie Informationen zu Längen- und Breitengraden des Speichers mit Scrapy + Splash ②

1. 1. Einführung

Nach dem letzten Mal werden die Breiten- und Längengradinformationen des Geschäfts erfasst. Dieses Mal erhalten wir die Geschäftsinformationen der Unternehmen, die die Kette entwickeln, von Mapion Phonebook. Um vielseitig zu sein, können die folgenden Elemente beim Ausführen von Scrapy als Argumente übergeben werden.

・ Genre: Genre-ID ・ Kategorie: Kategorie-ID ・ Chain_store: ID der Kettenentwicklungsfirma

Im Fall von Gourmet King ist dies beispielsweise wie folgt. Genre = M01 (Gourmet), Kategorie = 002 (Ramen / Knödel), chain_store = CA01 (Gourmetkönig)

2. Ausführungsumgebung / Umgebungskonstruktion

Die Ausführungsumgebung und die Umgebungskonstruktion sind dieselben wie bei Letztes Mal.

3.scrapy Die Einstellungen von item.py und settings.py sind mit Ausnahme des Namens / Erfassungselements identisch mit Letztes Mal, sodass sie weggelassen werden.

Eine Liste der Geschäfte finden Sie auf der obersten Seite der Filialisten (Beispiel). Da auf dieser Seite jedoch keine Informationen zu Breiten- und Längengraden abgerufen werden können, finden Sie die Geschäfte am Linkziel jedes Geschäfts (Beispiel). Holen Sie sich den Namen und Breite / Länge.

Daher ist es ineffizient, da es für jedes Geschäft gecrawlt werden muss und im Vergleich zu Letztes Mal viel Zeit in Anspruch nimmt. (10.000 Fälle für ca. 12 Stunden)

Da die maximale Anzahl der im Mapion-Telefonbuch aufgeführten Geschäfte 10.000 beträgt (100 Geschäfte / Seite * 100 Seiten), Bei Unternehmen mit mehr als 10.000 Filialen können nicht alle Filialen abgedeckt werden.

MapionSpider.py


# -*- coding: utf-8 -*-

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_splash import SplashRequest
from ..items import MapionspiderItem

class MapionSpider(CrawlSpider):
    name = 'Mapion_spider'
    allowed_domains = ['mapion.co.jp']

    #Erhalten Sie Genre-, Kategorie- und Filialspeicher-ID-Informationen als Argumente.
    def __init__(self, genre=None, category=None, chain_store=None, *args, **kwargs):
        super(MapionSpider, self).__init__(*args, **kwargs)
        self.start_urls = ['http://www.mapion.co.jp/phonebook/{0}{1}{2}/'.format(genre,category,chain_store)]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse_item, args={'wait': 0.5}, )

    def parse_item(self, response):
        item = MapionspiderItem()
        shop_info = response.xpath('//*[@id="content"]/section/table/tbody')
        if shop_info:
            item['name'] = shop_info.xpath('tr[1]/td/text()').extract()
            url_path = shop_info.xpath('//a[@id="spotLargMap"]/@href').extract()
            #Karteninformationen speichern(url_path)Extrahieren Sie die Längen- und Breitengradinformationen aus, machen Sie sie zu einem Listentyp und übergeben Sie sie an das Element.
            url_elements = url_path[0].split(',')
            item['latitude'] = [url_elements[0][4:]]
            item['longitude'] = [url_elements[1]]
            yield item

        #Rufen Sie das Linkziel der einzelnen Geschäftsdetails aus der Geschäftsliste ab.
        list_size = len(response.xpath('//table[@class="list-table"]/tbody/tr').extract())
        for i in range(2,list_size+1):
            target_url_path = '//table[@class="list-table"]/tbody/tr['+str(i)+']/th/a/@href'
            target = response.xpath(target_url_path)
            if target:
                target_url = response.urljoin(target[0].extract())
                yield SplashRequest(target_url, self.parse_item)

        #Holen Sie sich das Linkziel der nächsten Seitenzahl am Ende der Geschäftsliste.
        next_path = response.xpath('//p[@class="pagination"]/*[contains(@class, "pagination-currnet ")]/following::a[1]/@href')
        if next_path:
            next_url = response.urljoin(next_path[0].extract())
            yield SplashRequest(next_url, self.parse_item)

4. Lauf

Das Argument wird mit der Option -a angegeben. Beim Erwerb der Geschäftsinformationen von Seven Eleven.

scrapy crawl MapionSpider -o hoge.csv -a genre='M02' -a category='005' -a chain_store='CM01'

Recommended Posts

Sammeln Sie Informationen zu Längen- und Breitengraden des Speichers mit Scrapy + Splash ②
Sammeln Sie Informationen zu Breiten- und Längengraden des Speichers mit Scrapy + Splash ①
Sammle Anison-Texte mit Scrapy
Längen- und Breitengradkoordinaten ↔ UTM-Koordinatenkonvertierung mit Python
Erhalten Sie mit QGIS Längen- und Breitengrade in Metern
Starten Sie mit Scrapy neu
Holen Sie sich mit der Geoindex-Bibliothek von Python nahegelegene Längen- und Breitengrade
YOLP: Extrahieren Sie Längen- und Breitengrade mit der Yahoo! Geocoder-API.