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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1373閲覧

Pythonのスクレイピングについて

trey_0329

総合スコア109

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/21 15:34

編集2019/03/21 15:42

現在こちらのURL(https://karadarefre.jp/Search2/_find/genre:19/)から店舗名と最寄り駅の情報をスクレイピングしようとしています。
下記、私が書いたコードですが、出力されたCSVには何も書き込まれていなく、

Python

1import csv 2import urllib 3import time 4 5from bs4 import BeautifulSoup 6 7url = 'https://karadarefre.jp/Search2/_find/genre:19/page:1' # 取得先URL 8num_pages = 1 # 取得ページ数 9request_interval = 2 # ページ取得間隔 10 11data = [] 12for i in range(0, num_pages + 1): 13 url = urllib.parse.urljoin(url, 'page:0'+str(i)) 14 print('getting page... ', url) 15 16 html = urllib.request.urlopen(url).read() 17 soup = BeautifulSoup(html, 'lxml') 18 19 for item_elems in soup.select('div.colum-right-sub-box r_rich'): 20 # 店舗の名前 21 name_elems = item_elems.select('a.link-blue shop-name') 22 name = name_elems.text 23 # 最寄り駅 24 st_elems = item_elems.select('p.shop-station-txt') 25 station_name = st_elems[0].text 26 27 data.append({ 28 'name': name, 29 "station": station_name, 30 }) 31 32with open('output333.csv', 'w', encoding='utf-8') as f: 33 # 列の出力順序を規定 34 fields = ['name',"station"] 35 36 writer = csv.DictWriter(f, fieldnames=fields, quoting=csv.QUOTE_NONNUMERIC) 37 writer.writeheader() # ヘッダー出力 38 writer.writerows(data) # データ出力 39print('complete')

selectを色々試してみましたが、どうしていいかわからず。。
<a href="/facility/175427/?hold=3r" class="link-blue shop-name">
に対して
name_elems = item_elems.select('a.link-blue shop-name')
というのが間違っているのでしょうか?

どなたかわかる方いらっしゃいましたらご教示お願い致します。

また、追加で質問ですが、
今後このサイトのページを一つずつスクレイピングする場合、
各ページのURLはhttps://karadarefre.jp/facility/87136/?hold=4
のようになり87136の数字の部分を変えていくのだと思いますが、
どのように設定すれば良いでしょうか?

このページ、数字が00001~99999まで順に表示されているわけではなく、
57136
87136
175427
など、飛び飛びになっています。
例えばhttps://karadarefre.jp/facility/170000/?hold=3r
はページが存在しません。
この場合、For Loopで数字を一つずつ足していくのは可能ですが、中にはページがないものも存在します。その場合スクレイピングされないで次の数字に飛びますが、Null値が多くなり無駄な仕事になってしまうと思います。このような場合、どのような考えでスクレイピングすればいいのか理論だけでもいいのでお教え頂いたけますと助かります。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

追加質問についてですが、記事一覧ページなどを先に見てURLをすべて拾っておいた後、それを順々に叩いて情報を抜き出すと比較的容易です。

注意

法律とサイトの規約等を破らないこと、リクエストを投げるたびに数秒程度sleepさせて過剰な負荷を与えないことはスクレイピングを行う上で最低限守るべきです(他にも必要な配慮はたくさんありますが)。

投稿2019/03/21 18:26

編集2019/03/21 18:27
hayataka2049

総合スコア30933

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

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

trey_0329

2019/03/21 19:36

たしかに、 1.記事一覧ページをスクレイプして記事一覧URLのリストを作る 2.1の情報を元にここのページをスクレイピングする とわければ全てのURLに基づいたデータが出せますね! 大変貴重なアドバイスありがとうございます。 スクレイピングのインターバルについてもしっかり気を付けます
guest

0

link-blue shop-name
に関しては、スペースをなくした
.select(link-blue.shop-name)
にすることで解決しました。

質問2つめの番号が変わることに対して、まだ解決していないので良いアイデアがありましたらご教示お願い致します。

投稿2019/03/21 17:22

trey_0329

総合スコア109

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問