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

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

ただいまの
回答率

87.49%

【python3】scrapyを用いた「リンクを指定してクローリング、スクレイピング」ができません。

解決済

回答 1

投稿

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

score 1

【python3】scrapyを用いた「リンクを指定してクローリング、スクレイピング」ができません。

スクレイピングの勉強を始めて1週間ほどの初心者です。
Webサイトを参考に勉強しているのですが、以下のようなエラーメッセージが表示され、解決方法がわかりません。
どなたか教えていただけると幸いです。

発生している問題・エラーメッセージ

ValueError: Missing scheme in request url: /author/Albert-Einstein

sample_detail.py

import scrapy
from sample.items import SampleDetailItem


class SampleDetailSpider(scrapy.Spider):
    name = 'sample_detail'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']


    def parse(self, response):
        for quote in response.css("div.quote"):
            item = SampleDetailItem()
            item["quote"] = quote.css("span.text::text").extract_first()
            item["author"] = quote.css("small.author::text").extract_first()
            yield scrapy.Request(
                quote.css('a::attr(href)').extract_first(),
                callback=self.parse_detail,
                meta={'item': item}
                )

            print(item)


    def parse_detail(self, response):
        item = response.meta['item']
        item['author_birth'] = response.css('div autor_details span.author-born-date ::text').extract_first()
        yield item

items.py

import scrapy

class SampleDetailItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    quote = scrapy.Field()
    author = scrapy.Field()
    author_birth = scrapy.Field()
    pass

試したこと

・yield scrapy.Requestで返したURLが不正である。
という記事のurljoinメソッドを用いた方法を試してみたのですが、
「TypeError: Cannot mix str and non-str arguments」というエラーが出ます。

・urllib.parseを用いた方法も調べましたが、使い方がわかりませんでした。

補足情報

python 3.9.0
Scrapy 2.4.0

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

response.urlに基底のurlが入っているはずなのでそれを利用すればいいのではと思いました。

(略)
from urllib.parse import urljoin
(略)
class SampleDetailSpider(scrapy.Spider):
    name = 'sample_detail'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']


    def parse(self, response):
        for quote in response.css("div.quote"):
            item = SampleDetailItem()
            item["quote"] = quote.css("span.text::text").extract_first()
            item["author"] = quote.css("small.author::text").extract_first()
            yield scrapy.Request(
                urljoin(response.url, quote.css('a::attr(href)').extract_first()),   # <-------------修正
                '''
                # 追記;下記でも可の模様。この場合冒頭のurljoinのimportは不要。
                response.urljoin(quote.css('a::attr(href)').extract_first())
                '''
                callback=self.parse_detail,
                meta={'item': item}
            )
(略)

https://qiita.com/fukuham/items/2cd7d2a9d34515cba967
https://qiita.com/negisys/items/b89cc636f79219df5c45
参考:
https://stackoverflow.com/questions/10798118/combining-base-url-with-resultant-href-in-scrapy

10m

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/12/03 11:15

    ご回答いただいた方法で無事に出力することができました!
    本当に助かりました。
    ありがとうございます。

    キャンセル

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

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

関連した質問

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