PythonでURLとそのステータスコードを取得したい

前提

pythonのscrapyを使ってURLを取得する練習を行っています。
目標としては、
①サイトにアクセスし、aタグからhrefに書かれたURLを取得
②ステータスコードを基に、
リンク切れ(ステータスコードが200以外)がないか確認する
のようなイメージです。

初心者のため、何か情報に漏れ等あるかもしれません。
その場合は都度追記いたします。申し訳ございません。
どうぞ、よろしくお願いいたします。

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

現状、下記コードでは
該当のaタグにあるURLを全て取得することまでできました。(イメージ①の部分)

該当のソースコード

Python

import scrapy class CurtainLinkBacicSpider(scrapy.Spider): name = 'link_bacic' allowed_domains = ['www.ドメイン名'] start_urls = ['https://www.ドメイン名.jp'] def parse(self, response): #ヘッダーメニュー部分のURLだけ取得 header = response.xpath('//div[@class="該当パス"]/a/@href') for header_ in header: yield{ 'header_URL': header_.get() }

取得できたURLを基に、ステータスコードが200以外のものがあったらわかるようにしたいです。
調べてみたところ、requestsオブジェクトのstatus_codeが使えそうだったのでrequestsをインポートし、まずはyieldでURLとステータスコードをJSONファイルに表示させたいと考えています。
JSONファイルの表示イメージは下記です。

JSON

[ { "header_URL": "https://ドメイン名.jp/111111", "status_code": "200" } { "header_URL": "https://ドメイン名.jp/222222", "status_code": "400" } { "header_URL": "https://ドメイン名.jp/333333", "status_code": "200" }・ ・ ・

上記を実現したく、下記のように記述しました。

Python

import scrapy import requests class CurtainLinkBacicSpider(scrapy.Spider): name = 'link_bacic' allowed_domains = ['www.ドメイン名'] start_urls = ['https://www.ドメイン名.jp'] def parse(self, response): #ヘッダーメニュー部分のURLだけ取得 header = response.xpath('//div[@class="該当パス"]/a/@href') for header_ in header: #取得したURLを基にステータスコードを表示したい url_status = requests.get(header_) status_cd = url_status.status_code yield{ 'header_URL': header_.get(), 'status_CODE': status_cd.get() }

実行するとJSONファイルには何も書き込まれず、下記エラーが発生しております。
status_code取得の書き方が原因とは思うのですが、
ご教示いただけますと幸いです。

ERROR: Spider error processing <GET https://www.ドメイン名.jp> (referer: None)

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

Windows11
anaconda navigator 2.3.1
python 3.8.13
scrapy 2.4.1
requests 2.28.1
vscode 1.72.0

コメントを投稿

0 コメント