現在こちらの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値が多くなり無駄な仕事になってしまうと思います。このような場合、どのような考えでスクレイピングすればいいのか理論だけでもいいのでお教え頂いたけますと助かります。
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/21 19:36