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

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

ただいまの
回答率

90.99%

  • Python 2.7

    1099questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Scrapy

    58questions

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

Scrapyを用いてのスクレイピング

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 372

haduki08

score 3

前提・実現したいこと

Python2.7でScrapyをインストールしてWEBクロール&スクレイピングをしようと
思っています。

下記ページを参考に「グノシー」からの抽出は成功しました。
Scrapy + Scrapy Cloudで快適Pythonクロール+スクレイピングライフを送る

対象のサイトは下記なのですが
シェアハウス検索サイト「シェアシェア」
xPath、CSSセレクタの指定の仕方が知識と理解が足りなく苦戦しています。

まず、下記図の赤枠部分のテキストとURLを取得したいです。
イメージ説明

該当のソースコード(\shareshare\spiders\get_shareshare.py)

# -*- coding: utf-8 -*-
import scrapy

class shareshareSpider(scrapy.Spider):
    name = "share_share"
    allowed_domains = ["share-share.jp"]

    start_urls = (
        'http://share-share.jp/search/result/?limit=25&page=1&sort%5B1%5D=upd'
    )

    def parse(self, response):
        for sel in response.css("div.result-list"):
            article = shareshareItem()
            article['title'] = sel.css("table > tbody > tr:nth-child(1) > td > div > h3 > a::text").extract_first()
            article['url'] = sel.css("div.result-list > table > tbody > tr:nth-child(1) > td > div > h3 > a::attr('href')").extract_first()

試したこと

Google ChromeのデベロッパーツールからxPath、CSSセレクタ取得をして
何となくコーディング

補足情報(言語/FW/ツール等のバージョンなど)

OS:windows10 64bit
言語:python2.7
FW:scrapy1.4

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tell_k

    2017/10/23 18:48

    具体的に「何が」できなくて困っているか書いてもらえると回答がつきやすいと思います。

    キャンセル

  • haduki08

    2017/10/23 19:02

    失礼しました。イメージ図を追加して、やりたいことを明記しました。

    キャンセル

回答 2

checkベストアンサー

0

今の書き方だと、最初のデータしかスクレピングできないので、下記のようにして、一件づつループを回せるようにしてあげれば良いと思います。

