前提
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/ツールのバージョンなど)
あなたの回答
tips
プレビュー