###前提・実現したいこと
Pythonクローリング&スクレイピング ―データ収集・解析のための実践開発ガイド―
http://gihyo.jp/book/2017/978-4-7741-8367-1/support
上記のサンプルコードをダウンロードし、6-7のtabelogというプログラムを実行しましたが、エラーが発生しました。
###前提・実現したいこと
食べログに掲載されている情報をcsvのリストにしたい。
###発生している問題・エラーメッセージ
(scraping3.4) NozomuI-no-MacBook:6-7 nozomui$ scrapy crawl tabelog -o a.csv 2017-08-17 15:08:56 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: myproject) 2017-08-17 15:08:56 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': 'myproject', 'SPIDER_MODULES': ['myproject.spiders'], 'DOWNLOAD_DELAY': 1, 'FEED_FORMAT': 'csv', 'FEED_URI': 'a.csv', 'ROBOTSTXT_OBEY': True, 'NEWSPIDER_MODULE': 'myproject.spiders'} 2017-08-17 15:08:56 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.feedexport.FeedExporter', 'scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions.logstats.LogStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.corestats.CoreStats'] 2017-08-17 15:08:56 [scrapy.middleware] INFO: Enabled downloader middlewares: ['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-08-17 15:08:56 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2017-08-17 15:08:56 [scrapy.middleware] INFO: Enabled item pipelines: [] 2017-08-17 15:08:56 [scrapy.core.engine] INFO: Spider opened 2017-08-17 15:08:56 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-08-17 15:08:56 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6026 2017-08-17 15:08:57 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://tabelog.com/robots.txt> (referer: None) 2017-08-17 15:08:58 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://tabelog.com/tokyo/rstLst/lunch/?LstCosT=2&RdoCosTp=1> (referer: None) 2017-08-17 15:09:00 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://tabelog.com/tokyo/rstLst/lunch/2/?LstCosT=2&RdoCosTp=1> (referer: https://tabelog.com/tokyo/rstLst/lunch/?LstCosT=2&RdoCosTp=1) 2017-08-17 15:09:00 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://tabelog.com/tokyo/rstLst/lunch/2/?LstCosT=2&RdoCosTp=1> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates) 2017-08-17 15:09:01 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://tabelog.com/tokyo/A1309/A130902/13000852/> (referer: https://tabelog.com/tokyo/rstLst/lunch/?LstCosT=2&RdoCosTp=1) 2017-08-17 15:09:01 [scrapy.core.scraper] ERROR: Spider error processing <GET https://tabelog.com/tokyo/A1309/A130902/13000852/> (referer: https://tabelog.com/tokyo/rstLst/lunch/?LstCosT=2&RdoCosTp=1) Traceback (most recent call last): File "/Users/nozomui/.pyenv/versions/3.4.6/lib/python3.4/site-packages/scrapy/utils/defer.py", line 102, in iter_errback yield next(it) File "/Users/nozomui/.pyenv/versions/3.4.6/lib/python3.4/site-packages/scrapy/spidermiddlewares/offsite.py", line 29, in process_spider_output for x in result: File "/Users/nozomui/.pyenv/versions/3.4.6/lib/python3.4/site-packages/scrapy/spidermiddlewares/referer.py", line 339, in <genexpr> return (_set_referer(r) for r in result or ()) File "/Users/nozomui/.pyenv/versions/3.4.6/lib/python3.4/site-packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr> return (r for r in result or () if _filter(r)) File "/Users/nozomui/.pyenv/versions/3.4.6/lib/python3.4/site-packages/scrapy/spidermiddlewares/depth.py", line 58, in <genexpr> return (r for r in result or () if _filter(r)) File "/Users/nozomui/.pyenv/versions/3.4.6/lib/python3.4/site-packages/scrapy/spiders/crawl.py", line 78, in _parse_response for requests_or_item in iterate_spider_output(cb_res): File "/Users/nozomui/scraping3.4/6-7/myproject/spiders/tabelog.py", line 38, in parse_restaurant address=response.css('[rel="address"]').xpath('string()').extract_first().strip(), AttributeError: 'NoneType' object has no attribute 'strip' ^Z [4]+ Stopped scrapy crawl tabelog -o a.csv
###該当のソースコード
python
1from scrapy.spiders import CrawlSpider, Rule 2from scrapy.linkextractors import LinkExtractor 3 4from myproject.items import Restaurant 5 6 7class TabelogSpider(CrawlSpider): 8 name = "tabelog" 9 allowed_domains = ["tabelog.com"] 10 start_urls = ( 11 # 東京の昼のランキングのURL。 12 # 普通にWebサイトを見ていると、もっとパラメーターが多くなるが、 13 # ページャーのリンクを見ると、値が0のパラメーターは省略できることがわかる。 14 'https://tabelog.com/tokyo/rstLst/lunch/?LstCosT=2&RdoCosTp=1', 15 ) 16 17 rules = [ 18 # ページャーをたどる(最大9ページまで)。 19 # 正規表現の \d を \d+ に変えると10ページ目以降もたどれる。 20 Rule(LinkExtractor(allow=r'/\w+/rstLst/lunch/\d/')), 21 # レストランの詳細ページをパースする。 22 Rule(LinkExtractor(allow=r'/\w+/A\d+/A\d+/\d+/$'), 23 callback='parse_restaurant'), 24 ] 25 26 def parse_restaurant(self, response): 27 """ 28 レストランの詳細ページをパースする。 29 """ 30 # Google Static Mapsの画像のURLから緯度と経度を取得。 31 latitude, longitude = response.css( 32 'img.js-map-lazyload::attr("data-original")').re( 33 r'markers=.*?%7C([\d.]+),([\d.]+)') 34 35 # キーの値を指定してRestaurantオブジェクトを作成。 36 item = Restaurant( 37 name=response.css('.display-name').xpath('string()').extract_first().strip(), 38 address=response.css('[rel="address"]').xpath('string()').extract_first().strip(), 39 latitude=latitude, 40 longitude=longitude, 41 station=response.css('dt:contains("最寄り駅")+dd span::text').extract_first(), 42 score=response.css('[rel="v:rating"] span::text').extract_first(), 43 ) 44 45 yield item 46
###試したこと
python3.4.6で実行しました。scrapyのバージョンは1.4.0です。
回答3件
あなたの回答
tips
プレビュー