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

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

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

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

Python

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

Q&A

解決済

1回答

662閲覧

Pythonスクレイピングをご教示頂きたい。

LBciel.

総合スコア18

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2020/02/03 07:20

編集2020/02/18 04:33

前提・実現したいこと(すべて解決するまで更新し続けます。)

**【URL】【画像】【商品名】【発売日】【値段】**を抜き出して出力する。(CSV、テキストなど)
その後、tkinterでExcelのinputboxのようなものを作成する。

HTML

12 ▾<div id="Main"> 3 ▾<a href="URL1" class"s d a"> 4  ▾<div class="img"> 5 <img src="https://...jpg?" Srcset="https://...jpg? x1, https://...jpg? x2"> 6 </div> 7  ▾<div class="one"> 8 ▾<div class="two"> 9 <span class="title">商品名</span> 10 </div> 11 <div class="three">発売日</div> 12 ▶<div class=""></div> 13 ▾<div class="four"> 14 ▾<div class="five"> 15 ▾<span style="color: #888888;"> 16 <strike>¥1,520</strike> 17 </span> 18 <br> 19 "¥1,140 " 20 </div> 21 </div> 22 </div> 23 <div style="clear: left;"></div> 24 </a> 25 ▶<a href="URL2" class"s d a">…</a> 26 ▶<a href="URL3" class"s d a">…</a> 27 ▶<a href="URL4" class"s d a">…</a> 28 </div> 29

※必要でないような部分は記述していません。classはそのまま表示するわけにもいきませんので英数字を入れています。出来ない部分は無理に出力も必要ありません。
<a href>内のclassは一部商品を除き同一でした。)
もし上記だけでは情報不足という事であれば、その前後も追記致します。

<a>タグの中に欲しい情報が全て収まっており、ブラウザ上は横並びで一行になっています。
<a>タグ1つが1行で、その下URL2,3,4…と下に続いています。その全てをページを変えて抽出が目標となっております。
値段の部分では割引されている場合改行が入ります。VBAで試した際にそのままCSV出力すると改行された為、「vbCrLf」で削除し解決しました。

一度下記質問内で同じページをVBAスクレイピングしております。
https://teratail.com/questions/237676

解決済み(一部)2/15更新

※実際のサイトのclass名等を一部変更し記載しています。
【URL】【画像】【商品名】【発売日】【値段】の抜き出しは一応出来ております。(問題あり)

Python

1import requests 2import urllib.request 3from bs4 import BeautifulSoup 4 5r = requests.get("https://store.com/search/?term=japanese") 6 7soup = BeautifulSoup(r.content, "html.parser") 8 9main = soup.find('div', id='search_resultsRows') 10m2a = main.find_all('a', class_='search_result_row') 11

Python

1a2trph = [] 2for item in m2a: 3 a2t = item.select_one("[class='title']").text 4 a2r = item.select_one('div.search_released').text 5 a2p = item.select_one('div.search_price').text 6 a2h = item.get('href') 7 a2trph.append(a2t) 8 a2trph.append(a2r) 9 a2trph.append(a2p) 10 a2trph.append(a2h) 11print(a2trph) 12 13with open("test.txt", "w", encoding="utf-8") as f: 14 f.write(str(a2trph))

【画像】保存は終了し、現状困ったところはありません。問題があればその時にコードを記載致します。

現状の問題 2/15更新

上部「解決済み」2つ目のコードで下記の様に出力されます。(一部変更)
一行での記載で見づらいと思いますが実際に表示されている状態の方が良いと思いこの様に表現しています。

※コード内【値段】の部分で問題が生じております。
csvやテキストファイルに出力する際に、\nや**\r**、空白部分が邪魔になる事と存じます。
所感ですが、HTMLのdivタグなどの部分で\nや\rが出力され、値段の部分に空白が入れられていると思われます。
** → 何故かstripで解決** 理由が知りたい・・・

※すべてのコードで問題が生じております。

  • 各項目「'」で囲まれている。例:下記コード参照

純粋にテキストだけ欲しいのですが、何故「'」に囲まれているのでしょうか。

  • 又、Excelにした際に【発売日】に「,」が入っており区切り文字として使用できません。どういった解決策がありますでしょうか。
['Sampletitle1 (Japanese Ver.)', '27 Nov, 2019', 'Free To Play', 'https://store.com/app/1175730/Japanese_Ver/?snr=1_7_7_151_150_1', "Sampletitle2 (Japanese version)", '10 Dec, 2014', '¥ 10,162', 'https://store.com/app/288390/Japanese_version/?snr=1_7_7_151_150_1', 'Sampletitle3', '22 Aug, 2019', '¥ 1,320¥ 1,056', 'https://store.com/app/662960/?snr=1_7_7_151_150_1', ...以下ヒット数同文]

