[PYTHON] Collectez les informations de latitude / longitude du magasin avec scrapy + splash ②

1. 1. introduction

Suite à la Dernière fois, les informations de latitude et de longitude du magasin seront acquises. Cette fois, nous obtiendrons les informations de magasin des entreprises qui développent la chaîne à partir de Mapion Phonebook. Afin d'avoir de la polyvalence, les éléments suivants peuvent être passés comme arguments lors de l'exécution de scrapy.

・ Genre: ID de genre ・ Catégorie: ID de catégorie ・ Chain_store: ID de l'entreprise de développement de chaîne

Par exemple, dans le cas de Gourmet King, ce sera comme suit. genre = M01 (gourmet), category = 002 (ramen / boulettes), chain_store = CA01 (gourmet king)

2. Environnement d'exécution / construction d'environnement

L'environnement d'exécution et la construction de l'environnement sont les mêmes que Dernière fois.

3.scrapy Les paramètres de item.py et setting.py sont identiques à ceux de Dernière fois à l'exception du nom / élément d'acquisition, ils sont donc omis.

Une liste de magasins est répertoriée sur la première page des chaînes de magasins (Exemple). Cependant, comme les informations de latitude et de longitude ne peuvent pas être obtenues à partir de cette page, les magasins peuvent être trouvés à partir de la destination du lien de chaque magasin (Exemple). Obtenez le nom et la latitude / longitude.

Par conséquent, il est inefficace car il doit être analysé pour chaque magasin, et cela prend beaucoup de temps par rapport à Dernière fois. (10000 caisses pendant environ 12 heures)

De plus, comme le nombre maximum de magasins répertoriés dans le répertoire Mapion est de 10000 (100 magasins / page * 100 pages), Pour les entreprises de plus de 10 000 magasins, tous les magasins ne peuvent pas être couverts.

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']

    #Recevez des informations sur le genre, la catégorie et l'ID de la chaîne de magasins en tant qu'arguments.
    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()
            #Stocker les informations cartographiques(url_path)Extrayez les informations de latitude et de longitude, faites-en un type de liste et transmettez-les à l'élément.
            url_elements = url_path[0].split(',')
            item['latitude'] = [url_elements[0][4:]]
            item['longitude'] = [url_elements[1]]
            yield item

        #Obtenez la destination du lien de chaque détail de magasin à partir de la liste de magasin.
        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)

        #Obtenez la destination du lien du numéro de page suivant en bas de la liste des magasins.
        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. Courir

L'argument est spécifié avec l'option -a. Lors de l'acquisition des informations de magasin de Seven Eleven.

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

Recommended Posts

Collectez les informations de latitude / longitude du magasin avec scrapy + splash ②
Collectez les informations de latitude / longitude du magasin avec scrapy + splash ①
Collectionne les paroles d'Anison avec Scrapy
Coordonnées de latitude et de longitude ↔ Conversion de coordonnées UTM avec python
Obtenez les distances de latitude et de longitude en mètres avec QGIS
Redémarrez avec Scrapy
Obtenez les points de latitude et de longitude à proximité avec la bibliothèque Geoindex de Python
YOLP: extraire la latitude et la longitude avec l'API Yahoo! Geocoder.