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)
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)
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