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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1697閲覧

python3 / beautifulsoup / 特定サイト内スクレイピング

sadie

総合スコア18

スクレイピング

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

Python 3.x

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

0グッド

2クリップ

投稿2018/10/23 04:57

現在のコードで収集できるアドレス情報の他に「事業者名」「住所」「電話番号」「紹介文(◆で始まる文章)」もあわせて収集するようにしたく考えております
ご教授頂けると幸いです
https://itp.ne.jp/genre_dir/syaken/?ngr=1&sr=1このページにある情報を収集するつもりです

※titoiさん、ご覧頂いていると思います。個別依頼等の方がよろしければその旨ご指示ください

python3

1import time 2import csv 3import re 4import requests 5import bs4 6 7# 取得ページ分だけURLを生成して、配列に保持する。 8begin = 5 # 取得開始ページ 9end = 10 # 取得終了ページ 10base_url = 'https://itp.ne.jp/genre_dir/syaken/pg/{page_no}/' 11urls = [base_url.format(page_no=i) for i in range(begin, end)] 12print(urls) 13 14# 配列を一個づつ回して、htmlを解析して、メールアドレスだけ取得 15addrs = [] 16for url in urls: 17 print('fetching... ' + url) 18 res = requests.get(url) 19 soup = bs4.BeautifulSoup(res.text, 'html.parser') 20 for a_tag in soup.find_all('a', class_='boxedLink emailLink'): 21 match = re.search(r'[\w.-]+@[\w.-]+', a_tag['onclick']) 22 if match: 23 addrs.append([match.group(0)]) 24 25 time.sleep(1) # アクセス間隔 26print(addrs) 27 28with open('test.csv', 'w', encoding='utf8') as f: 29 writer = csv.writer(f) 30 writer.writerows(addrs)

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

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

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

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

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

guest

回答1

0

ベストアンサー

詰まったらこちらで質問するのはいいですが、まずは Beautiful Soup の勉強をして、ご自身でも試されてはどうでしょうか。

スクレイピングの手順

  1. ブラウザでサイトの情報がほしい箇所の HTML 構造がどうなっているか確認する。(Chrome ならその箇所を右クリックし、検証を選択」
  2. soup.find()、soup.find_all()、soup.select() などで該当箇所の DOM を選択する。
  3. テキストを抽出し、replace()、strip()、正規表現など使い、ゴミを取り除く。

「事業者名」「住所」「電話番号」「紹介文」「郵便番号」「メールアドレス」を抽出するサンプルコードを記載しました。

python

1import time 2import csv 3import re 4import requests 5import bs4 6 7# 取得ページ分だけURLを生成して、配列に保持する。 8begin = 5 # 取得開始ページ 9end = 10 # 取得終了ページ 10base_url = 'https://itp.ne.jp/genre_dir/syaken/pg/{page_no}/' 11urls = [base_url.format(page_no=i) for i in range(begin, end)] 12print(urls) 13 14# 配列を一個づつ回して、htmlを解析して、メールアドレスだけ取得 15info = [] 16for url in urls: 17 print('fetching... ' + url) 18 res = requests.get(url) 19 soup = bs4.BeautifulSoup(res.text, 'html.parser') 20 21 selctions = soup.select('section') 22 sections = soup.find_all('section', attrs={'class': None}) 23 for section in sections: 24 name = section.h4.a.string # 事業所名 25 link = section.h4.a['href'] # URL 26 p_tags = section.find_all('p') 27 if p_tags[0].string: # 説明は存在しない場合がある 28 desc = p_tags[0].string.strip().replace('\u3000', '') # 説明 29 else: 30 desc = None 31 addr = p_tags[1].span.next_sibling.strip() 32 postal_code = addr.split('\u3000')[0] # 郵便番号 33 addr = addr.split('\u3000')[1] # 住所 34 tel = p_tags[2].b.string # 電話番号 35 mail = p_tags[3].find('a', class_='boxedLink emailLink') # メールアドレス 36 if mail: # メールアドレスは掲載していない場合がある 37 match = re.search(r'[\w.-]+@[\w.-]+', mail['onclick']) 38 mail = match.group(0) 39 info.append({'name': name, 'description': desc, 'postal_code': postal_code, 40 'address': addr, 'tel': tel, 'mail': mail}) 41# from pprint import pprint 42# pprint(info) 43 44 time.sleep(1) # アクセス間隔 45 46with open('test.csv', 'w', encoding='utf8') as f: 47 writer = csv.DictWriter(f, fieldnames=info[0].keys()) 48 writer.writerows(info)

投稿2018/10/23 06:29

tiitoi

総合スコア21956

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

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

sadie

2018/10/29 03:05

お礼が遅れすみません CSSセレクタの種類について、とても勉強になりました その他の情報についても穴が空くほど見ているんですが難しく・・ いつもありがとうございます 学んでもっとできるようになりたいです 今後、titoiさんに個別にいろいろとビジネスとしてという建て付け含めご指導、ご教授頂きたいと考えているんですが、そのようなご提案は失礼でしょうか? ご返信お待ちしております
tiitoi

2018/10/29 03:55

> CSSセレクタの種類について、とても勉強になりました > その他の情報についても穴が空くほど見ているんですが難しく・・ Web 上の情報の他、Amazon で調べたところ、Python でのスクレイピングについて解説した書籍もいくつか出版されているので、活用されてはどうでしょうか。 一度に理解するのは難しいと思うので、お時間があるときに少しずつ勉強して、できることを増やしていけばよいと思います。 > 今後、titoiさんに個別にいろいろとビジネスとしてという建て付け含めご指導、ご教授頂きたいと考えているんですが、そのようなご提案は失礼でしょうか? 今後もこちらで質問していただければ、回答できる内容であれば回答しますよ。 「ビジネスとして」とはどういう意味でしょうか?
sadie

2018/10/29 04:44

ご返信ありがとうございます 私にお教え頂く作業自体を、クラウドソーシング等で有償依頼発注する方がよろしいでしょうか? いつもtitoiさんが完ぺきなサンプルコードと内容教示をくださるので、お礼をお伝えするだけで足りていないと考えたためです
tiitoi

2018/10/29 05:08 編集

teratail は仕事中に息抜きにやっているだけなので、有償依頼は責任が発生することと、時間がとれる保証ができないので、申し訳ないですが、難しいです。 teratail はあくまでわからないことを聞く質問サイトなので、ご自身で試してみて詰まった場合はこれまで通り teratail で聞いてよいかと思います。 依頼ということであれば、クラウドソーシングを活用されるとよいと思います。 ランサーズをちょっと見てみましたが、スクレイピングでしたら数千円~依頼できるようです。 https://www.lancers.jp/work/search?keyword=%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
sadie

2018/10/29 08:55

ありがとうございます 「実践力を身につける Pythonの教科書」早速購入しました 勉強します! 引き続きよろしくお願いいたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問