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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

Q&A

解決済

3回答

3015閲覧

Python Webスクレイピング URLを変更して順番にスクレイピングしていきたい。

pythonbegginer

総合スコア25

スクレイピング

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0グッド

0クリップ

投稿2020/03/31 05:50

編集2020/04/01 03:37

Pythonを初めて数日の初心者で、プログラミングも勉強始めたばかりです。
最終的にWebスクレイピングができるようになりたいと思っています。

検索してもわからなく、つまづいているので詳しい方教えて下さいm(__)m

※Windows10のコマンドプロンプトから実行しています。
※Webスクレイピングの規約は確認しています。

★やりたいこと★

指定したURLのページから全ての画像を取り出すコードを作成したのですが、
URLの部分を変更して

CSVにリスト化したURLを順番にスクレイピングしていきたい。
C:\python/tabelog.csv

その後はフォルダ分けもやっていけたらと思っています。

■問題■

ForでLoopすることぐらいしか分からず
どこにどう追加していいか検討もつきません。。。
ほんとにすいません。ヒントでもいただけると本当に助かります。

■参考にしているサイト■
https://hashikake.com/scraping_img#source

★使用しているコード★

Python

1#●画像ファイルをダウンロードするための準備 2# ①-①.ライブラリをインポート 3import time 4import re 5import requests 6from pathlib import Path 7from bs4 import BeautifulSoup 8# ①-②.出力フォルダを作成 9output_folder = Path('C:\python\img') 10output_folder.mkdir(exist_ok=True) 11# ①-③.スクレイピングしたいURLを設定 12url = 'https://tabelog.com/tokyo/A1303/A130302/13219514/dtlmenu/' 13 14# ①-④.画像ページのURLを格納するリストを用意 15linklist = [] 16 17#●検索結果ページから画像のリンクを取り出す 18# ②-①.検索結果ページのhtmlを取得 19html = requests.get(url).text 20# ②-②.検索結果ページのオブジェクトを作成 21soup = BeautifulSoup(html, 'lxml') 22# ②-③.画像リンクのタグをすべて取得 23a_list =soup.select('div.rstdtl-menu-lst__img') 24 25# ②-④.画像リンクを1つずつ取り出す 26for a in a_list: 27# ②-⑤.画像ページのURLを抽出 28 link_url = a.img['src'] 29# ②-⑥.画像ページのURLをリストに追加 30 linklist.append(link_url) 31 #time.sleep(1.0) 32 33 # ③-⑦.画像ファイルの名前を抽出 34 filename = re.search(".*/(.*png|.*jpg)$",link_url) 35 # ③-⑧.保存先のファイルパスを生成 36 save_path = output_folder.joinpath(filename.group(1)) 37 time.sleep(1.0) 38 # ●画像ファイルのURLからデータをダウンロード 39 try: 40 # ④-①.画像ファイルのURLからデータを取得 41 image = requests.get(link_url) 42 # ④-②.保存先のファイルパスにデータを保存 43 open(save_path, 'wb').write(image.content) 44 # ④-③.保存したファイル名を表示 45 print(save_path) 46 time.sleep(1.0) 47 except ValueError: 48 # ④-④.失敗した場合はエラー表示 49 print("ValueError!")

宜しくお願いします。

#頂いた回答を参考にもう1度コードを書いてみたのですが、次は1種類しか画像が取得できなくなりました。
エラーは出ません。
もう1度見ていただいてもよろしいでしょうか。

Python

