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

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

新規登録して質問してみよう
ただいま回答率
85.46%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

937閲覧

pythonでのスクレイピング

Potat3rd

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/06 16:50

編集2021/09/06 16:59

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

with open('img/' + target.split('/')[-1], 'wb') as f: [Errno 22] Invalid argument: 'img/latest?cb=20210602000018'

該当のソースコード

import requests from requests.compat import urljoin from bs4 import BeautifulSoup URL = 'https://apexlegends.fandom.com/wiki/Category:Ability_icons' images = [] soup = BeautifulSoup(requests.get(URL).content,'lxml') for link in soup.find_all("img"): #if link.get("src").endswith(".jpg"):if link.get("src").endswith(".png"): 画像保存形式の指定?モスのサイトで.pngにてpngで終わるリンクの画像取得を確認 if link.get("src").startswith("https://static.wikia.nocookie.net/apexlegends_gamepedia_en"): print(link.get("src")) # 相対URLから絶対URLに変換 images.append(urljoin(URL, link.get("src"))) for target in images: resp = requests.get(target) #1st with open('img/' + target.split('/')[-1], 'wb') as f: #2nd_Fail with open('img/' + target.split('FD')[-1], 'wb') as f: #re_1st with open('img/' + target.split('/')[-1], 'wb') as f: f.write(resp.content)

試したことなど

いくつかのサイトで画像のスクレイピングを試していて
できるサイトとできないサイトがあることに気付き、このコードの場合どうやら.endwithで検索しているのでpng形式のリンクは.jpgから.pngに書き換えることでスクレイピングできました。

しかし、上記のコードではスクレイピングしたいリンク先に末尾で統一された文字列はなかったようなのでstartwith関数を見つけてきて書き換えてみたところ、エラーが出てしまいスクレイピングできませんでした。

保存したい画像は以下の部分の系列の画像です。
<img src="https://static.wikia.nocookie.net/apexlegends_gamepedia_en/images/8/87/Black_Hole.svg/revision/latest/scale-to-width-down/512?cb=20210529125923" height="512">

よろしくお願いします。

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

Windows10 Python3.7 64bit Visual Studio

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーの発生している行をよく見ましょう。スクレイピングとは関係ない、ファイルのオープンで発生しています。
latest?cb=20210602000018という名前のファイルを作成しようとしていますが、
Windowsでは?はファイル名に使えない文字です。

ファイル名の付け方を考え直しましょう。
例えば、使えない文字を使える文字に置き換えるとか。

投稿2021/09/06 18:39

otn

総合スコア84806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Potat3rd

2021/09/07 10:34

ありがとうございます! エラーが出たときに?がダメなんだってことまで表示されないんですね...確かに体験としてファイル名に使えない文字があるというのはプログラミング外で手動でファイル名を付けるときに感じていたのですが、その知識が結び付きませんでした。。。尊敬です!置き換え方調べます!
otn

2021/09/07 10:53

どの文字が使えないかはOS依存なので、Pythonの担当範囲外です。 ファイル名が不正というメッセージから、自分で判断。 例えばLinuxなら ? を含んだファイル名も問題ありません。変な記号を使うとあとで扱いにくいですが。
Potat3rd

2021/09/07 18:22

Linuxなら ? が使えるというのは初耳でした!ありがとうございます! 調べてきた結果として、trancerate関数か正規表現からre.sub('置換対象文字','置換文字','入力文字列')、もしくはunicodedataのインポートあたりから必要ない文字を除外できそうだという情報を得ました。 色々試してファイルの保存には至ったものの別の問題が発生し、それがまた複雑なため詳細を書けるよう別の質問として立てたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問