質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Python 3.x

    7315questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Scrapy

    104questions

    Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Pythonのscrapyによるクローリング、スクレイピング

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 407

RarigoB

score 16

わからないこと
scrapyでクローリング.スクレイピングしてもJSONファイルになにも書き込まれない

実現したいこと
正常に動作させたい

趣味のスロットのライターの来店予定なんかを収集しようと思っています。
http://www.bash-tv.com/wp/schedule
このページをスクレイピングしたいのですが、うまくいきません。
エラーなどは出ないのですが、スクレピングできていないようです。

import scrapy

from myproject.items import SceduleItem

class TestSpider(scrapy.Spider):
    name = "test6"
    allowed_domains = ["bash-tv.com"]
    start_urls = (
        'http://www.bash-tv.com/wp/schedule',
    )

    def parse(self, response):
        """
        日付ごとのboxを取得
        """
        for info in response.xpath('//div[@class="syuroku_raiten_area"]'):
            yield from self.parse_info(info)

    def parse_info(self, info):
        """
        取得した日付ごとのboxの中にある、それぞれのboxをスクレイピングし、itemに格納する
        """
        item = SceduleItem()
        day = info.xpath('//h3/text()').extract_first() #parseで取得したboxの日付を得る。
        for result in info.xpath('//div[@class="syuroku_raiten_area"]/div[@class="hall_info"]'):
            content = result.xpath('//div[@class="text"]/div[@class="bangumi"]/text()').extract_first()
            cast = result.xpath('//div[@class="text"]/div[@class="syutsuen"]/text()').extract_first()
            item['day'] = day
            item['place'] = result.xpath('//div[@class="area"]/text()').extract_first()
            item['shop'] = result.xpath('//div[@class="name"]/text()').extract_first()
            item['content'] = cast + content
            item['media'] = 'バッシュTV'
            yield item
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class SceduleItem(scrapy.Item):
    day = scrapy.Field()
    place = scrapy.Field()
    content = scrapy.Field()
    shop = scrapy.Field()
    media = scrapy.Field()
2018-04-27 23:15:48 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: myproject)
2018-04-27 23:15:48 [scrapy.utils.log] INFO: Versions: lxml 3.5.0.0, libxml2 2.9.3, cssselect 1.0.1, parsel 1.3.1, w3lib 1.18.0, Twisted 17.9.0, Python 3.5.2 (default, Nov 23 2017, 16:37:01) - [GCC 5.4.0 20160609], pyOpenSSL 17.5.0 (OpenSSL 1.1.0g  2 Nov 2017), cryptography 2.1.4, Platform Linux-4.4.0-119-generic-x86_64-with-Ubuntu-16.04-xenial
2018-04-27 23:15:48 [scrapy.crawler] INFO: Overridden settings: {'FEED_FORMAT': 'jl', 'BOT_NAME': 'myproject', 'DOWNLOAD_DELAY': 1, 'NEWSPIDER_MODULE': 'myproject.spiders', 'ROBOTSTXT_OBEY': True, 'FEED_URI': 'test5.jl', 'SPIDER_MODULES': ['myproject.spiders']}
2018-04-27 23:15:48 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.feedexport.FeedExporter',
 'scrapy.extensions.memusage.MemoryUsage',
 'scrapy.extensions.logstats.LogStats',
 'scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole']
2018-04-27 23:15:48 [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']
2018-04-27 23:15:48 [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']
2018-04-27 23:15:48 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2018-04-27 23:15:48 [scrapy.core.engine] INFO: Spider opened
2018-04-27 23:15:48 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-04-27 23:15:48 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-04-27 23:15:49 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://www.bash-tv.com/robots.txt> (referer: None)
2018-04-27 23:15:51 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.bash-tv.com/wp/schedule> (referer: None)
2018-04-27 23:15:51 [scrapy.core.engine] INFO: Closing spider (finished)
2018-04-27 23:15:51 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 449,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 199210,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 1,
 'downloader/response_status_count/404': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 4, 27, 14, 15, 51, 243458),
 'log_count/DEBUG': 3,
 'log_count/INFO': 7,
 'memusage/max': 54681600,
 'memusage/startup': 54681600,
 'response_received_count': 2,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2018, 4, 27, 14, 15, 48, 736407)}
2018-04-27 23:15:51 [scrapy.core.engine] INFO: Spider closed (finished)

日付ごとのboxを取得し、それをparse_infoで解析し、itemに格納したいんですが、JSONに出力しようとしても出力されず、
ログをみてもスクレイピングできていないようです。
parse_infoがうまく呼び出せていないのかななんて考えているのですがいまいちよくわかりません。
このプログラムが正常にスクレピングするにはどうしたらいいでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/04/28 11:21

    それと、scrapyのspiderに複数のパーサーを追加するのは、 通常パーサーそれぞれが別のurlのページを取得してスクレイピングする場合に限られるので、 今回の場合はそもそもパーサーを分ける必要性がないと思います。

    キャンセル

  • RarigoB

    2018/04/30 17:05

    返答が遅くなり申し訳ありません。今回のようにboxのなかのboxを解析する場合はどうすればいいのでしょうか?

    キャンセル

  • RarigoB

    2018/04/30 17:09

    パーサーを分けずにやる場合は

    キャンセル

回答 1

checkベストアンサー

0

parseが値を何も返さずに終わっているからですね。
Item(のサブクラス)をyieldしているのはparse_infoの方ですが、parseがそれを捨てているのです。

            self.parse_info(info)


            yield from self.parse_info(info)


とでもすればいいんじゃないかと。

https://docs.python.jp/3/reference/expressions.html#yieldexpr


        for result in info.xpath('//div[@class="syuroku_raiten_area"]/div[@class="hall_info"]'):
            content = result.xpath('//div[@class="text"]/div[@class="bangumi"]/text()').extract_first()


        for result in info.xpath('.//div[@class="hall_info"]'):
            content = result.xpath('./div[@class="text"]/div[@class="bangumi"]/text()').extract_first()
(あとは略)


こうかな?


何を直したのかわかっていないようなので。

せっかく要素を探索してループを回しているのに、その中で//から探索したら、常にルートノードから探索してしまって意味がないので、コンテキストノードの下を探すように書きました。

http://www.techscore.com/tech/XML/XPath/xpath02.html/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/27 11:21

    返答が遅くなり申し訳ありません。うまいきませんでした。xpathのほうがscrapy shellで確かめているので間違いはないと思うのですが、日付のboxごとにとって、その中のboxを解析するというやり方がちがうのでしょうか?

    キャンセル

  • 2018/04/27 11:27

    修正したspiderとitems.pyを質問に記載しておきますので、なにか間違いがれば教えていただけると幸いです。

    キャンセル

  • 2018/04/30 17:05

    やはりうまくいかないようです

    キャンセル

  • 2018/04/30 17:37

    申し訳ありません。xpathの間違いでした。うまくいったのですが、日付がすべて同じになってしまいました。なにか修正点はあるのでしょうか

    キャンセル

  • 2018/05/01 00:01

    すでに書いたことと同じですよね。

    キャンセル

  • 2018/05/02 11:37

    はい、すいません自分の理解不足でした。

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    7315questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Scrapy

    104questions

    Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。