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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

Q&A

0回答

326閲覧

ウェブスクレイピングの処理を高速化したい!

aloha_mine

総合スコア1

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

0グッド

1クリップ

投稿2022/09/26 12:33

編集2022/09/27 03:44

前提

python初心者です。ウェブスクレイピングのコードを書いてみましたが、処理速度が遅く実用的ではなく高速化したい。

実現したいこと

コードを見直して処理時間を1/10程度にしたい。

発生している問題・エラーメッセージ

エラーはないですが、初心者のため並列処理・並行処理・非同期処理など処理を速くするためのコードが理解できない。できればご教示いただき今後の勉強としたいです。

該当のソースコード

python

1import csv 2from bs4 import BeautifulSoup 3import requests 4import time 5 6# 抽出開始したい日付 7ymd = 20220925 8 9# 時間測定 10time_sta = time.time() 11 12# CSV作成およびヘッダー作成 13filename = "beforeinfo.csv" 14with open(filename, 'w', newline="") as f: 15 fieldnames = ["日付","場","レース","1号艇チルト","2号艇チルト","3号艇チルト","4号艇チルト","5号艇チルト","6号艇チルト"] 16 writer = csv.DictWriter(f, fieldnames=fieldnames) 17 writer.writeheader() 18# 抽出したい日付まで設定 #開催した場のコード抽出 19 while (ymd < 20220926): 20 url1 = f'https://www.boatrace.jp/owpc/pc/race/pay?hd={ymd}' 21 r = requests.get(url1) 22 r.encoding = r.apparent_encoding 23 soup = BeautifulSoup(r.text, 'html.parser') 24 elms = soup.select('.table1_areaName > img[alt]') 25 arr2 = [e['alt'] for e in elms] 26 arr3 = [arr4.replace('桐生','01').replace('戸田','02').replace('江戸川','03').replace('平和島','04'). 27 replace('多摩川','05').replace('浜名湖','06').replace('蒲郡','07').replace('常滑','08').replace 28 ('唐津','23').replace('三国','10').replace('びわこ','11').replace('住之江','12').replace('尼崎','13') 29 .replace('鳴門','14').replace('丸亀','15').replace('児島','16').replace('宮島','17').replace('徳山','18') 30 .replace('下関','19').replace('若松','20').replace('芦屋','21').replace('福岡','22').replace('津','09'). 31 replace('大村','24')for arr4 in arr2] 32# 開催場の12Rまでチルト角度を抽出、CSVへ出力 [] '' はCSVの置き換えで消す 33 for jcd in arr3: 34 for race_no in range(1,13): 35 url2 = f'https://www.boatrace.jp/owpc/pc/race/beforeinfo?rno={race_no}&jcd={jcd}&hd={ymd}' 36 soup = BeautifulSoup(requests.get(url2).text, 'html.parser',from_encoding="utf-8") 37 arr1 = [tag('td')[5].text 38 for tag in soup(class_='is-fs12')] 39 row = {"日付": ymd, "場": jcd,"レース":race_no,"1号艇チルト":arr1} 40 writer.writerow(row) 41 else: ymd = ymd + 1 42 43 else:print("終了しました") 44 45# 時間計測終了 46time_end = time.time() 47# 経過時間(秒) 48tim = time_end- time_sta 49# 経過時間(秒)出力 50print(tim)コード

試したこと

最初は24場12レースすべてのURLを取得してスクレイピングしていましたが、開催場の情報をはじめに取得することで、多少処理時間を削減できました。約870秒⇒約540秒になりました。
追記 "html.parser"を"lxml"に変更する事で約480秒になりました。これ以上は厳しいでしょうか…

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

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

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

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

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

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

meg_

2022/09/26 13:36

> 並列処理・並行処理・非同期処理など処理を速くするため スクレイピングにおいて処理速度を早くしたい場合、対象サイトへのアクセス頻度が高くなるかと思います。それは対象サイトに負荷をかける行為なのでNGです。取得したテキストを解析する時間をコードの工夫で速くするのは問題ありません。寧ろ対象サイトへのアクセスについて待機時間を設定することが一般的かと思います。
aloha_mine

2022/09/26 14:16

なるほど、解析の時間を工夫するよう色々調べてみます。また、サイトへのアクセスは待機時間1秒程度確保するように書きかえます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問