# 1件のデータはtrタグの単位でまとまってる -> trタグを抽出
for d in response.css('div.result-list > table > tbody > tr'):

    # tr タグの中から必要な情報を抽出する
    title = d.css('td > div > h3 > a::text').extract_first()
    url = d.css('td > div > h3 > a::attr("href")').extract_first()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/24 08:07

    tall_kさん
    ありがとうございます!

    実行してみましたが、下記エラーが解消できません。
    schemeがない?見つからない?と怒られているようなのですが・・・

    下記を参考にしましたが、解決できませんでした。
    https://stackoverflow.com/questions/27272575/valueerror-missing-scheme-in-request-url-h-in-python
    https://stackoverflow.com/questions/34976240/scrapy-missing-scheme-in-request-url


    ***************************************************************************
    PS C:\Users\wada\shareshare> scrapy crawl share_share
    2017-10-24 08:03:35 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: shareshare)
    2017-10-24 08:03:35 [scrapy.utils.log] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'shareshare.spiders', 'SPIDER_MOD
    ULES': ['shareshare.spiders'], 'ROBOTSTXT_OBEY': True, 'BOT_NAME': 'shareshare'}
    2017-10-24 08:03:35 [scrapy.middleware] INFO: Enabled extensions:
    ['scrapy.extensions.logstats.LogStats',
    'scrapy.extensions.telnet.TelnetConsole',
    'scrapy.extensions.corestats.CoreStats']
    2017-10-24 08:03:35 [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-10-24 08:03:35 [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-10-24 08:03:35 [scrapy.middleware] INFO: Enabled item pipelines:
    []
    2017-10-24 08:03:35 [scrapy.core.engine] INFO: Spider opened
    2017-10-24 08:03:35 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min
    )
    2017-10-24 08:03:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
    2017-10-24 08:03:35 [scrapy.core.engine] ERROR: Error while obtaining start requests
    Traceback (most recent call last):
    File "c:\users\wada\documents\python27\lib\site-packages\scrapy\core\engine.py", line 127, in _next_request
    request = next(slot.start_requests)
    File "c:\users\wada\documents\python27\lib\site-packages\scrapy\spiders\__init__.py", line 83, in start_requests
    yield Request(url, dont_filter=True)
    File "c:\users\wada\documents\python27\lib\site-packages\scrapy\http\request\__init__.py", line 25, in __init__
    self._set_url(url)
    File "c:\users\wada\documents\python27\lib\site-packages\scrapy\http\request\__init__.py", line 58, in _set_url
    raise ValueError('Missing scheme in request url: %s' % self._url)
    ValueError: Missing scheme in request url: h
    2017-10-24 08:03:35 [scrapy.core.engine] INFO: Closing spider (finished)
    2017-10-24 08:03:35 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
    {'finish_reason': 'finished',
    'finish_time': datetime.datetime(2017, 10, 23, 23, 3, 35, 863000),
    'log_count/DEBUG': 1,
    'log_count/ERROR': 1,
    'log_count/INFO': 7,
    'start_time': datetime.datetime(2017, 10, 23, 23, 3, 35, 850000)}
    2017-10-24 08:03:35 [scrapy.core.engine] INFO: Spider closed (finished)
    ***************************************************************************

    キャンセル

  • 2017/10/24 08:53

    start_urls がタプルになってないですね。URLの後ろに(,)カンマを入れるかリストにしてあげてください。

    カンマを入れる例

    start_urls = (
    'http://share-share.jp/search/result/?limit=25&page=1&sort%5B1%5D=upd', # <= タプルは要素が一つでも必ずカンマが必要
    )

    リストにする例 (() => [] に変える)

    start_urls = [
    'http://share-share.jp/search/result/?limit=25&page=1&sort%5B1%5D=upd'
    ]

    キャンセル

  • 2017/10/24 10:27

    ありがとうございます。出来ました!!

    ***************************************************************************
    PS C:\Users\wada\shareshare> scrapy crawl share_share
    2017-10-24 10:21:45 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: shareshare)
    2017-10-24 10:21:45 [scrapy.utils.log] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'shareshare.spiders', 'SPIDER_MODULES': ['shareshare.spiders'], 'ROBOTSTXT_OBEY': True, 'BOT_NAME': 'shareshare'}
    2017-10-24 10:21:45 [scrapy.middleware] INFO: Enabled extensions:
    ['scrapy.extensions.logstats.LogStats',
    'scrapy.extensions.telnet.TelnetConsole',
    'scrapy.extensions.corestats.CoreStats']
    2017-10-24 10:21:46 [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-10-24 10:21:46 [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-10-24 10:21:46 [scrapy.middleware] INFO: Enabled item pipelines:
    []
    2017-10-24 10:21:46 [scrapy.core.engine] INFO: Spider opened
    2017-10-24 10:21:46 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
    2017-10-24 10:21:46 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
    2017-10-24 10:21:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://share-share.jp/robots.txt> (referer: None)
    2017-10-24 10:21:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://share-share.jp/search/result/page=1> (referer: None)
    2017-10-24 10:21:46 [scrapy.core.scraper] DEBUG: Scraped from <200 http://share-share.jp/search/result/page=1>
    {'title': u'\u30b9\u30bf\u30a4\u30ea\u30aa \u30a6\u30a3\u30ba \u4ee3\u5b98\u5c71',
    'url': u'/house/detail/2439/'}
    #省略#


    #省略#
    2017-10-24 10:21:46 [scrapy.core.scraper] DEBUG: Scraped from <200 http://share-share.jp/search/result/page=1>
    {'title': u'\u30de\u30fb\u30e1\u30be\u30f3\u81ea\u7531\u304c\u4e18/\u5973\u6027\u5c02\u7528 \u4eba\u6c17\u306e\u81ea\u7531\u304c\u4e18\u307e\u3067\u3059\u3050\uff01',
    'url': u'/house/detail/613/'}
    2017-10-24 10:21:46 [scrapy.core.engine] INFO: Closing spider (finished)
    2017-10-24 10:21:46 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
    {'downloader/request_bytes': 454,
    'downloader/request_count': 2,
    'downloader/request_method_count/GET': 2,
    'downloader/response_bytes': 107244,
    'downloader/response_count': 2,
    'downloader/response_status_count/200': 2,
    'finish_reason': 'finished',
    'finish_time': datetime.datetime(2017, 10, 24, 1, 21, 46, 653000),
    'item_scraped_count': 25,
    'log_count/DEBUG': 28,
    'log_count/INFO': 7,
    'response_received_count': 2,
    'scheduler/dequeued': 1,
    'scheduler/dequeued/memory': 1,
    'scheduler/enqueued': 1,
    'scheduler/enqueued/memory': 1,
    'start_time': datetime.datetime(2017, 10, 24, 1, 21, 46, 129000)}
    2017-10-24 10:21:46 [scrapy.core.engine] INFO: Spider closed (finished)
    PS C:\Users\wada\shareshare>
    ***************************************************************************

    次にScrapy Cloudでの実行が上手くいかないのですが
    別途質問します。

    キャンセル

0

下記2点を修正したら解決しました。

1.データ取得のループ処理を修正
2.start_urls がタプルになるように修正

# -*- coding: utf-8 -*-
import scrapy

from shareshare.items import shareshareItem


class shareshareSpider(scrapy.Spider):
    name = "share_share"
    allowed_domains = ["share-share.jp"]

    start_urls = (
        'http://share-share.jp/search/result/page=1',
    )

    def parse(self, response):
        # 1件のデータはtrタグの単位でまとまってる -> trタグを抽出
        for d in response.css("div.result-list > table > tbody > tr"):
            article = shareshareItem()
            # tr タグの中から必要な情報を抽出する
            article['title']  = d.css("td > div > h3 > a::text").extract_first()
            article['url'] = d.css("td > div > h3 > a::attr('href')").extract_first()
            yield article

tell_kさん、ありがとうございました!!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 2.7

    1099questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Scrapy

    58questions

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