この問題をどの様に解決すればよいかご教示頂ければ幸いです。コードを一から作り直しでも構いません。

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

Python3.8.1 64-bit
イメージ説明
当方のPython知識は、
・独学プログラマー Python言語の基本から仕事のやり方まで
・Excel×Python最速仕事術
こちらの2冊を読んだだけの知識で御座います。

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

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

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

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

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

t_obara

2020/02/03 07:59

とりあえず、基本的に必要と思われるモジュールについてですが、単にクロールしてファイルに出力するだけであれば、tkinterは不要です。クロールするページがJavaScriptを利用してダイナミックにページ更新をしているような場合にはSeleniumが必要です。
LBciel.

2020/02/03 08:17

ご説明有難う御座います。 tkinterを使用しようと思った理由につきましては、始めにテキスト入力が出来るメッセージボックスを出力し、そこに検索ワードを入力したのちに、抽出、出力という流れをVBAの時に行いまして、こちらでそれを行う場合はtkinterを利用するのであろうと思い試しておりました。 Seleniumに関しまして、どういう状況で利用するものかわかりかねましたので、説明して頂きまして有難う御座いました。おそらく当サイトでは必要ないのであろうなとは思いました。
t_obara

2020/02/03 08:34

質問する際には、回答側が混乱しないように必要最小限の構成で質問された方が回答がつきやすくなります。 >おそらく当サイトでは必要ない >→[requests][BeautifulSoup]のみでページ移動や抽出方法がわからない この点に関してもう少し具体的に何がわからないのか、何を試したときにどのような結果なためわからないと考えているのかをご提示されると回答が得られやすくなるかと思います。
LBciel.

2020/02/03 09:11

ご指摘有難う御座います。 ご指摘の件に関しまして、正直なところ申しますと、具体的に申し上げるほどの理解とPythonの知識が御座いません。上部HTMLの内容であればその2つで出来るのではないかという憶測での発言であり、実際に出来るのかどうかわかりかねます。 ・VBAスクレイピングで一度スクレイピングを行ったため、スクレイピングの流れ、選択に必要なHTMLのタグなどは理解できる。しかし、VBAで担っていた部分がPythonの場合何を使用すればよいのかがわからない。 というのが現状で御座います。 又、[requests][BeautifulSoup]のみで行けるのではと思った理由に関しまして、「ページ移行はseleniumで行うもの」かと思いましたが、とあるサイトの使用モジュールを見るとseleniumがなく、[requests][BeautifulSoup]のみでページ移行する記載があり、必要がないのではと思い至りました。 抽出先のサイトのページの部分が下記になります。 1 2 3 ... 74 >  →  < 1 2 3 4 ... 74 > VBAの際は>の部分を使用し、初回は「ClassName("pagebtn")(0).Click」、2回目以降は「ClassName("pagebtn")(1).Click」としてページ送りをしておりました。
LBciel.

2020/02/03 09:34 編集

上記「試したこと」内で出来た部分までの説明をした方が良いでしょうか。 inputで入力したキーワード入力 → Chromeを起動 → 検索ボックスにキーワード入力 → Enter → スクレイピングしたいページに到着(1ページ目) 現状はここまでとなっております。止まった理由に関しましては、seleniumを使用したため、移動後のURL取得方法がわからなくなった?のだと思われます。完全に混乱しており、説明が出来ない現状にあります。 また、抽出する為にどのモジュールとどういうコードを書けばよいのかがわかりかねております。 実際にやりたい事 ・GUI(pythonでの言葉がわかりません。)を表示し、キーワード入力させる ・検索ボックスにキーワード入力 ・スクレイピングしたいページに移動 ・必要項目を抽出 ・ページ移動 ・必要項目を抽出 ・CSVやテキストファイルにデータを出力 この様な流れを希望しております。こちらでご理解頂ければよいのですが・・・
t_obara

2020/02/03 09:25

クリックしたかのようにしてデータを取得したい場合はSelenium、HTMLをパースしてURLを取得し、そのURLを指定してページデータを取得してパースするのがBeautifulSoupといったイメージでしょう。
LBciel.

2020/02/03 09:37

有難う御座います。BeautifulSoupに絞って再度調べ、いろいろと試してみたいと思います。
guest

回答1

0

自己解決

リストから1つずつ表示すれば「'」の出力が無くなった。
stripで解決した理由はわかりかねますがすべての項目を出力することが出来たため、終了とします。

投稿2020/02/18 04:35

LBciel.

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問