1#●画像ファイルをダウンロードするための準備 2# ①-①.ライブラリをインポート 3import time 4import re 5import requests 6from pathlib import Path 7from bs4 import BeautifulSoup 8 9# 出力フォルダを作成 10output_folder = Path('C:\python\img') 11output_folder.mkdir(exist_ok=True) 12 13# スクレイピングしたいURLを設定 14import pandas as pd 15 16csv_file = r"C:\python\tabelog.csv" 17df = pd.read_csv(csv_file) 18# NOTE: df.列名.tolist()で指定列をリスト化する 19url_list = df.URL.tolist() 20 21# 画像ページのURLを格納するリストを用意 22linklist = [] 23 24for url in url_list: 25 # ②-①.検索結果ページのhtmlを取得 26 html = requests.get(url).text 27 # ②-②.検索結果ページのオブジェクトを作成 28 soup = BeautifulSoup(html, 'lxml') 29 # ②-③.画像リンクのタグをすべて取得 30 a_list =soup.select('div.rstdtl-menu-lst__img') 31 32 # ②-④.画像リンクを1つずつ取り出す 33 for a in a_list: 34 # ②-⑤.画像ページのURLを抽出 35 link_url = a.img['src'] 36 # ②-⑥.画像ページのURLをリストに追加 37 linklist.append(link_url) 38 time.sleep(1.0) 39 40 # ③-⑦.画像ファイルの名前を抽出 41 filename = re.search(".*/(.*png|.*jpg)$",link_url) 42 # ③-⑧.保存先のファイルパスを生成 43 save_path = output_folder.joinpath(filename.group(1)) 44 time.sleep(1.0) 45 # ●画像ファイルのURLからデータをダウンロード 46 try: 47 # ④-①.画像ファイルのURLからデータを取得 48 image = requests.get(link_url) 49 # ④-②.保存先のファイルパスにデータを保存 50 open(save_path, 'wb').write(image.content) 51 # ④-③.保存したファイル名を表示 52 print(save_path) 53 time.sleep(1.0) 54 except ValueError: 55 # ④-④.失敗した場合はエラー表示 56 print("ValueError!")

このコードの結果↓
10499
C:\python\img\150x150_square_83722393.jpg
10499
C:\python\img\150x150_square_83722393.jpg

です。何度もすいません。
宜しくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

過去の回答よりCSVは下のイメージです。

csv

1,店舗名,URL,点数 20,アンジェロ,https://tabelog.com/tokyo/A1301/A130101/13015364/,3.26 31,鳥元 虎ノ門店,https://tabelog.com/tokyo/A1308/A130802/13019433/,3.19 42,佐賀牛グリルイタリアン ドルチェヴィータ 銀座,https://tabelog.com/tokyo/A1301/A130101/13168844/,3.06 53,個室×ラクレットチーズ プラチナフィッシュ ガーデンキッチン ,https://tabelog.com/tokyo/A1301/A130103/13199175/,3.10 6 7(中略) 8 918,本格中華食べ放題 天香府 新橋本店,https://tabelog.com/tokyo/A1301/A130103/13186435/,3.22 1019,尾崎牛焼肉 銀座 ひむか,https://tabelog.com/tokyo/A1301/A130101/13193861/,3.54

csvからURLを抜き出す方法はいくつかありますが古い回答に倣いPandasを使ってみます。
上のCSVと相違点があればお手元のCSVにあわせてコードを書き換えてください。

python

1import pandas as pd 2 3csv_file = r"C:\python\tabelog.csv" 4df = pd.read_csv(csv_file) 5# NOTE: df.列名.tolist()で指定列をリスト化する 6url_list = df.URL.tolist()

url_listを抜き出せたらforにかけて1つずつURLを取り出していきます。

python

1for url in url_list: 2 html = requests.get(url).text 3 soup = BeautifulSoup(html, 'lxml') 4 (以下略)

投稿2020/03/31 14:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pythonbegginer

2020/04/01 03:49

回答ありがとうございますm(__)m皆様の回答を参考にしながら、コード修正してみたのですが、エラーは出ないのですが、画像が1種類しか取得できなくなってしまい行き詰っています。質問分に新たに追加したので、恐縮ですが見ていただけると嬉しいです。 宜しくお願いします。
pythonbegginer

2020/04/01 03:56

はい、ありがとうございます。
pythonbegginer

2020/04/01 04:16

