Wir erfassen Informationen wie den Namen des Geschäfts, den Breiten- und Längengrad sowie den Bereitstellungsservice von KFC-Geschäftsinformationen. Da die Geschäftsinformationen durch Javascript generiert werden, wird dazwischen ein Splash abgefangen.
Liste der Vorsichtsmaßnahmen für das Web-Scraping
AWS EC2: Amazon Linux (2016.09-release) ,t2.micro Python 2.7.12
python2.7
sudo yum groupinstall "Development tools"
sudo yum install python-devel libffi-devel openssl-devel libxml2-devel libxslt-devel
sudo pip install scrapy
sudo pip install service_identity #Amazon Linux ist standardmäßig installiert, daher ist dies nicht erforderlich
sudo yum -y install docker-io
sudo service docker start
sudo chkconfig docker on
sudo pip install scrapy-splash
docker pull scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash
Splash wird von Docker abgedeckt. Einfach.
(Referenzseite) [Hinweis zum Starten des Python-Crawlers "Scrapy"](http://sechiro.hatenablog.com/entry/2016/04/02/Python%E8%A3%BD%E3%82%AF%E3%83%AD % E3% 83% BC% E3% 83% A9% E3% 83% BC% E3% 80% 8CScrapy% E3% 80% 8D% E3% 81% AE% E5% A7% 8B% E3% 82% 81% E6 % 96% B9% E3% 83% A1% E3% 83% A2) Einfaches Scraping der JavaScript-Seite mit Scrapy-Splash github (scrapy-splash)
Erstellen Sie eine Vorlage für Projekt und Spinne.
python2.7
export PRJ_NAME=KFCShopSpider
scrapy startproject ${PRJ_NAME}
cd ./${PRJ_NAME}/${PRJ_NAME}/spider
scrapy genspider ${PRJ_NAME} kfc.co.jp
Definieren Sie den Artikel, den Sie erhalten möchten. Dieses Mal erhalten wir den Namen des Geschäfts, die Adresse, map_url (Breite und Länge) sowie das Vorhandensein oder Fehlen verschiedener Dienste.
~/KFCShopSpider/KFCShopSpider/items.py
# -*- coding: utf-8 -*-
import scrapy
class KFCShopspiderItem(scrapy.Item):
name = scrapy.Field()
address = scrapy.Field()
map_url = scrapy.Field()
DriveThrough = scrapy.Field()
Parking = scrapy.Field()
Delivery = scrapy.Field()
Wlan = scrapy.Field()
pass
Belasten Sie die andere Partei nicht. Erforderlich für USER_AGENT, ROBOTSTXT_OBEY und DOWNLOAD_DELAY.
~/KFCShopSpider/KFCShopSpider/settings.py
# -*- coding: utf-8 -*-
BOT_NAME = 'KFCShopSpider'
SPIDER_MODULES = ['KFCShopSpider.spiders']
NEWSPIDER_MODULE = 'KFCShopSpider.spiders'
USER_AGENT = 'KFCShopSpider (+http://www.yourdomain.com)'
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 3
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPLASH_URL = 'http://localhost:8050/'
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
~/KFCShopSpider/KFCShopSpider/spider/KFCShop_spider.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import CrawlSpider
from scrapy_splash import SplashRequest
from ..items import KFCShopspiderItem
class KFCShopSpider(CrawlSpider):
name = "KFCShopSpider"
allowed_domains = ["kfc.co.jp"]
start_urls = []
shop_url_home ='http://www.kfc.co.jp/search/fuken.html?t=attr_con&kencode='
#Beginnen Sie auf der Suchergebnisseite von 47 Präfekturen.
for i in range(1,48):
prfct_id = '{0:02d}'.format(i)
url = shop_url_home + prfct_id
start_urls.append(url)
#Ruft die gerenderte Antwort ab.
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse,
args={'wait': 0.5},
)
def parse(self, response):
#Informationen zu jedem Geschäft(=Listenelement)Konkretisieren.
stores = response.xpath('//ul[@id="outShop"]/li')
for store in stores:
item = KFCShopspiderItem()
#Beschreiben Sie mit einem relativen Pfad.
item['address'] = store.xpath('./span[@class="scAddress"]/text()[1]').extract()
item['map_url'] = store.xpath('./ul/li[2]/div/a/@href').extract()
item['DriveThrough']= store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check04")]/@alt').extract()
item['Parking'] = store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check05")]/@alt').extract()
item['Delivery'] = store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check02")]/@alt').extract()
item['Wlan'] = store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check03")]/@alt').extract()
yield item
#Von jedem Suchergebnis'Nächster'Holen Sie sich das Link-Ziel von und rufen Sie die paese-Methode auf.
next_page= response.xpath('//li[@class="next"]/a/@href')
if next_page:
# 'Nächster'Es gibt zwei oben und unten in der Geschäftsliste, also holen Sie sich nur das erste Element
url = response.urljoin(next_page[0].extract())
yield SplashRequest(url, self.parse)
Das Chrome Developer Tool (F12-Taste) ist nützlich, um den xpath zu überprüfen. Sie können das zu überprüfende Element in der Elementansicht abrufen, indem Sie mit der rechten Maustaste auf> Kopieren> XPath kopieren klicken.
python2.7
scrapy shell "http://localhost:8050/render.html?url={Die URL, die Sie rendern möchten}"
In ca. 10 Minuten konnten wir Informationen zu über 1.000 Filialen erhalten.
python2.7
scrapy crawl ${PRJ_NAME} -o hoge.csv
Recommended Posts