イメージタグは取得できていました。前回教えてもらったコードで実行すると全部取得できるのですが、最後の1個だけしか取得できずです。すいません。原因が自分でわからず。。Forの中にあるからでしょうか(´;ω;`)。ぽんこつですいません。 宜しくお願いします。
退会済みユーザー

退会済みユーザー

2020/04/01 04:29

「# ●画像ファイルのURLからデータをダウンロード」の付近のインデントを確認してみましょう。Forで処理したいものはForのインデントに入れるようにします。
pythonbegginer

2020/04/01 05:12

できましたーーーーーーーーー感涙。。こんなにもインデントって大事なんですね・・あぁ嬉しいです。 涙。。。付き合ってくださり本当にありがとうございます。
guest

0

URLを順番にスクレイピングしていきたい。

まずは、変更したい変数を「関数の引数」にします。

python

1 2# モジュールのインポート等は関数の外。 3# 一度しか行わない処理はファイル先頭の方に記述 4 5def download(url): 6 # 以下に現在のコードを、適切なインデントで記述 7 8 # ①-④.画像ページのURLを格納するリストを用意 9 linklist = [] 10 11 ...

CSV 読込部分

import csv # 文字コード "utf-8" のファイルを開く。 with open("tabelog.csv", encoding="utf-8") as stream: # CSV の1行目にヘッダがあり、読み飛ばしたい場合 # next(stream) # CSV のカラムは タイトルとURL を想定 for title, url, in csv.reader(stream): # 進捗表示、今どこをダウンロード中か表示する場合 # print("download {}".format(title)) download(url)

文字コードや CSV読み込み時のオプション、
CSVの1行目にヘッダがある場合等、詳細は実際のCSVの内容に応じて変わります。

投稿2020/03/31 06:57

teamikl

総合スコア8760

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

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

pythonbegginer

2020/04/01 03:49

回答ありがとうございますm(__)m皆様の回答を参考にしながら、コード修正してみたのですが、エラーは出ないのですが、画像が1種類しか取得できなくなってしまい行き詰っています。質問分に新たに追加したので、恐縮ですが見ていただけると嬉しいです。 宜しくお願いします。
guest

0

前回のhttps://teratail.com/questions/250473の応用で、こちらで頂いていたアンサーではimg_listの中に複数入っていた画像リンクを一つずつ取り出すfor文を書きましたよね?

今度はそれを用意しているURLの個数文繰り返しループ処理していけば良いと思います。
例として

python

1#対象のURLが5個あったとする 2target_list = ['http://hoge.net/A0123/123/dlmenu', 3 'http://hoge.net/B0123/123/dlmenu', 4 'http://hoge.net/C0123/123/dlmenu', 5 'http://hoge.net/D0123/123/dlmenu'/, 6 'http://hoge.net/E0123/123/dlmenu' 7] 8 9#target_listから一つずつurlを取り出しスクレイピング 10for url in target: 11 html = requests.get(url).text 12 soup = BeautifulSoup(html, 'lxml') 13 14 img_list =soup.select('div.rstdtl-menu-lst__img img') 15 for img in img_list: 16 link_url = img['src']

繰り返し処理(for文)の中で、更に繰り返し処理を行う事で実現に近づけるかと思います。

追記

Python

1import time 2import re 3import requests 4from pathlib import Path 5from bs4 import BeautifulSoup 6from tqdm import tqdm 7 8output_folder = Path('C:\python\img') 9 10url_list = ['https://tabelog.com/tokyo/A1303/A130302/13219514/dtlmenu/', 11 'https://tabelog.com/tokyo/A1303/A130302/13212082/dtlmenu/'] 12 13for url in url_list: 14 html = requests.get(url).text 15 soup = BeautifulSoup(html, 'lxml') 16 a_list =soup.select('div.rstdtl-menu-lst__img') 17 shopname = soup.find(class_='display-name').find_next('a').text 18 19 for a in tqdm(a_list): 20 link_url = a.img['src'] 21 filename = re.search(".*/(.*png|.*jpg)$",link_url) 22 save_path = output_folder.joinpath(shopname + filename.group(1)) 23 24 try: 25 image = requests.get(link_url) 26 open(save_path, 'wb').write(image.content) 27 except ValueError: 28 print('valueerror') 29 time.sleep(2.0) 30 time.sleep(2.0)

あくまでもサンプルコードとなります。
また質問者様の追記コードではお店毎にフォルダ分け等はしていない様で、どの画像がどのお店のものであるかの区別がつかない為、ファイル名にお店の名前をつける様な形のコードと勝手にさせていただきましたが不要であれば17行目、22行目のjoinpath部を削除してください。
あとtqdmも勝手に装飾してしまいました。installしてみて試してください。

投稿2020/03/31 06:42

編集2020/04/01 05:03
nto

総合スコア1438

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

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

pythonbegginer

2020/04/01 03:49

回答ありがとうございますm(__)m皆様の回答を参考にしながら、コード修正してみたのですが、エラーは出ないのですが、画像が1種類しか取得できなくなってしまい行き詰っています。質問分に新たに追加したので、恐縮ですが見ていただけると嬉しいです。 宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問