<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>スクレイピング</title>
	<atom:link href="https://javeo.jp/tag/%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Sun, 29 Mar 2026 15:11:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2025/08/cropped-ExcelPython_future-32x32.jpg</url>
	<title>スクレイピング</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>汎用AIと一緒に競馬予想AI作ってnote投稿まで自動化する #2-スクレイピング</title>
		<link>https://javeo.jp/keiba-ai-challenge-02/</link>
					<comments>https://javeo.jp/keiba-ai-challenge-02/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 29 Mar 2026 10:21:36 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[netkeiba]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[競馬]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3908</guid>

					<description><![CDATA[目次 まずはデータがないと分析できないJRA-VAN データラボからのデータ取得netkeibaからのスクレイピングちょっとした注意点スクレイピングについて取得したデータはデータベースへ保存データは小分けに取得並列処理は [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box info-box">
<p>2026年初頭AIの進歩が凄まじく、AIを使った何かをやってみたいと競馬予想AIを作ってみましたのでその取り組みをまとめてみました</p>



<p>ついでにその過程で作ったスクレイピングとnoteへの自動投稿も一緒にまとめますので興味のある方は覗いてみてください</p>



<p>今回は第二回でデータ収集についてまとめています</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">まずはデータがないと分析できない</a><ol><li><a href="#toc2" tabindex="0">JRA-VAN データラボからのデータ取得</a></li><li><a href="#toc3" tabindex="0">netkeibaからのスクレイピング</a><ol><li><a href="#toc4" tabindex="0">ちょっとした注意点</a></li></ol></li></ol></li><li><a href="#toc5" tabindex="0">スクレイピングについて</a><ol><li><a href="#toc6" tabindex="0">取得したデータはデータベースへ保存</a></li><li><a href="#toc7" tabindex="0">データは小分けに取得</a></li><li><a href="#toc8" tabindex="0">並列処理はしない</a></li></ol></li><li><a href="#toc9" tabindex="0">次回について</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">まずはデータがないと分析できない</span></h2>



<p>AI含め、分析するならデータを手元に持たないと話にならないので過去データの収集から始めます</p>



<p>選択肢としては有料でもいいから正攻法ならJRA-VAN データラボからのデータ取得、無料だけど節度を持ってゆっくりデータを取得するならnetkeibaからのスクレイピングの2つを検討しました</p>



<h3 class="wp-block-heading"><span id="toc2">JRA-VAN データラボからのデータ取得</span></h3>



<p>JRA公式データを使うならデータラボ1択</p>



<p><strong>2,090</strong>円/月（初月無料）で利用できてJRA関連会社が運営する公式ツールです</p>




<a rel="noopener noreferrer" target="_blank" href="https://jra-van.jp/dlb/feature.html" title="JRA-VAN" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img fetchpriority="high" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fjra-van.jp%2Fdlb%2Ffeature.html?w=320&#038;h=198" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">JRA-VAN</div><div class="blogcard-snippet external-blogcard-snippet">プロも愛用の競馬ソフトから意外な穴場的中ソフトまで、データ競...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://jra-van.jp/dlb/feature.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">jra-van.jp</div></div></div></div></a>



<p>調査も含めて契約してみたのですが、基本はJV-Linkを組み込んだ独自アプリ開発キットのような印象でした</p>



<p>問題は対象言語サポートが2026年3月現在残念でVB系しか対象になっておらず、ちょっと厳しい印象なのは否めません</p>



<p>ネットを見ているとサポート関係なく他の言語で作成している人もいるみたいですが、コミュニティが使えないなど有料の強みがなくなってしまうので今回は諦め</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">サポート対象言語</span></div><div class="tab-caption-box-content block-box-content box-content">
<ul class="wp-block-list">
<li>Microsoft Visual Basic 2015</li>



<li>Microsoft Visual C++ 2015</li>



<li>Borland Delphi 7</li>



<li>Microsoft Access 2013/2016</li>



<li>Microsoft Excel 2013/2016</li>
</ul>




<a rel="noopener noreferrer" target="_blank" href="https://support.jra-van.jp/jravan/detail?site=SVKNEGBV&#038;category=16&#038;id=209" title="FAQ&#35443;&#32048; -&#12469;&#12509;&#12540;&#12488;&#12375;&#12390;&#12356;&#12427;&#38283;&#30330;&#29872;&#22659;&#12395;&#12399;&#12393;&#12398;&#12424;&#12358;&#12394;&#12418;&#12398;&#12364;&#12354;&#12426;&#12414;&#12377;&#12363;&#65311; | JRA-VAN&#12504;&#12523;&#12503;&#12475;&#12531;&#12479;&#12540;" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fsupport.jra-van.jp%2Fjravan%2Fdetail%3Fsite%3DSVKNEGBV%26category%3D16%26id%3D209?w=320&#038;h=198" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">FAQ&#35443;&#32048; -&#12469;&#12509;&#12540;&#12488;&#12375;&#12390;&#12356;&#12427;&#38283;&#30330;&#29872;&#22659;&#12395;&#12399;&#12393;&#12398;&#12424;&#12358;&#12394;&#12418;&#12398;&#12364;&#12354;&#12426;&#12414;&#12377;&#12363;&#65311; | JRA-VAN&#12504;&#12523;&#12503;&#12475;&#12531;&#12479;&#12540;</div><div class="blogcard-snippet external-blogcard-snippet">【JRA公式データ】JRA-VANは競馬予想に役立つ情報を提...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://support.jra-van.jp/jravan/detail?site=SVKNEGBV&#038;category=16&#038;id=209" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">support.jra-van.jp</div></div></div></div></a>
</div></div>



<p>ちなみに・・有志が作ったアプリも使えるらしく、不動の1位な<strong><span class="bold-red">TARGET</span></strong>や税金問題で界隈を賑わせた卍氏が使っていたといわれる<span class="bold-blue"><span class="bold-red">馬王Z</span></span>も追加料金なしで使えるようなのでゼロベースからの分析とかじゃないなら十分有力な選択肢になりそうです</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box has-border-color not-nested-style cocoon-block-tab-caption-box" style="--cocoon-custom-border-color:#de2568"><div class="tab-caption-box-label block-box-label box-label fab-amazon"><span class="tab-caption-box-label-text block-box-label-text box-label-text">卍氏の書籍紹介</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">

<a rel="noopener noreferrer" target="_blank" href="https://amzn.to/4sy3Kd8" title="1&#20740;5000&#19975;&#20870;&#31292;&#12356;&#12384;&#39340;&#21048;&#35009;&#21028;&#30007;&#12364;&#26126;&#12363;&#12377; &#31478;&#39340;&#12398;&#21213;&#12385;&#26041; (&#31478;&#39340;&#29579;&#39340;&#21048;&#25915;&#30053;&#26412;&#12471;&#12522;&#12540;&#12474;) | &#21325; |&#26412; | &#36890;&#36009; | Amazon" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F4sy3Kd8?w=320&#038;h=198" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">1&#20740;5000&#19975;&#20870;&#31292;&#12356;&#12384;&#39340;&#21048;&#35009;&#21028;&#30007;&#12364;&#26126;&#12363;&#12377; &#31478;&#39340;&#12398;&#21213;&#12385;&#26041; (&#31478;&#39340;&#29579;&#39340;&#21048;&#25915;&#30053;&#26412;&#12471;&#12522;&#12540;&#12474;) | &#21325; |&#26412; | &#36890;&#36009; | Amazon</div><div class="blogcard-snippet external-blogcard-snippet">Amazonで卍の1億5000万円稼いだ馬券裁判男が明かす ...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://amzn.to/4sy3Kd8" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">amzn.to</div></div></div></div></a>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="border-top-left-radius:1px;border-top-right-radius:1px;border-bottom-left-radius:1px;border-bottom-right-radius:1px;padding-right:3px;padding-left:3px;flex-basis:66.66%">
<p>2007-2009年の3年間で、1億円以上の価値を得た卍氏の書籍はコチラ</p>



<p>「馬券の勝ち方」を論理的かつ丁寧に解説されてます！</p>
</div>
</div>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">netkeibaからのスクレイピング</span></h3>



<p>結論から言うと今回採用したのはこちら</p>



<p>スクレイピングとはインターネット上の情報をプログラムで収集する手法で、サーバーに負荷をかけてしまうなどあまり推奨される手法ではありませんが、netkeibaは禁止していないようなのと情報として十分すぎる量があり、長く使うなら正直無料はありがたいです</p>



<p>参考までにnetkeibaがスクレイピングを禁止していないと判断した材料はこちら</p>



<ul class="wp-block-list has-watery-yellow-background-color has-background is-style-icon-list-check has-list-style">
<li>robots.txtがない
<ul class="wp-block-list">
<li>禁止している場合はここに記載されていることが多いです</li>
</ul>
</li>



<li>利用規約で禁止していない
<ul class="wp-block-list">
<li>厳密には<a rel="noreferrer noopener nofollow" target="_blank" href="https://support.keiba.netkeiba.com/hc/ja/articles/39720493823129">制限をかける場合があると記載</a>されていますが、過剰アクセスの場合と判断しました</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading"><span id="toc4">ちょっとした注意点</span></h4>



<p>公式データではないからなのか、netkeibaのデータで注意点として極稀に謎のデータが存在します</p>



<p>例えば2014/2/10の東京3Rの結果ページなんですが、明らかに単勝オッズがおかしくなっています</p>




<a rel="noopener noreferrer" target="_blank" href="https://race.netkeiba.com/race/result.html?race_id=201405010303" title="３歳新馬 結果・払戻 | 2014年2月10日 東京3R レース情報(JRA) - netkeiba" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://javeo.jp/wp-content/uploads/cocoon-resources/blog-card-cache/9e827d934d345fd5865c02aedd117131.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">３歳新馬 結果・払戻 | 2014年2月10日 東京3R レース情報(JRA) - netkeiba</div><div class="blogcard-snippet external-blogcard-snippet">2014年2月10日 東京3R ３歳新馬の結果・払戻です。J...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://race.netkeiba.com/race/result.html?race_id=201405010303" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">race.netkeiba.com</div></div></div></div></a>



<p>出馬表データの単勝オッズは正しいのでカバーはできますし、発生頻度は激低なのでご愛敬で</p>



<h2 class="wp-block-heading"><span id="toc5">スクレイピングについて</span></h2>



<p>具体的なコードは別で紹介しようと思いますが、ここでは方針的なことだけまとめます</p>



<p>※近いうちに<a rel="noreferrer noopener" target="_blank" href="https://note.com/javeo2022" data-type="link" data-id="https://note.com/javeo2022">note</a>でまとめるつもりなので完了したらこの記事でもお知らせします</p>



<h3 class="wp-block-heading"><span id="toc6">取得したデータはデータベースへ保存</span></h3>



<p>ネットを見ているとプログラムを実行する度にスクレイピングするような記事を見かけますが、再利用やちょっとした加工の可能性も考えるとデータベースに保管することを推奨です</p>



<p>参考までに私はこのブログサイトのために<a rel="nofollow noopener noreferrer" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=2ZTU22+94NC8Y+CO4+609HU">エックスサーバー</a><img decoding="async" border="0" width="1" height="1" src="https://www19.a8.net/0.gif?a8mat=2ZTU22+94NC8Y+CO4+609HU" alt="">を契約しているので、専用のデータベースを作成して取得した2008年以降のレース結果を保存しています</p>



<h3 class="wp-block-heading"><span id="toc7">データは小分けに取得</span></h3>



<p>データベースを使う利点の一つとも言える、取得情報をもとに次の情報を取得が個人的推奨方法</p>



<p>スクレイピングに置いて通信問題などで収集途中で原因不明かつ対策不可能なエラーが発生することは比較的多く、全てにエラーハンドリングを仕込むことはあまり現実的ではないので順番に収集します</p>



<ul class="wp-block-list is-style-blank-box-orange has-border">
<li>まずはリスト取得
<ol class="wp-block-list">
<li>開催スケジュール取得</li>



<li>開催レース取得</li>
</ol>
</li>



<li>次にデータベースと照合しながら未取得情報を収集
<ol class="wp-block-list">
<li>レース詳細取得</li>



<li>騎手マスタ取得</li>



<li>調教師マスタ取得</li>



<li>馬主マスタ取得</li>



<li>競走馬マスタ取得</li>
</ol>
</li>



<li>最後に競走馬マスタを再起処理して血統情報収集</li>
</ul>



<p>SQLの作り方次第ではありますが、これでエラーが発生しても途中再開が簡単にできるようになります</p>



<h3 class="wp-block-heading"><span id="toc8">並列処理はしない</span></h3>



<p>前述の通り利用規約では</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>スクレイピングによって多数のリクエスト（アクセス）を確認し、弊社サービスに対して支障があると判断した場合は、予告なく通信制限をかけさせていただくことがございます。</p>
</blockquote>



<p>と記載されていますので逐次処理で適切に待機時間を入れながら実行することで&#8221;<span class="marker-under"><strong>多数のリクエスト</strong></span>&#8220;を回避することで許容してもらいます</p>



<p>早く情報を収集したい気持ちで並列処理をするとアクセスブロックをされて結果余計に時間がかかる、最悪取得できなくなる可能性もあるので節度を持った処理をしましょう</p>



<h2 class="wp-block-heading"><span id="toc9">次回について</span></h2>



<p>なかなか満足できるAIができないので次回はnoteへの自動投稿をまとめる予定です</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/keiba-ai-challenge-02/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>汎用AIと一緒に競馬予想AI作ってnote投稿まで自動化する #1-はじめに</title>
		<link>https://javeo.jp/keiba-ai-challenge-01/</link>
					<comments>https://javeo.jp/keiba-ai-challenge-01/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 15:27:25 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[netkeiba]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[競馬]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3838</guid>

					<description><![CDATA[目次 とにかくAIを使って何か作りたい！相棒となるAIは「Claude」を採用予想するだけじゃない！完全自動化のワークフローを構築このシリーズの全体構成（今後の予定）今時点の状況 とにかくAIを使って何か作りたい！ 最近 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box info-box">
<p>2026年初頭AIの進歩が凄まじく、AIを使った何かをやってみたいと競馬予想AIを作ってみましたのでその取り組みをまとめてみました</p>



<p>ついでにその過程で作ったスクレイピングとnoteへの自動投稿も一緒にまとめますので興味のある方は覗いてみてください</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">とにかくAIを使って何か作りたい！</a></li><li><a href="#toc2" tabindex="0">相棒となるAIは「Claude」を採用</a></li><li><a href="#toc3" tabindex="0">予想するだけじゃない！完全自動化のワークフローを構築</a></li><li><a href="#toc4" tabindex="0">このシリーズの全体構成（今後の予定）</a></li><li><a href="#toc5" tabindex="0">今時点の状況</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">とにかくAIを使って何か作りたい！</span></h2>



<p>最近AI使えば何でもできるがどんどん現実味を帯びてきている中、皆さんどうやってAIと付き合っていますか？</p>



<p>SNSを見るとパッと見本物と区別のつかない動画や画像の生成、ブログやnoteの作成・投稿などの自動化、希望だけ伝えると勝手にプログラムを作ってくれるバイブコーディングなどなど</p>



<p>ネット上ではまさに日進月歩のAIなんですが、私の職場では情報漏洩の危険などからなかなかAIに触れる機会がなくこのままでは世間に置いて行かれるかもと思い、まずは触ってみようが今回のスタートです</p>



<p>タイトルの通り本命は<span class="marker-under"><span class="bold-red">競馬予想AI</span></span>なんですが、せっかくなので機械学習に必要なデータを取得するための<span class="bold"><span class="marker-under">スクレイピング</span></span>とマネタイズ用に<strong><span class="marker-under">note自動投稿</span></strong>へのチャレンジもまとめていきます</p>



<h2 class="wp-block-heading"><span id="toc2">相棒となるAIは「Claude」を採用</span></h2>



<p>今回一緒に開発を進めるAIパートナーとして選ばれたのは「<span class="bold-red"><span class="marker-under">Claude（クロード）</span></span>」でした</p>



<p>当初「Google AI Studio」を使っていたのですが、ちょうどClaudeがOpus4.6が凄い！と話題になった時期で、職場で唯一使えるCopilotでもClaudeが使えるとかMicrosoft365との連携もできるとかなんだとか今後もお付き合いする機会ができそうだったのでたまたま使い始めた時期でした</p>



<p>汎用AIの優劣はネットでも様々議論されていますが、今の情勢と一カ月後の情勢はきっと違うので好みで使えばいいと思います</p>



<p>参考までに「Google AI Studio」は無料枠で今でも使っていて、「Claude」はOpus使いたかったのでProプランの課金ユーザーです</p>



<h2 class="wp-block-heading"><span id="toc3">予想するだけじゃない！完全自動化のワークフローを構築</span></h2>



<p>始める前に結末はなんとなく想像していて、効果が出ても「回収率300%！！」とかは到底無理で現実的には110％前後で大成功なんじゃないかと思って始めています</p>



<p>その分他の分野にも手を出して成功体験にしようとしているしているのかスクレイピングとnote自動投稿ってわけです</p>



<p>最悪競馬AIの精度が満足いくところまでいかなくても毎週全自動で</p>



<p class="has-text-align-center has-watery-yellow-background-color has-background is-style-border-double has-border"><strong>スクレイピング　→　競馬AIで予想　→　予想結果をnoteに投稿</strong></p>



<p>のワークフローだけでも財産になるし、何かに流用できると思ってます</p>



<h2 class="wp-block-heading"><span id="toc4">このシリーズの全体構成（今後の予定）</span></h2>



<p>このシリーズでは数回に分けて需要ありそうな部分にフォーカスして記事作成を予定しています</p>



<p>今時点では4回に分けて下記順番で作るつもり</p>



<ol class="wp-block-list has-watery-blue-background-color has-background">
<li>過去データの収集
<ol class="wp-block-list">
<li>netkeibaからのスクレイピング</li>



<li>JRA-VAN Data Lab.からの収集　←これは断念</li>
</ol>
</li>



<li>AIを使った競馬AIの作成</li>



<li>AIを使った予想</li>



<li>予想のアウトプットでnote記事の自動作成と販売</li>
</ol>



<p>作っていきながらボリューミーなったら2回に分けるとか追加機能ができたら分けるとかあるかもしれないので構成変更はご了承を</p>



<h2 class="wp-block-heading"><span id="toc5">今時点の状況</span></h2>



<p>今時点ではAI未完成でスクレイピングは完成とnote投稿8割くらいです</p>



<p>スクレイピングは何段階かあるのと過去レース取得と毎週の自動取得が別物なので分けるかもって感じです</p>



<p>あまり間延びしないように作っていくので追いかけてもらえると嬉しいです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/keiba-ai-challenge-01/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>お手軽なプロキシサービス「jpProxy」を使ってみる</title>
		<link>https://javeo.jp/jpproxy-guide/</link>
					<comments>https://javeo.jp/jpproxy-guide/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sat, 08 Nov 2025 17:27:09 +0000</pubDate>
				<category><![CDATA[雑記・その他]]></category>
		<category><![CDATA[jpProxy]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[プロキシ]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3721</guid>

					<description><![CDATA[目次 プロキシサーバーとは？jpProxyについてjpProxyの主な利用シーンクローリング時のアクセス回数制限を回避したい複数のアカウントを持ちたい海外から国内のサイトにアクセスしたい無料だと不安jpProxyの設定・ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>RPA・スクレイピングをしているとIPアドレス変えたいなと思うことありませんか？</p>



<p>理由や目的は様々ですがプロキシサーバを使うことで本来のIPアドレスを隠してブラウザ操作することが可能になります</p>



<p>プロキシサーバー中で「jpProxy」についてご紹介します</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">プロキシサーバーとは？</a></li><li><a href="#toc2" tabindex="0">jpProxyについて</a></li><li><a href="#toc3" tabindex="0">jpProxyの主な利用シーン</a><ol><li><a href="#toc4" tabindex="0">クローリング時のアクセス回数制限を回避したい</a></li><li><a href="#toc5" tabindex="0">複数のアカウントを持ちたい</a></li><li><a href="#toc6" tabindex="0">海外から国内のサイトにアクセスしたい</a></li><li><a href="#toc7" tabindex="0">無料だと不安</a></li></ol></li><li><a href="#toc8" tabindex="0">jpProxyの設定・使い方</a><ol><li><a href="#toc9" tabindex="0">契約プロキシ一覧</a></li><li><a href="#toc10" tabindex="0">接続元IP登録</a></li><li><a href="#toc11" tabindex="0">ユーザID・パス確認</a></li></ol></li><li><a href="#toc12" tabindex="0">プロキシサーバー経由でインターネットアクセスする方法</a></li><li><a href="#toc13" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">プロキシサーバーとは？</span></h2>



<p>プロキシサーバーはインターネットへの接続を中継してくれるサービスで、WEBサイトから見ればプロキシサーバーがアクセスしていることになるので結果としてIPアドレスが秘匿されることになります</p>



<p>絵にすると↓の通りパソコンとインターネットの間にプロキシサーバーがいる状態になります</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1.jpg"><img decoding="async" width="1024" height="576" src="https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1-1024x576.jpg" alt="" class="wp-image-3727" srcset="https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1-1024x576.jpg 1024w, https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1-300x169.jpg 300w, https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1-150x84.jpg 150w, https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1-768x432.jpg 768w, https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1-1536x864.jpg 1536w, https://javeo.jp/wp-content/uploads/2025/11/プロキシサーバー-1.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>プロキシサーバーは無料もあれば有料もあり、優良なものもあれば粗悪なものあるということで実際に私が利用しているサービスの一つ「<a rel="noreferrer noopener" target="_blank" href="https://jpproxy.com/">jpProxy</a><span class="marker-under"><strong><img decoding="async" border="0" width="1" height="1" src="https://www15.a8.net/0.gif?a8mat=45GC5K+2HB32A+3YFI+674EQ" alt=""></strong></span>」についてまとめてみます</p>



<h2 class="wp-block-heading"><span id="toc2">jpProxyについて</span></h2>



<p>まず一番大事なことからお伝えするとjpProxyは<span class="marker-under"><strong>有料サービス</strong></span>です</p>



<p>ですが、<span class="marker-under"><span class="bold-red">構築費（初回にかかる費用）200円、月額295円</span></span>と非常にお安く利用できるサービスなので気になるほどではないかと（※費用は2025年11月現在）</p>



<p>また、特徴として日本国内のプロキシサーバー（≒IPアドレス）なのでWEBサイトにも国内からアクセスすることになります</p>



<h2 class="wp-block-heading"><span id="toc3">jpProxyの主な利用シーン</span></h2>



<p>jpProxyのトップページにもありますがjpProxyはこのような方に使われています</p>



<ul class="wp-block-list has-watery-yellow-background-color has-background is-style-icon-list-check has-list-style">
<li><strong>クローリング時のアクセス回数制限の回避</strong></li>



<li><strong>複数アカウントを使いたい</strong></li>



<li><strong>IPアドレスを秘匿したい</strong></li>



<li><strong>海外から国内のサイトにアクセスしたい</strong></li>
</ul>



<h3 class="wp-block-heading"><span id="toc4">クローリング時のアクセス回数制限を回避したい</span></h3>



<p>AmazonやGoogleなどのほとんどのサイトサーバーでは単位時間内のアクセス回数に制限を設けています</p>



<p>アクセス元のIPアドレスからのアクセス回数をカウントし、その回数が一定の基準を超えるとアクセスを制限するので、IPアドレスを分散させることで制限を回避することが可能です<br><br>また、この場合も日本のサイトをクローリングするなら日本国内のプロキシIPアドレスが最適です</p>



<h3 class="wp-block-heading"><span id="toc5">複数のアカウントを持ちたい</span></h3>



<p>サイト利用時に複数のアカウントを持ちたい場合がありますが、その場合にIPアドレスで同一ユーザであることを判定されます</p>



<p>判定されるとアカウントを作れなかったりアクセスに不都合が生じる場合があります<br><br>jpProxyのIPアドレスを使えばIPアドレスによる同一ユーザ判定を回避できるようになります<br>また、この場合も日本のサイトで複数アカウントを利用するなら日本国内のプロキシIPアドレスが最適です<br></p>



<h3 class="wp-block-heading"><span id="toc6">海外から国内のサイトにアクセスしたい</span></h3>



<p>最近ではIPアドレスでアクセス元の国を判断するサイトが増えています<br>アクセス元のIPアドレスが日本でない場合、接続を拒否するサイトがあります</p>



<p>jpProxyのIPアドレスは<strong>日本国内の固定IPアドレス</strong>ですので安心です</p>



<h3 class="wp-block-heading"><span id="toc7">無料だと不安</span></h3>



<p>無料のプロキシは公開されているので、トラフィック量が異常なほど多いです<br>そのため、接続できなかったり、遅かったりと使い物にならないものがほとんです</p>



<p>また、無料のプロキシはセキュリティの面でもおすすめできません</p>



<p>動画の閲覧には安定したネットワークが必要となりますので、多人数が同時に接続するプロキシは動画の閲覧には不向きです</p>



<p>jpProxyは通信内容をロギングおよび閲覧していません</p>



<h2 class="wp-block-heading"><span id="toc8">jpProxyの設定・使い方</span></h2>



<p>基本的にボタンポチポチしかすることはないんですが、簡単に設定方法や使い方のご紹介です</p>



<h3 class="wp-block-heading"><span id="toc9">契約プロキシ一覧</span></h3>



<p>今契約しているプロキシサーバーの情報を見ることができます</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1.png"><img decoding="async" width="1024" height="537" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1-1024x537.png" alt="" class="wp-image-3731" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1-1024x537.png 1024w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1-300x157.png 300w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_46-1.png 1437w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc10">接続元IP登録</span></h3>



<p>プロキシサーバーに接続するIPアドレスを登録できます</p>



<p>サーバーへのアクセス方法はBasic認証かこのページでホワイトリストとして登録することで利用できるようになります</p>



<p>登録するために必要な自分のIPアドレスは画面中央に表示されれている（黄塗り箇所）のでコピペで大丈夫な親切設計</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2.png"><img decoding="async" width="1024" height="537" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2-1024x537.png" alt="" class="wp-image-3734" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2-1024x537.png 1024w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2-300x157.png 300w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_51-2.png 1439w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc11">ユーザID・パス確認</span></h3>



<p>こちらがBasic認証するときに必要なユーザIDとパスワードを確認できる画面</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57.png"><img decoding="async" width="1024" height="537" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57-1024x537.png" alt="" class="wp-image-3733" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57-1024x537.png 1024w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57-300x157.png 300w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_01h00_57.png 1439w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Basic認証とはなんぞや、って方に簡単な説明すると画面上部に表示されるユーザー名とパスワードを入力するフォームでの認証</p>



<p>このフォームにユーザID・パスを入力することでプロキシサーバーに接続できます</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1.png"><img decoding="async" width="1024" height="537" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1-1024x537.png" alt="" class="wp-image-3738" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1-1024x537.png 1024w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1-300x157.png 300w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h03_00-1.png 1198w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading"><span id="toc12">プロキシサーバー経由でインターネットアクセスする方法</span></h2>



<p>ネットワーク設定周りを変更するのが正攻法であるものの、起動オプションでプロキシを指定してあげる方法がおそらく一番簡単かつ影響が少ないはず</p>



<p>まずはChromeをプロキシサーバ経由の通信でする起動オプション込みのコマンドがコチラ</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-plain"><code>&quot;C:\Program Files\Google\Chrome\Application\chrome.exe&quot; --proxy-server=&quot;http://{IPアドレス}:{ポート}&quot;</code></pre></div>



<p>Windwos+Rのファイル名を指定して実行、Chromeのショートカットプロパテのリンク先、タスクバーの検索ウィンドウなどでコマンドを使うとプロキシ接続した状態でChromeを利用できます</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%">
<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h14_30.png"><img decoding="async" width="399" height="206" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h14_30.png" alt="" class="wp-image-3740" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h14_30.png 399w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h14_30-300x155.png 300w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h14_30-150x77.png 150w" sizes="(max-width: 399px) 100vw, 399px" /></a></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%">
<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h12_18.png"><img decoding="async" width="470" height="580" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h12_18.png" alt="" class="wp-image-3739" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h12_18.png 470w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h12_18-243x300.png 243w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h12_18-122x150.png 122w" sizes="(max-width: 470px) 100vw, 470px" /></a></figure>
</div>
</div>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20.png"><img decoding="async" width="1024" height="768" src="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20-1024x768.png" alt="" class="wp-image-3741" srcset="https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20-1024x768.png 1024w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20-300x225.png 300w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20-150x113.png 150w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20-768x576.png 768w, https://javeo.jp/wp-content/uploads/2025/11/2025-11-09_02h17_20.png 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading"><span id="toc13">まとめ</span></h2>



<p>個人的にはスクレイピングするときによく使う<a rel="noreferrer noopener nofollow" target="_blank" href="https://jpproxy.com/">jpProxy</a> <img decoding="async" border="0" width="1" height="1" src="https://www11.a8.net/0.gif?a8mat=45GC5K+2HB32A+3YFI+674EQ" alt="">のご紹介でした</p>



<p>使い方としてはVPNサービスと大差はありませんがPython+Seleniumのスクレイピングプログラムでも簡単に利用できて何気に重宝しますし、お安いサービスなのでおススメです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/jpproxy-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【VBA】VBAでもWebDriverWaitを使いたい</title>
		<link>https://javeo.jp/vba-webdriverwait/</link>
					<comments>https://javeo.jp/vba-webdriverwait/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 07 Sep 2025 14:44:23 +0000</pubDate>
				<category><![CDATA[VBA・Excel]]></category>
		<category><![CDATA[EXCEL]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SeleniumBasic]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3569</guid>

					<description><![CDATA[目次 待機処理が必要な理由WebDriverWaitクラスでできることVBA版WebDriverWaitの実装例使い方サンプルまとめ 待機処理が必要な理由 SeleniumでWebサイトを操作するときにありがちな内容がこ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>PythonでSeleniumを利用するときに利用必須ともいえるWebDriverWaitとexpected_conditionsですが、残念ながらVBAにはありません</p>



<p>この記事では、<strong>VBAでWebDriverWait</strong>+expected_conditions<strong>を再現するクラス</strong>を作り、有用な待機処理を実現します</p>



<p>※Pythonの場合はこちらをどうぞ</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-excel-python wp-block-embed-excel-python"><div class="wp-block-embed__wrapper">

<a rel="noopener follow noreferrer" target="_blank" href="https://javeo.jp/python_wait/" title="【Python】Seleniumの待機処理はWebDriverWaitを使おう" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="198" src="https://javeo.jp/wp-content/uploads/2023/07/python-320x198.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://javeo.jp/wp-content/uploads/2023/07/python-320x198.png 320w, https://javeo.jp/wp-content/uploads/2023/07/python-240x148.png 240w, https://javeo.jp/wp-content/uploads/2023/07/python-640x396.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Python】Seleniumの待機処理はWebDriverWaitを使おう</div><div class="blogcard-snippet internal-blogcard-snippet">PythonのSeleniumには条件を満たすまで待機する便利なWebDriverWaitがあります。ですが実質的に重要なのはexpected_conditionsの方でこちらの詳細をまとめてみました。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://javeo.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">javeo.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.09.22</div></div></div></div></a>
</div></figure>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">待機処理が必要な理由</a></li><li><a href="#toc2" tabindex="0">WebDriverWaitクラスでできること</a></li><li><a href="#toc3" tabindex="0">VBA版WebDriverWaitの実装例</a></li><li><a href="#toc4" tabindex="0">使い方サンプル</a></li><li><a href="#toc5" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">待機処理が必要な理由</span></h2>



<p>SeleniumでWebサイトを操作するときにありがちな内容がこちら</p>



<ul class="wp-block-list">
<li>ページロードが完了していないうちに要素を取得してエラー</li>



<li>JavaScriptで動的に生成されるボタンや入力欄がまだ非表示</li>



<li>ボタンが表示されてもクリック可能になる前に操作しようとしてエラー</li>
</ul>



<p>これらを解決するには「要素が存在する・表示される・有効になる」まで待機処理が必要です</p>



<h2 class="wp-block-heading"><span id="toc2">WebDriverWaitクラスでできること</span></h2>



<p>今回作ったVBAクラス <code>WebDriverWait</code> は、PythonのWebDriverWaitに近い操作性で以下の条件を待機できます</p>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>メソッド</th><th>説明</th></tr></thead><tbody><tr><td><code>UntilPresence(By)</code></td><td>DOM上に指定した <code>By</code> が存在するまで待機</td></tr><tr><td><code>UntilVisibleLocated(By)</code></td><td>画面上に <code>By</code> で指定した要素が表示されるまで待機 (<code>IsDisplayed</code>)</td></tr><tr><td><code>UntilVisible(element)</code></td><td>指定した <code>WebElement</code> が表示されるまで待機</td></tr><tr><td><code>UntilEnableLocated(By)</code></td><td>画面上に <code>By</code> で指定した要素が利用可能になるまで待機 (<code>IsDisplayed &amp; IsEnabled</code>)</td></tr><tr><td><code>UntilEnable(element)</code></td><td>指定した <code>WebElement</code> が利用可能になるまで待機</td></tr></tbody></table></div></figure>



<p>ポイント：</p>



<ul class="wp-block-list">
<li>成功時は <code>WebElement</code> を返す</li>



<li>タイムアウト時は <code>Nothing</code> を返す</li>



<li>Pythonのように例外処理に頼らずVBAらしい安全な設計</li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">VBA版WebDriverWaitの実装例</span></h2>



<p>以下のクラスモジュールをVBAに追加してください※クラス名は <strong><code>WebDriverWait</code></strong> にしています</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/09/image.jpg"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2025/09/image-1024x538.jpg" alt="" class="wp-image-3570" srcset="https://javeo.jp/wp-content/uploads/2025/09/image-1024x538.jpg 1024w, https://javeo.jp/wp-content/uploads/2025/09/image-300x158.jpg 300w, https://javeo.jp/wp-content/uploads/2025/09/image-150x79.jpg 150w, https://javeo.jp/wp-content/uploads/2025/09/image-768x403.jpg 768w, https://javeo.jp/wp-content/uploads/2025/09/image.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box not-nested-style cocoon-block-toggle"><input id="toggle-checkbox-202509242213270" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202509242213270">プログラムを見る</label><div class="toggle-content">
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-file="WebDriverWait " data-lang="Visual Basic + VBA"><code>&#39;--- クラス名: WebDriverWait ---
Option Explicit
&#39;====================================================================================================
&#39; PythonのWebDriverWaitの一部を再現したクラス
&#39; ※条件に合致した場合はWebElementを返して一致しなかった場合はNothingを返す
&#39;   - UntilPresenceeLocated・DOM上に指定したelementが表示されるまで待機は発生し得ないから準備していない
&#39;   - UntilPresence・・・・・DOM上に指定したByが表示されるまで待機
&#39;   - UntilVisibleLocated・・画面上に指定したelementが表示されるまで待機（IsDisplayed）
&#39;   - UntilVisible ・・・・・画面上に指定したByが表示されるまで待機（IsDisplayed）
&#39;   - UntilEnableLocated・・画面上に指定したelementが利用できるまで待機（IsDisplayed & IsEnabled）
&#39;   - UntilEnable ・・・・・画面上に指定したByが利用できるまで待機（IsDisplayed & IsEnabled）
&#39;====================================================================================================
Private pDriver As Selenium.WebDriver
Private pTimeout As Double
Private pInterval As Double

Public Sub Init(driver As Selenium.WebDriver, Optional timeoutSeconds As Double = 10, Optional intervalSeconds As Double = 0.5)
    Set pDriver = driver
    pTimeout = timeoutSeconds
    pInterval = intervalSeconds
End Sub

&#39; Presence
Public Function UntilPresence(By As Selenium.By) As Selenium.WebElement
    Dim start As Double: start = Timer
    Dim elem As Selenium.WebElement
    
    Do
        On Error Resume Next
        Set elem = pDriver.FindElement(By)
        On Error GoTo 0
        
        If Not elem Is Nothing Then
            Set UntilPresence = elem
            Exit Function
        End If
        
        DoEvents
        Application.wait Now + TimeSerial(0, 0, pInterval)
    Loop While Timer - start &lt; pTimeout
    
    Set UntilPresence = Nothing
End Function

&#39; Visibility (By指定)
Public Function UntilVisibleLocated(By As Selenium.By) As Selenium.WebElement
    Dim start As Double: start = Timer
    Dim elem As Selenium.WebElement
    
    Do
        On Error Resume Next
        Set elem = pDriver.FindElement(By)
        On Error GoTo 0
        
        If Not elem Is Nothing Then
            If elem.IsDisplayed Then
                Set UntilVisibleLocated = elem
                Exit Function
            End If
        End If
        
        DoEvents
        Application.wait Now + TimeSerial(0, 0, pInterval)
    Loop While Timer - start &lt; pTimeout
    
    Set UntilVisibleLocated = Nothing
End Function

&#39; Visibility (element指定)
Public Function UntilVisible(elem As Selenium.WebElement) As Selenium.WebElement
    Dim start As Double: start = Timer
    
    Do
        If Not elem Is Nothing Then
            If elem.IsDisplayed Then
                Set UntilVisible = elem
                Exit Function
            End If
        End If
        
        DoEvents
        Application.wait Now + TimeSerial(0, 0, pInterval)
    Loop While Timer - start &lt; pTimeout
    
    Set UntilVisible = Nothing
End Function

&#39; Enable (By指定)
Public Function UntilEnableLocated(By As Selenium.By) As Selenium.WebElement
    Dim start As Double: start = Timer
    Dim elem As Selenium.WebElement
    
    Do
        On Error Resume Next
        Set elem = pDriver.FindElement(By)
        On Error GoTo 0
        
        If Not elem Is Nothing Then
            If elem.IsDisplayed And elem.IsEnabled Then
                Set UntilEnableLocated = elem
                Exit Function
            End If
        End If
        
        DoEvents
        Application.wait Now + TimeSerial(0, 0, pInterval)
    Loop While Timer - start &lt; pTimeout
    
    Set UntilEnableLocated = Nothing
End Function

&#39; Enable (element指定)
Public Function UntilEnable(elem As Selenium.WebElement) As Selenium.WebElement
    Dim start As Double: start = Timer
    
    Do
        If Not elem Is Nothing Then
            If elem.IsDisplayed And elem.IsEnabled Then
                Set UntilEnable = elem
                Exit Function
            End If
        End If
        
        DoEvents
        Application.wait Now + TimeSerial(0, 0, pInterval)
    Loop While Timer - start &lt; pTimeout
    
    Set UntilEnable = Nothing
End Function
</code></pre></div>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">使い方サンプル</span></h2>



<p>このブログの練習用ページでテストできるようにしていますので自由にテストしてください</p>



<p>ポイントはInit部分で引数は下記の通りです</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>wait.Init driver, {最大待機秒数}, {判定間隔}</code></pre></div>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box not-nested-style cocoon-block-toggle"><input id="toggle-checkbox-202509242213271" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202509242213271">プログラムを見る</label><div class="toggle-content">
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Sub test()
    Dim driver As New Selenium.ChromeDriver
    Dim By As New Selenium.By
    
    driver.Get &quot;https://javeo.jp/practice_scraping/&quot;

    Dim wait As New WebDriverWait
    wait.Init driver, 10, 0.5

    &#39; presence_of_element_located(By)
    Dim elemUser As Selenium.WebElement
    Set elemUser = wait.UntilPresence(By.Css(&quot;#input_test&quot;))
    

    &#39; visibility_of_element_located(By)
    Dim elemPass As Selenium.WebElement
    Set elemPass = wait.UntilVisibleLocated(By.Css(&quot;#textarea_test&quot;))

    &#39; element_to_be_clickable(By)
    Dim elemBtn As Selenium.WebElement
    Set elemBtn = wait.UntilClickableLocated(By.Css(&quot;[name=&quot;&quot;checkbox_test&quot;&quot;]&quot;))

    
    elemUser.SendKeys &quot;testuser&quot;
    elemPass.SendKeys &quot;secret&quot;
    elemBtn.Click
End Sub
</code></pre></div>
</div></div>



<h2 class="wp-block-heading"><span id="toc5">まとめ</span></h2>



<p>個人的にPythonでもSeleniumを使うのでWebDriverWaitが使えない不便さを感じていました</p>



<p>PythonとVBAでは思想も違うので適当にいじってますが、ほぼ同じように使えてスッキリです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/vba-webdriverwait/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【VBA】VBA-JSON不要！VBAでChromedriverを自動更新</title>
		<link>https://javeo.jp/vba-chromedriver-auto-update-lite/</link>
					<comments>https://javeo.jp/vba-chromedriver-auto-update-lite/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 07 Sep 2025 13:09:12 +0000</pubDate>
				<category><![CDATA[VBA・Excel]]></category>
		<category><![CDATA[EXCEL]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SeleniumBasic]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3564</guid>

					<description><![CDATA[目次 やっていること必要な参照設定ファイルへの反映手順プロパティウィンドウを表示しておく標準モジュールを追加モジュール名を変更するプログラムの使い方Chromedriverの書き込み権限がない時サンプルファイル最後に実際 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>以前に別で作成したVBAのChromedriver自動更新プログラムですが色々見直すと実はVBA-JSONなしでも十分ってことに気づいて別途作成しました</p>



<p>条件付きの簡略版ではありますのでご自身の環境に合わせて使い分けてください</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-excel-python wp-block-embed-excel-python"><div class="wp-block-embed__wrapper">

<a rel="noopener follow noreferrer" target="_blank" href="https://javeo.jp/vba-chromedriver-auto-update/" title="【VBA】SeleniumBasicのchromedriverを自動更新する" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="198" src="https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-320x198.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-320x198.jpg 320w, https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-240x148.jpg 240w, https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-640x396.jpg 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【VBA】SeleniumBasicのchromedriverを自動更新する</div><div class="blogcard-snippet internal-blogcard-snippet">Pythonではよくあるchromedriverの自動更新をVBAで再現できるように独自に作成したプログラムを紹介します！私も利用しているのでより良くなるご指摘あればコメントお願いします</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://javeo.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">javeo.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.08.15</div></div></div></div></a>
</div></figure>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">やっていること</a></li><li><a href="#toc2" tabindex="0">必要な参照設定</a></li><li><a href="#toc3" tabindex="0">ファイルへの反映手順</a><ol><li><a href="#toc4" tabindex="0">プロパティウィンドウを表示しておく</a></li><li><a href="#toc5" tabindex="0">標準モジュールを追加</a></li><li><a href="#toc6" tabindex="0">モジュール名を変更する</a></li><li><a href="#toc7" tabindex="0">プログラムの使い方</a></li></ol></li><li><a href="#toc8" tabindex="0">Chromedriverの書き込み権限がない時</a></li><li><a href="#toc9" tabindex="0">サンプルファイル</a></li><li><a href="#toc10" tabindex="0">最後に実際のソース</a></li><li><a href="#toc11" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">やっていること</span></h2>



<ol class="wp-block-list has-watery-yellow-background-color has-background">
<li>chromedriverの保存先は端末環境によって違うので候補となる3箇所のフォルダ有無を確認</li>



<li>chromeの保存先も端末環境によって違うので候補となる3箇所のフォルダ有無を確認</li>



<li>PowerShellでchromeのバージョンを取得する<br>※なので一瞬PowerShellの画面がチラつきます</li>



<li>APIでChrome.exeのビルドまで一致している最新chromedriverのダウンロードパスを取得</li>



<li>ダウンロードしたzipファイルを解凍してをseleniumbasic用のフォルダへコピーする</li>
</ol>



<p>以前作成したVBAはJSON API endpointsを総当たりで取得していたのでJSONをパースする必要がありましたが、APIでドライバのバージョンを直接取得できることに気づいて少し手順を簡略化できました</p>



<p>処理としては数秒しか変わりませんがVBA-JSOＮ不要になったのは個人的にGoodポイント</p>



<p class="is-style-information-box has-box-style">ここからは以前と同じことを書いてますが単独でこのページを見ていただいた方向けです</p>



<h2 class="wp-block-heading"><span id="toc2">必要な参照設定</span></h2>



<p>このプログラムを実行するために設定した参照設定</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/07/image-4.png"><img decoding="async" width="455" height="317" src="https://javeo.jp/wp-content/uploads/2023/07/image-4.png" alt="" class="wp-image-3282" srcset="https://javeo.jp/wp-content/uploads/2023/07/image-4.png 455w, https://javeo.jp/wp-content/uploads/2023/07/image-4-300x209.png 300w, https://javeo.jp/wp-content/uploads/2023/07/image-4-150x105.png 150w" sizes="(max-width: 455px) 100vw, 455px" /></a></figure>



<p>追加したのは下記3つ</p>



<ul class="wp-block-list has-watery-yellow-background-color has-background">
<li>Microsoft Scripting Runtime</li>



<li>Microsoft XML, v6.0</li>



<li>Selenium Type Library</li>
</ul>



<p>ここは旧バージョンと変わりありません</p>



<h2 class="wp-block-heading"><span id="toc3">ファイルへの反映手順</span></h2>



<p>サンプルファイルとソースは下部に準備していますがファイルへの反映方法がわからない方向けに反映と使い方です</p>



<p>そんなことわかってるからはよソースを！って方は<a href="#program-source" data-type="internal" data-id="#program-source">下部のソース</a>まで飛んじゃってください</p>



<h3 class="wp-block-heading"><span id="toc4">プロパティウィンドウを表示しておく</span></h3>



<p>あとからモジュール名を変更したいので、もし表示されていない時は表示しておく</p>



<div class="wp-block-cocoon-blocks-blank-box-1 blank-box block-box">
<p>ヘッダーメニュー：表示　→　プロパティウィンドウ　※F4がショートカットキー</p>
</div>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44.png"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44-1024x555.png" alt="" class="wp-image-1298" srcset="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44-1024x555.png 1024w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44-300x163.png 300w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44-150x81.png 150w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44-768x416.png 768w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44-1536x832.png 1536w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_44.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc5">標準モジュールを追加</span></h3>



<p>自動更新プログラム用にモジュールを追加する</p>



<div class="wp-block-cocoon-blocks-blank-box-1 blank-box block-box">
<p>ヘッダーメニュー：挿入　→　標準モジュール</p>
</div>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54.png"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54-1024x555.png" alt="" class="wp-image-1299" srcset="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54-1024x555.png 1024w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54-300x163.png 300w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54-150x81.png 150w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54-768x416.png 768w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54-1536x832.png 1536w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h03_54.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc6">モジュール名を変更する</span></h3>



<p>必須ではないんですが、わかりやすい運用のためにはモジュール名変更推奨です</p>



<p>今回は&#8221;<span class="marker-under">ChromeDriverAutoUpdateModule</span>&#8220;にします</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04.png"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04-1024x555.png" alt="" class="wp-image-1300" srcset="https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04-1024x555.png 1024w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04-300x163.png 300w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04-150x81.png 150w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04-768x416.png 768w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04-1536x832.png 1536w, https://javeo.jp/wp-content/uploads/2023/08/2023-08-01_09h05_04.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc7">プログラムの使い方</span></h3>



<p>「<span class="marker-under">&lt;モジュール名&gt;.&lt;プロシージャ名&gt;()</span>  ※&#8221;&lt;モジュール名&gt;.&#8221;は省略可」でプログラムを呼び出せるので、本体プログラムの最初に「<span class="marker-under">ChromeDriverAutoUpdateModule.ChromeDriverAutoUpdate()</span>」を追加すれば必要なときにchromedriverが自動更新されます</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-file="sample" data-lang="Visual Basic + VBA"><code>Sub main()
&#39;---Chromedriverの自動更新 ※別モジュールを参照
If ChromeDriverAutoUpdateModule.ChromeDriverAutoUpdate Then
    Exit Sub
End If

&#39;－－・－－・－－以下にプログラムを－－・－－・－－
End Sub</code></pre></div>



<h2 class="wp-block-heading"><span id="toc8">Chromedriverの書き込み権限がない時</span></h2>



<p>Winsows11からセキュリティ周りが厳しくなったのか管理者権限でSeleniumBasicをインストールした場合、Chromedriverを更新しようとすると書き込み権限なしエラーが発生するので対応まとめました</p>



<p>画像の通りですが下記手順で権限設定ができます</p>



<ol class="wp-block-list has-watery-blue-background-color has-background">
<li>&#8220;C:\Program Files&#8221;にある&#8221;SeleniumBasic&#8221;フォルダを右クリック</li>



<li>右クリックメニューで&#8221;プロパティ&#8221;をクリック</li>



<li>セキュリティタブに移って&#8221;編集&#8221;ボタンをクリック</li>



<li>&#8220;Users（{コンピュータ名}\Users）&#8221;をクリック</li>



<li>&#8220;フルコントロール&#8221;にチェックがついていないはずなのでクリックしてチェックを付ける</li>



<li>&#8220;適用&#8221;ボタンをクリック</li>
</ol>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25-1024x538.png" alt="" class="wp-image-3175" srcset="https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25-300x158.png 300w, https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25-150x79.png 150w, https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25-768x403.png 768w, https://javeo.jp/wp-content/uploads/2023/07/2025-08-01_08h03_25.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading"><span id="toc9">サンプルファイル</span></h2>



<p>JSON-VBA含めて最低限のモジュールをセットしたファイル準備したので一から作る時のベースにしていただければ</p>





<h2 class="wp-block-heading" id="program-source"><span id="toc10">最後に実際のソース</span></h2>



<p>まずはGithubをご利用の方向けはこちら</p>




<a rel="noopener noreferrer" target="_blank" href="https://github.com/javeo2022/webdriver_manager_VBA_Lite" title="GitHub - javeo2022/webdriver_manager_VBA_Lite: SeleniumBasic用のVBAでChromeDriverを自動更新するためのプログラムです" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://opengraph.githubassets.com/4854569a2cb6dba2b1062d618348a7196c7ab09cc88bba2176029d9baee800f9/javeo2022/webdriver_manager_VBA_Lite" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - javeo2022/webdriver_manager_VBA_Lite: SeleniumBasic用のVBAでChromeDriverを自動更新するためのプログラムです</div><div class="blogcard-snippet external-blogcard-snippet">SeleniumBasic用のVBAでChromeDrive...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/javeo2022/webdriver_manager_VBA_Lite" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>例によってコピペ用はこちらです</p>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box not-nested-style cocoon-block-toggle"><input id="toggle-checkbox-202510131456140" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202510131456140">ソースを見る</label><div class="toggle-content">
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function URLDownloadToFile Lib &quot;urlmon&quot; Alias &quot;URLDownloadToFileA&quot; _
                        (ByVal pCaller As Long, _
                         ByVal szURL As String, _
                         ByVal szFileName As String, _
                         ByVal dwReserved As Long, _
                         ByVal lpfnCB As Long) As Long
Private Declare PtrSafe Function SHCreateDirectoryEx Lib &quot;shell32.dll&quot; Alias &quot;SHCreateDirectoryExA&quot; _
                        (ByVal hwnd As LongPtr, ByVal pszPath As String, ByVal psa As LongPtr) As Long
#Else
Private Declare Function URLDownloadToFile Lib &quot;urlmon&quot; Alias &quot;URLDownloadToFileA&quot; _
                        (ByVal pCaller As Long, _
                         ByVal szURL As String, _
                         ByVal szFileName As String, _
                         ByVal dwReserved As Long, _
                         ByVal lpfnCB As Long) As Long
Private Declare Function SHCreateDirectoryEx Lib &quot;shell32.dll&quot; Alias &quot;SHCreateDirectoryExA&quot; _
                        (ByVal hwnd As LongPtr, ByVal pszPath As String, ByVal psa As LongPtr) As Long
#End If

Private Type VersionType &#39;---本当はクラスオブジェクトにしたいけどこれだけのためにモジュール作りたくない
    Major As Long
    Minor As Long
    Build As Long
    Revision As Long
    BuildVersion As String
    RevisionVersion As String
End Type
Const ZIP_FILE As String = &quot;chromedriver.zip&quot;
Const DRIVER_EXE As String = &quot;chromedriver.exe&quot;
Dim workPath As String
Sub test()
Call ChromeDriverAutoUpdate
End Sub
Public Function ChromeDriverAutoUpdate(Optional ByVal ForcedExecution As Boolean = False) As Boolean
&#39;====================================================================================================
&#39;chrome.exeとchromedriver.exeのバージョンを比較してchromedriverを自動更新する
&#39;もしくは強制実行フラグ（ForcedExecution）がTrueでも実行する
&#39;====================================================================================================
    Dim chromePath As String &#39;---chrome.exeが保存されているパス
    Dim chromeFullpath As String &#39;---chrome.exeまで含めたフルパス
    Dim chromeVersion As VersionType
    Dim chromedriverPath As String
    Dim chromedriverFullPath As String
    Dim objFso As New Scripting.FileSystemObject
    &#39; ---chromedriverをダウンロード用のフォルダを作成する　※Seleniumのキャッシュ構造に合わせている
    workPath = Environ(&quot;USERPROFILE&quot;) & &quot;\.cache\selenium\seleniumbasic&quot;
    Select Case SHCreateDirectoryEx(0&, workPath, 0&)
        Case 0:
            &#39; ---作成成功
        Case 183
            &#39; ---作成済み
        Case Else:
            &#39; ---作成できなかった時
            MsgBox &quot;ダウンロード用フォルダを作成できませんでした&quot; & vbCrLf & Error(Err), vbCritical
            ChromeDriverAutoUpdate = False
            Exit Function
    End Select
    
    &#39;---chrome本体のフォルダを探す
    Select Case True
        Case objFso.FolderExists(Environ(&quot;LOCALAPPDATA&quot;) & &quot;\Google\Chrome\Application&quot;)
            chromePath = Environ(&quot;LOCALAPPDATA&quot;) & &quot;\Google\Chrome\Application&quot;
        Case objFso.FolderExists(Environ(&quot;ProgramW6432&quot;) & &quot;\Google\Chrome\Application&quot;)
            chromePath = Environ(&quot;ProgramW6432&quot;) & &quot;\Google\Chrome\Application&quot;
        Case objFso.FolderExists(Environ(&quot;ProgramFiles&quot;) & &quot;\Google\Chrome\Application&quot;)
            chromePath = Environ(&quot;ProgramFiles&quot;) & &quot;\Google\Chrome\Application&quot;
        Case Else
            MsgBox &quot;&#39;chrome&#39;フォルダが見つかりません&quot;, vbCritical
            ChromeDriverAutoUpdate = False
            Exit Function
    End Select
    
    &#39;---念のためchrome.exeを確認する
    If objFso.FileExists(chromePath & &quot;\chrome.exe&quot;) = True Then
        chromeFullpath = chromePath & &quot;\chrome.exe&quot;
    Else
        MsgBox &quot;&#39;chrome.exe&#39;が見つかりません&quot;, vbCritical
        Exit Function
    End If
    
    &#39;---SeleniumBasicのフォルダを探す
    Select Case True
        Case objFso.FolderExists(Environ(&quot;LOCALAPPDATA&quot;) & &quot;\SeleniumBasic&quot;)
            chromedriverPath = Environ(&quot;LOCALAPPDATA&quot;) & &quot;\SeleniumBasic&quot;
        Case objFso.FolderExists(Environ(&quot;ProgramW6432&quot;) & &quot;\SeleniumBasic&quot;)
            chromedriverPath = Environ(&quot;ProgramW6432&quot;) & &quot;\SeleniumBasic&quot;
        Case objFso.FolderExists(Environ(&quot;ProgramFiles&quot;) & &quot;\SeleniumBasic&quot;)
            chromedriverPath = Environ(&quot;ProgramFiles&quot;) & &quot;\SeleniumBasic&quot;
        Case Else
            MsgBox &quot;&#39;SeleniumBasic&#39;のフォルダが見つかりません&quot;, vbCritical
            ChromeDriverAutoUpdate = False
            Exit Function
    End Select
    
    &#39;---念のためchromedriver.exeを確認する
    If objFso.FileExists(chromedriverPath & &quot;\&quot; & DRIVER_EXE) = False Then
        Debug.Print &quot;&#39;chromedriver.exe&#39;が見つかりませんでした&quot;
    End If
    chromedriverFullPath = chromedriverPath & &quot;\&quot; & DRIVER_EXE
        
    &#39;---chrome.exeのバージョンを取得する
    If GetChromeVersion(chromeFullpath, chromeVersion) = False Then &#39;---chrome.exeのバージョンを取得する
        MsgBox &quot;&#39;chrome.exe&#39;のバージョンが取得できませんでした&quot;, vbCritical
        ChromeDriverAutoUpdate = False
        Exit Function
    End If
    
    &#39;---chrome.exeのバージョンに合わせたchromedriver.exeをダウンロードする
    If ChromedriverQuickCheck(chromedriverPath, chromeVersion) = False Then &#39;---chromedriverのバージョンを取得する
        MsgBox &quot;&#39;chromedriver.exe&#39;のバージョンが取得できませんでした&quot;, vbCritical
        ChromeDriverAutoUpdate = False
        Exit Function
    End If
    
    &#39;---結果として更新していない場合もあるが、更新失敗じゃなくて更新不要な判定だからTrueを返す
    ChromeDriverAutoUpdate = True
Exit Function
ErrLabel:     &#39;---予期せぬエラーの分岐
    MsgBox &quot;chromedriver の入替に失敗しました&quot; & vbCrLf & Error(Err) & vbCrLf & &quot;※この画面のキャプチャを作成者へ送ってください&quot;
    ChromeDriverAutoUpdate = False
End Function
Private Function GetChromeVersion(ByVal chromeFullpath As String, ByRef chromeVersion As VersionType) As Boolean
&#39;====================================================================================================
&#39;PowerShellでchrome.exeのバージョン情報を取得する　※一瞬PowerShellが立ち上がる
&#39;====================================================================================================
    Dim command As String
    Dim objRet As Object
    
    On Error GoTo ErrLabel
        &#39;---chromeバージョン情報の初期値
        chromeVersion.Major = 1
        chromeVersion.Minor = 0
        chromeVersion.Build = 0
        chromeVersion.Revision = 0
        &#39;---chrome.exeのバージョンを取得するPowerShellコマンド
        command = &quot;powershell.exe -NoProfile -ExecutionPolicy Bypass (Get-Item -Path &#39;&quot; & chromeFullpath & &quot;&#39;).VersionInfo.FileVersion&quot;
        &#39;---PowerShellの実行結果をセット
        Set objRet = CreateObject(&quot;WScript.Shell&quot;).Exec(command)
        &#39;---PowerShellのコマンドレットの実行結果を取得
        chromeVersion.RevisionVersion = Trim(objRet.StdOut.ReadAll)
        &#39;---情報の取得が終わったらオブジェクトをクリアする
        Set objRet = Nothing
        &#39;---改行コードが含まれているから削除する
        chromeVersion.RevisionVersion = Trim(Replace(Replace(Replace(chromeVersion.RevisionVersion, vbCrLf, vbNullString), vbCr, vbNullString), vbLf, vbNullString))
        &#39;---バージョン情報を分けて返す
        With CreateObject(&quot;VBScript.RegExp&quot;) &#39;---正規表現の準備
            .Pattern = &quot;\d+\.\d+\.\d+(\.\d+)?&quot;
            .Global = True
            If .test(chromeVersion.RevisionVersion) Then &#39;---念のため正規表現でバージョン情報をチェックする
                chromeVersion.Major = CLng(Split(chromeVersion.RevisionVersion, &quot;.&quot;)(0))
                chromeVersion.Minor = CLng(Split(chromeVersion.RevisionVersion, &quot;.&quot;)(1))
                chromeVersion.Build = CLng(Split(chromeVersion.RevisionVersion, &quot;.&quot;)(2))
                If UBound(Split(chromeVersion.RevisionVersion, &quot;.&quot;)) &gt;= 3 Then &#39;---リビジョン番号がなければ9999を仮でセット※基本あるはず
                    chromeVersion.Revision = CLng(Split(chromeVersion.RevisionVersion, &quot;.&quot;)(3))
                Else
                    chromeVersion.Revision = 9999
                End If
                chromeVersion.BuildVersion = Join(Array(chromeVersion.Major, chromeVersion.Minor, chromeVersion.Build), &quot;.&quot;) &#39;---リビジョンを覗いたショートバージョン情報をセットする
                Debug.Print &quot;Chromeのバージョン：&quot; & chromeVersion.RevisionVersion
            Else &#39;---正規表現不一致なら失敗で返す
                MsgBox &quot;chrome.exe のバージョン情報取得に失敗しました&quot; & vbCrLf & &quot;[取得バージョン情報：&quot; & chromeVersion.RevisionVersion & &quot;]&quot; & vbCrLf & &quot;※この画面のキャプチャを作成者へ送ってください&quot;
                GetChromeVersion = False
                Exit Function
            End If
        End With
        GetChromeVersion = True
    On Error GoTo 0
    Exit Function
ErrLabel:     &#39;---予期せぬエラーの分岐
    MsgBox &quot;chrome.exe のバージョン情報取得に失敗しました&quot; & vbCrLf & &quot;[&quot; & Error(Err) & &quot;]&quot; & vbCrLf & &quot;※この画面のキャプチャを作成者へ送ってください&quot;
    GetChromeVersion = False
End Function
Private Function ChromedriverQuickCheck(chromedriverPath, chromeVersion As VersionType) As Boolean
    Dim objHttp As New MSXML2.XMLHTTP60
    Dim targetVarsion As String
    Dim uri As String
    Dim api_endpoints As String
    Dim downloadPath As String
    Dim objFso As New Scripting.FileSystemObject
    Const TARGET_PLATFORM As String = &quot;win64&quot;

    api_endpoints = &quot;https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_&quot; & chromeVersion.BuildVersion
    On Error GoTo ErrLabel
        With objHttp
            .Open &quot;GET&quot;, api_endpoints, False
            .Send
            targetVarsion = .responseText &#39;---JSON endpoints から情報を収集する
            downloadPath = workPath & &quot;\&quot; & targetVarsion
            &#39;--- 念のためリビジョンバージョンを比較する
            If chromeVersion.Major &gt;= CLng(Split(targetVarsion, &quot;.&quot;)(0)) Then
                &#39;--- まだダウンロードしていなかったらダウンロードする
                If objFso.FileExists(downloadPath & &quot;\&quot; & DRIVER_EXE) = False Then
                    uri = &quot;https://storage.googleapis.com/chrome-for-testing-public/&quot; & targetVarsion & &quot;/&quot; & TARGET_PLATFORM & &quot;/chromedriver-&quot; & TARGET_PLATFORM & &quot;.zip&quot;
                    Call DownloadChromedriver(uri, targetVarsion)
                    Call objFso.DeleteFile(chromedriverPath & &quot;\&quot; & DRIVER_EXE, True)
                    Debug.Print &quot;インストールしたChromedriverのバージョン：&quot; & targetVarsion
                End If
                &#39;--- chromedriverはいつでも上書きする
                Call objFso.GetFile(downloadPath & &quot;\&quot; & DRIVER_EXE).Copy(chromedriverPath & &quot;\&quot; & DRIVER_EXE, True)
            Else
                Debug.Print &quot;Chromeのバージョンが古いためChromedriverは更新しません&quot;
            End If
        End With
    On Error GoTo 0
    ChromedriverQuickCheck = True
    Exit Function
ErrLabel:     &#39;---予期せぬエラーの分岐
    MsgBox &quot;chromedriver.exe の更新に失敗しました&quot; & vbCrLf & &quot;[&quot; & Error(Err) & &quot;]&quot; & vbCrLf & &quot;※この画面のキャプチャを作成者へ送ってください&quot;
    ChromedriverQuickCheck = False
End Function
Private Function DownloadChromedriver(ByVal url As String, targetVersion As String) As Boolean
    Dim rc As Long
    Dim downloadPath As String
    Dim newDriverPath As String
    Dim objFso As New Scripting.FileSystemObject
    Dim objFolder As Scripting.Folder
    downloadPath = workPath & &quot;\&quot; & targetVersion
    &#39; ---chromedriverのフォルダを作成する
    Select Case SHCreateDirectoryEx(0&, downloadPath, 0&)
        Case 0:
            &#39; ---作成成功
        Case 183
            &#39; ---作成済み
        Case Else:
            &#39; ---作成できなかった時
            MsgBox &quot;ChromeDriver用フォルダを作成できませんでした&quot; & vbCrLf & Error(Err), vbCritical
            DownloadChromedriver = False
            Exit Function
    End Select
    
    &#39;---ファイルをダウンロードする
    If URLDownloadToFile(0, url, workPath & &quot;\&quot; & ZIP_FILE, 0, 0) &lt;&gt; 0 Then
        MsgBox &quot;ChromeDriverをダウンロードできませんでした&quot; & vbCrLf & Error(Err), vbCritical
        DownloadChromedriver = False
        Exit Function
    End If
    Application.DisplayAlerts = False
    &#39;---zipを既定のフォルダに向けて解凍する
    With CreateObject(&quot;Shell.Application&quot;) &#39;---zipを既定のフォルダに向けて解凍する
        .Namespace((downloadPath)).CopyHere .Namespace((workPath & &quot;\&quot; & ZIP_FILE)).Items
    End With
    &#39;--- 解凍したフォルダから再起処理してchromedriver.exeのフルパスを取得する
    newDriverPath = SearchFilesRecursively(downloadPath & &quot;\&quot;, &quot;chromedriver.exe&quot;)
    If newDriverPath = &quot;&quot; Then
        MsgBox &quot;chromedriver.exe の更新に失敗しました&quot;
        DownloadChromedriver = False
    End If
    &#39;---chromedriverをバージョンフォルダ直下に移動する
    Call objFso.MoveFile(newDriverPath, downloadPath & &quot;\&quot;)
    &#39;---chromedriverがなくなった不要フォルダを削除する
    For Each objFolder In objFso.GetFolder(downloadPath).SubFolders
        objFolder.Delete True
    Next
    &#39;---zipファイルを削除する
    Call objFso.DeleteFile(workPath & &quot;\&quot; & ZIP_FILE, True)
    Application.DisplayAlerts = True
    DownloadChromedriver = True
End Function
Function SearchFilesRecursively(ByVal folderPath As String, fileName As String) As String
    &#39;====================================================================================================
    &#39; folderPathを起点に再帰処理でサブフォルダまで対象にしてfileNameを探してフルパスを返す
    &#39;====================================================================================================
    Dim objFso As New Scripting.FileSystemObject
    Dim objFolder As Scripting.Folder
    Dim subFolder As Scripting.Folder
    Dim objFile As Scripting.File
    Dim result As String

    &#39; ファイル一覧をチェック
    For Each objFile In objFso.GetFolder(folderPath).Files
        If objFile.Name = fileName Then
            SearchFilesRecursively = objFile.Path
            Exit Function
        End If
    Next objFile

    &#39; サブフォルダを再帰的に探索
    For Each subFolder In objFso.GetFolder(folderPath).SubFolders
        result = SearchFilesRecursively(subFolder.Path, fileName)
        If result &lt;&gt; &quot;&quot; Then
            SearchFilesRecursively = result
            Exit Function
        End If
    Next subFolder

    &#39; 見つからなかった場合
    SearchFilesRecursively = &quot;&quot;
End Function
</code></pre></div>
</div></div>



<h2 class="wp-block-heading"><span id="toc11">あとがき</span></h2>



<p>こちらが後出しなので簡易版としましたがむしろこちらを正規版で過去作成した方を特殊版にした方がいいかなと思っているレベル</p>



<p>今後改修するとしたらこちらになる予定です</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/vba-chromedriver-auto-update-lite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】スクレイピングに向けてSQLite3を使いこなそう</title>
		<link>https://javeo.jp/python-sqlite3/</link>
					<comments>https://javeo.jp/python-sqlite3/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 09 Feb 2025 22:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=2685</guid>

					<description><![CDATA[目次 SQLiteとはSQLiteを利用するための準備データ型値のデータ型についてカラムのデータ型についてPythonで実際に使ってみるdb接続（≒ファイル作成）テーブル削除と作成データの作成（挿入）データの取得データの [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>Pythonでスクレイピングをする時にデータベースがあると色々楽でして、MySQL（MariaDB）やMicrosoft&nbsp;SQL Serverなど機能的にも優れたメジャーなデータベースを使うのもいいですが、個人利用かつ一時利用にはオーバースペック気味なのでお手軽使えるSQLiteの利用方法をご紹介します</p>



<p>&#8220;Pythonで使うため&#8221;前提なのであまり深堀はしませんが、シンプルかつ軽量なので初めてのデータベースにはオススメです</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SQLiteとは</a></li><li><a href="#toc2" tabindex="0">SQLiteを利用するための準備</a></li><li><a href="#toc3" tabindex="0">データ型</a><ol><li><a href="#toc4" tabindex="0">値のデータ型について</a></li></ol></li><li><a href="#toc5" tabindex="0">カラムのデータ型について</a><ol><li><a href="#toc6" tabindex="0">Pythonで実際に使ってみる</a><ol><li><a href="#toc7" tabindex="0">db接続（≒ファイル作成）</a></li><li><a href="#toc8" tabindex="0">テーブル削除と作成</a></li><li><a href="#toc9" tabindex="0">データの作成（挿入）</a></li><li><a href="#toc10" tabindex="0">データの取得</a></li><li><a href="#toc11" tabindex="0">データの削除</a></li><li><a href="#toc12" tabindex="0">データの更新</a></li><li><a href="#toc13" tabindex="0">同時に削除＆挿入 or 挿入＆更新</a></li><li><a href="#toc14" tabindex="0">全部をまとめたサンプルソース</a></li></ol></li></ol></li><li><a href="#toc15" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">SQLiteとは</span></h2>



<p>SQLiteはMySQL（MariaDB）やMicrosoft&nbsp;SQL Serverと同じでRDBMS（データベース管理システム）で、その名の通り軽量でオープンソースのデータベースです</p>



<p>と言っても特にサーバーなど準備する必要もなく、軽量なファイルがローカルに作成されるだけのお手軽データベース</p>



<p>SQLの知識が必要になりますが、最低限で十分なので覚えて損はないはず</p>



<h2 class="wp-block-heading"><span id="toc2">SQLiteを利用するための準備</span></h2>



<p>PythonはSQLiteを利用するためにはSQLite3を利用しますが、標準ライブラリ入っているので個別のインストールは不要で簡単に利用できます</p>



<p>必須ではないですが、GUIアプリの”<strong>DB Browser for SQLite</strong>”があると管理が楽になるので利用に合わせてお好みで</p>



<p>DB Browser for SQLiteのインストールについてはコチラのページからどうぞ</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-excel-python wp-block-embed-excel-python"><div class="wp-block-embed__wrapper">

<a rel="noopener follow noreferrer" target="_blank" href="https://javeo.jp/sqlite-tool-install/" title="【Python】SQLite3のために&quot;DB Browser for SQLite&quot;をインストール" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="198" src="https://javeo.jp/wp-content/uploads/2024/10/SQLite-320x198.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://javeo.jp/wp-content/uploads/2024/10/SQLite-320x198.png 320w, https://javeo.jp/wp-content/uploads/2024/10/SQLite-240x148.png 240w, https://javeo.jp/wp-content/uploads/2024/10/SQLite-640x396.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Python】SQLite3のために"DB Browser for SQLite"をインストール</div><div class="blogcard-snippet internal-blogcard-snippet">Pythonでスクレイピングをする時にデータベース利用を推奨...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://javeo.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">javeo.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.02.09</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading"><span id="toc3">データ型</span></h2>



<p>SQLiteもデータベースなのでデータ型が存在します</p>



<p>値としてのデータ型とカラムとしてのデータ型の2つの観点があって詳細を知りたいなら<a rel="noreferrer noopener nofollow" target="_blank" href="https://www.sqlite.org/datatype3.html#determination_of_column_affinity" data-type="link" data-id="https://www.sqlite.org/datatype3.html#determination_of_column_affinity">公式ページはコチラ</a>で、ざっくり書き出すと↓↓の通り</p>



<h3 class="wp-block-heading"><span id="toc4">値のデータ型について</span></h3>



<p>SQLiteの値は5種類だけで下記参照</p>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>データ型</th><th>意味</th></tr></thead><tbody><tr><td>NULL</td><td>NULL値。</td></tr><tr><td>INTEGER</td><td>整数。1, 2, 3, 4, 6, or 8 バイトで格納。</td></tr><tr><td>REAL</td><td>浮動小数点数。8バイトで格納。</td></tr><tr><td>TEXT</td><td>テキスト文字列。UTF-8, UTF-16BE or UTF-16-LEのいずれかで保存。</td></tr><tr><td>BLOB</td><td>Binary Large OBject。入力データをそのまま格納。</td></tr></tbody></table></div></figure>



<p>他のデータベースでよくあるBool型、Date型はなく</p>



<ul class="wp-block-list">
<li>Bool型だと整数 0 (False) と 1 (True)&nbsp;で代替</li>



<li>Date型は関数を使用して<strong>TEXT型なら（&#8221;YYYY-MM-DD HH:MM:SS.SSS&#8221;）</strong>、<strong>INTEGER型なら（1970-01-01 00:00:00 UTC からの秒数）</strong>として代替</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">カラムのデータ型について</span></h2>



<p>続いてカラムで設定できるデータ型について</p>



<p>こちらも5種類だけでデータベースとしてはかなり少ないです</p>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>型親和性</th><th>説明</th></tr></thead><tbody><tr><td><strong>TEXT</strong></td><td>基本は文字列として保存される</td></tr><tr><td><strong>NUMERIC</strong></td><td>数値か文字列として保存される（基本は数値）</td></tr><tr><td><strong>INTEGER</strong></td><td>数値として保存される（整数を優先）</td></tr><tr><td><strong>REAL</strong></td><td>小数として保存される</td></tr><tr><td><strong>BLOB</strong></td><td>そのままのデータとして保存される（変換なし）</td></tr></tbody></table></div></figure>



<p>なんですが、実際は指定したデータ型に関係なく値が保存出来ちゃいます</p>



<p>“<strong>SQLite.exe</strong>“でデータを見てみるとこんな感じ</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/02/image-1.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2025/02/image-1-1024x538.png" alt="" class="wp-image-2898" srcset="https://javeo.jp/wp-content/uploads/2025/02/image-1-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2025/02/image-1-300x158.png 300w, https://javeo.jp/wp-content/uploads/2025/02/image-1-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/02/image-1-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/02/image-1.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>この仕様は良いのか悪いのか・・・</p>



<h3 class="wp-block-heading"><span id="toc6">Pythonで実際に使ってみる</span></h3>



<p>Pythonで使うと言っても基本的にはSQLを実行するだけ（データベースなんだからそりゃそう）</p>



<p>代表的なサンプルソース（≒SQL）を書き出します</p>



<h4 class="wp-block-heading"><span id="toc7">db接続（≒ファイル作成）</span></h4>



<p>DBの接続コマンドでファイルが無ければ生成してくれる</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>import sqlite3

#　---db接続（ファイルがなければ作成される）---
db_file= &quot;test.sqlite3&quot; # 拡張子は&quot;*.db&quot;,&quot;*.sqlite&quot;,&quot;*.db3&quot;,&quot;*.sqlite3&quot;からお好きなものを
conn = sqlite3.connect(db_file) 
# SQLiteを操作するためのカーソルを作成
cur = conn.cursor()</code></pre></div>



<h4 class="wp-block-heading"><span id="toc8">テーブル削除と作成</span></h4>



<p>SQLiteには<strong>&#8220;TRUNCATE TABLE&#8221;</strong>はないので<strong>&#8220;DROP &amp; CREATE&#8221;</strong>で代替</p>



<p><strong>&#8220;条件なしDELETE文&#8221;</strong>でも十分高速処理になるっぽい</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>#　---テーブルを作成---
# テーブルが既にあれば削除する
sql = &quot;DROP TABLE IF EXISTS test_table&quot;
cur.execute(sql)

# item_cdを主キーにテーブルを新規作成
sql = &quot;&quot;&quot;
    CREATE TABLE test_table(
    item_cd INTEGER PRIMARY KEY,
    item_name TEXT,
    item_count INTEGER,
    price INTEGER
    )
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit() # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc9">データの作成（挿入）</span></h4>



<p>複数データを同時にINSERTする時は他のデータベースでは見ない処理方法</p>



<p>無理にまとめて処理しなくてもPythonの中でループ処理もありかも</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データを挿入 ※execute
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (1, &#39;mouse&#39;, 1, 3000)&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# まとめてデータを挿入 ※executemany
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (?,?,?,?)&quot;
data = [(2, &quot;keyboard&quot;, 1, 8000), (3, &quot;monitor&quot;, 1, 15000), (4, &quot;USB cable&quot;, 3, 300), (5, &quot;HDMI cable&quot;, 1, 1000)]
cur.executemany(sql, data)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc10">データの取得</span></h4>



<p>普通のSELECT文</p>



<p>取得データはレコードをTUPLE型、複数レコードはLIST型で取得できるのでforなどでループして取得してあげればOK</p>



<p>変数に格納するならexecute後にfetchallで値を取得できる</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データベースからデータを取得
sql = &quot;SELECT * FROM test_table&quot;
_ = cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    print(row)</code></pre></div>



<h4 class="wp-block-heading"><span id="toc11">データの削除</span></h4>



<p>特に変わりのない一般的な<strong>&#8220;DELETE文&#8221;</strong></p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データを削除
sql = &quot;DELETE FROM test_table WHERE item_cd=1&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc12">データの更新</span></h4>



<p>こちらも一般的な<strong>&#8220;UPDATE文&#8221;</strong></p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データを更新
sql = &quot;UPDATE test_table SET price=5000 WHERE item_name=&#39;keyboard&#39;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc13">同時に削除＆挿入 or 挿入＆更新</span></h4>



<p><strong>&#8220;REPLACE INTO&#8221;</strong>と<strong>&#8220;UPSERT（と同じような処理）&#8221;</strong>の両方使える</p>



<p>データベース的にはUPSERTの方が適切なんだけどREPLACE INTOの方が簡単</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データ削除と挿入を同時にする
sql = &quot;&quot;&quot;
    REPLACE INTO test_table (item_cd, item_name, item_count, price)
    VALUES (3, &#39;wide monitor&#39;, 1, 30000)
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データ挿入時に重複なら更新する ※upsert文
sql = &quot;&quot;&quot;
    INSERT INTO test_table (item_cd, item_name, item_count, price)
    VALUES (5, &#39;HDMI cable&#39;, 3, 800)
    ON CONFLICT (item_cd)
    DO UPDATE SET item_count=3, price=800
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc14">全部をまとめたサンプルソース</span></h4>



<p>今までのプログラムを全部くっつけただけですが、実行すればSQLiteのプログラムを体感できるソースです</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>import sqlite3

#　---ファイルがなければ作成してdb接続---
db_file= &quot;test.db&quot; # 拡張子は&quot;.db&quot;か&quot;.sqlite&quot;
conn = sqlite3.connect(db_file) 
# SQLiteを操作するためのカーソルを作成
cur = conn.cursor()

#　---テーブルを作成---
# テーブルが既にあれば削除する
sql = &quot;DROP TABLE IF EXISTS test_table&quot;
cur.execute(&quot;DROP TABLE IF EXISTS test_table&quot;)
# item_cdを主キーにテーブルを新規作成
sql = &quot;&quot;&quot;
    CREATE TABLE test_table(
    item_cd INTEGER PRIMARY KEY,
    item_name TEXT,
    item_count INTEGER,
    price INTEGER
    )
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit() # コミットしないと反映しない

# データを挿入 ※execute
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (1, &#39;mouse&#39;, 1, 3000)&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# まとめてデータを挿入 ※executemany
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (?,?,?,?)&quot;
data = [(2, &quot;keyboard&quot;, 1, 8000), (3, &quot;monitor&quot;, 1, 15000), (4, &quot;USB cable&quot;, 3, 300), (5, &quot;HDMI cable&quot;, 1, 1000)]
cur.executemany(sql, data)
conn.commit()  # コミットしないと反映しない

# データベースからデータを取得
sql = &quot;SELECT * FROM test_table&quot;
_ = cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    print(row)

# データを削除
sql = &quot;DELETE FROM test_table WHERE item_cd=1&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データを更新
sql = &quot;UPDATE test_table SET price=5000 WHERE item_name=&#39;keyboard&#39;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データ削除と挿入を同時にする
sql = &quot;REPLACE INTO test_table (item_cd, item_name, item_count, price) VALUES (3, &#39;wide monitor&#39;, 1, 30000)&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データ挿入時に重複なら更新する ※upsert文
sql = &quot;&quot;&quot;
    INSERT INTO test_table (item_cd, item_name, item_count, price)
    VALUES (5, &#39;HDMI cable&#39;, 3, 800)
    ON CONFLICT (item_cd)
    DO UPDATE SET item_count=3, price=800
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# 処理結果を見るためにもう一度データを取得
sql = &quot;SELECT * FROM test_table&quot;
_ = cur.execute(sql)
for row in cur.fetchall():
    print(row)</code></pre></div>



<h2 class="wp-block-heading"><span id="toc15">あとがき</span></h2>



<p>CSVを直接書き出すプログラムだと重複チェックやスクレイピングで取得したデータを使った再スクレイピングが難しいのでデータベースが使えると幅が広がります</p>



<p>入門編としてSQLiteは導入コストはないし学習コストも少ないのでオススメです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/python-sqlite3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】netkeibaをスクレイピングする-その1</title>
		<link>https://javeo.jp/python-scraping-netkeiba-1/</link>
					<comments>https://javeo.jp/python-scraping-netkeiba-1/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Wed, 05 Jun 2024 23:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[netkeiba]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=2240</guid>

					<description><![CDATA[目次 スクレイピングを始める前に一度手動で操作しながらURLやページを観察する最初に静的ページか動的ページか確認するまずはレースマスタを作る（ベースの一覧を取得する）レース一覧を取得するために動作を確認するレース一覧を取 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>趣味で競馬をやっている私、ジャベ雄です</p>



<p>ブラッドスポーツと呼ばれるほど血統が重要視されていたり、会場による傾向や枠の有利不利などデータがものを言う競馬界においてデータ収集先の代表格、<a rel="noreferrer noopener nofollow" target="_blank" href="https://www.netkeiba.com/" data-type="link" data-id="https://www.netkeiba.com/">netkeiba</a>をPythonでスクレイピングする方法をまとめます</p>



<p>今回は&#8221;netkeibaをスクレイピングする&#8221;ことではなく、&#8221;netkeibaを題材にスクレイピングを学ぶ&#8221;ところに重きを置いているのでその前提で見てもらえると嬉しいです</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">スクレイピングを始める前に</a></li><li><a href="#toc2" tabindex="0">一度手動で操作しながらURLやページを観察する</a></li><li><a href="#toc3" tabindex="0">最初に静的ページか動的ページか確認する</a></li><li><a href="#toc4" tabindex="0">まずはレースマスタを作る（ベースの一覧を取得する）</a><ol><li><a href="#toc5" tabindex="0">レース一覧を取得するために動作を確認する</a></li><li><a href="#toc6" tabindex="0">レース一覧を取得するための結論</a></li></ol></li><li><a href="#toc7" tabindex="0">実際のプログラム</a></li><li><a href="#toc8" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">スクレイピングを始める前に</span></h2>



<p>今回はnetkeibaから大量のデータを取得しますし、取得したデータは分析してナンボなので取得情報はデータベース（今回はXserverのMariaDB）に保存する前提でプログラム作成していますので必要に応じて適宜変更してください</p>



<p>PythonでXserverを操作する方法は↓↓を参考にどうぞ</p>




<a rel="noopener follow noreferrer" target="_blank" href="https://javeo.jp/python-xserver-connect" title="【Python】Xserverのデータベースを操作する" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="198" src="https://javeo.jp/wp-content/uploads/2023/07/python-320x198.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://javeo.jp/wp-content/uploads/2023/07/python-320x198.png 320w, https://javeo.jp/wp-content/uploads/2023/07/python-240x148.png 240w, https://javeo.jp/wp-content/uploads/2023/07/python-640x396.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Python】Xserverのデータベースを操作する</div><div class="blogcard-snippet internal-blogcard-snippet">PythonでXserverのデータベースであるMySQL（MariaDB）を操作するためのコネクタープログラムを作りました。データベースからの情報取得はもちろん、追加・更新もできるので外部データ連携にも使えますので参考にどうぞ。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://javeo.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">javeo.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.12</div></div></div></div></a>



<h2 class="wp-block-heading"><span id="toc2">一度手動で操作しながらURLやページを観察する</span></h2>



<p>スクレイピングの初手はRPA的に情報取得すべきページへ遷移するところからです</p>



<p>一度手動で一連の動作を実施しながら特にURLに注目しながら観察すればパラメータを変更しながらページを読み込むのか、ボタンをクリックする必要があるのかなどがわかります</p>



<h2 class="wp-block-heading"><span id="toc3">最初に静的ページか動的ページか確認する</span></h2>



<p>Pythonでスクレイピングをする時の2台巨塔&#8221;<span class="marker-under"><strong>Selenium</strong></span>&#8220;と&#8221;<strong><span class="marker-under">Beautifulsoup</span></strong>&#8220;ですが、どちらを使うかの切り分けはそのサイト（ページ）がJavascriptを有効にする必要があるかどうか</p>



<p>確認するためにははChromeの設定メニューで切り替えるのですが、頻繁に切り替える可能性がある人はChrome拡張機能（私は<a rel="noreferrer noopener nofollow" target="_blank" href="https://chromewebstore.google.com/detail/quick-javascript-switcher/geddoclleiomckbhadiaipdggiiccfje?hl=ja" data-type="link" data-id="https://chromewebstore.google.com/detail/quick-javascript-switcher/geddoclleiomckbhadiaipdggiiccfje?hl=ja">Quick Javascript Switcher</a>）を使うこと推奨です</p>



<p>で、肝心のnetkibaはどうかと言うと開催レース一覧の画面がJavascript無効ではと永遠と馬が走っている状態になってしまうので有効にしておく必要があるとわかるので<strong>Selenium</strong>必須</p>



<figure class="wp-block-image size-large is-resized"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31.png"><img decoding="async" width="1024" height="490" src="https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31-1024x490.png" alt="" class="wp-image-2253" style="width:840px;height:auto" srcset="https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31-1024x490.png 1024w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31-300x144.png 300w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31-150x72.png 150w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31-768x368.png 768w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31-1536x735.png 1536w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-29_23h02_31.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>ぶっちゃけ、&#8221;<strong>Beautifulsoup</strong>&#8220;だけで完結するサイトは少ないので&#8221;<span class="bold-red">Selenium</span>&#8220;を使う前提でもOK</p>



<h2 class="wp-block-heading"><span id="toc4">まずはレースマスタを作る（ベースの一覧を取得する）</span></h2>



<p>私のスクレイピング方針のようなものですが最初は一覧情報を作ってその後に詳細情報を収集します</p>



<p>なぜかと言うとスクレイピングはNW状況含めて予想外にエラーが起こる可能性がありますし、詳細データでは予想外のデータもあるのでエラーが起こる前提として処理を途中から再開できるような仕様にすることが望ましいです</p>



<p>具体的にはnetkeibaなら開催日ごとのレース一覧、ECサイトなら検索結果画面にある商品ページリストを収集するイメージです</p>



<p>ここで&#8221;<strong>一度手動で操作しながらURLやページを観察する</strong>&#8220;に倣ってプログラムの方針を考えます</p>



<h3 class="wp-block-heading"><span id="toc5">レース一覧を取得するために動作を確認する</span></h3>



<p>まずは今週のレース一覧ページを開くとURLに&#8221;kaisai_date=yyyymmdd&#8221;がパラメータになっていることがわかるのでここを変更すれば良さそう</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07-1024x538.png" alt="" class="wp-image-2283" srcset="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07-300x158.png 300w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07-150x79.png 150w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07-768x403.png 768w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h27_07.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>このパラメータを変えれば当然その日のレース一覧に変わるわけですが開催されていない日を指定するとレースが何も表示されないので1日ずる変更すると無駄な読み込みになってしまう</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14-1024x538.png" alt="" class="wp-image-2284" srcset="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14-300x158.png 300w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14-150x79.png 150w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14-768x403.png 768w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h23_14.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>もう一つ、上部の&#8221;前&#8221;や&#8221;次&#8221;をクックすると1週間分の日付が前後することがわかります</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06-1024x538.png" alt="" class="wp-image-2286" srcset="https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06-300x158.png 300w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06-150x79.png 150w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06-768x403.png 768w, https://javeo.jp/wp-content/uploads/2024/06/2024-06-02_22h34_06.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc6">レース一覧を取得するための結論</span></h3>



<p>楽をするなら最初のパターンで取得対象の日まで1日読み込めばいいんですが、なるべくサイトへ負荷をかけないように無駄なページロードを避けるためやめました</p>



<p>続いて土日だけにするとイレギュラー開催（土日以外）の情報がカバーできなので止めました<br>※イレギュラー開催→1月の金杯、年末のホープフル、3連休の月曜日開催など</p>



<p>結論、取得したい起点の日を表示した状態から&#8221;次&#8221;ボタンをクリックし続けて日付が当日以上になるまでループする仕様にしました</p>



<h2 class="wp-block-heading"><span id="toc7">実際のプログラム</span></h2>



<p>私が実際に使っているプログラムですが必要な項目は違うでしょうし、データベース操作用のプログラムも違うと思うので適当に変更してください</p>



<p>コメントを大量に残しているのでプログラム自体の説明は割愛</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>from datetime import datetime
import re
import urllib.parse
from time import sleep

from bs4 import BeautifulSoup
from db_connector import xserver_keiba
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


# ====================================================================================================
class data_class:
    def __init__(self, data_title: list) -&gt; None:
        self.race_id = &#39;&#39;
        self.race_date = &#39;&#39;
        self.race_times = data_title[0]
        self.course_place = data_title[1]
        self.race_days = data_title[2]
        self.race_no = 0
        self.race_name = &#39;&#39;
        self.race_grade = &#39;&#39;
        self.race_time = &#39;&#39;
        self.coruse_type = &#39;&#39;
        self.course_distance = &#39;&#39;
        self.not_found = 0

    def upsert_sql(self):
        sql = f&#39;&#39;&#39;
            INSERT INTO race_mst(race_id,race_date,race_times,course_place,race_days,race_no,race_name,race_grade,race_time,coruse_type,course_distance,not_found)
            values ({self.race_id},&#39;{self.race_date}&#39;,&#39;{self.race_times}&#39;,&#39;{self.course_place}&#39;,&#39;{self.race_days}&#39;,{self.race_no},&#39;{self.race_name}&#39;,&#39;{self.race_grade}&#39;,&#39;{self.race_time}&#39;,&#39;{self.coruse_type}&#39;,&#39;{self.course_distance}&#39;,{self.not_found})
            ON DUPLICATE KEY UPDATE race_date=&#39;{self.race_date}&#39;,race_times=&#39;{self.race_times}&#39;,course_place=&#39;{self.course_place}&#39;,race_days=&#39;{self.race_days}&#39;,race_no={self.race_no},race_name=&#39;{self.race_name}&#39;,race_grade=&#39;{self.race_grade}&#39;,race_time=&#39;{self.race_time}&#39;,course_distance=&#39;{self.course_distance}&#39;,not_found=&#39;{self.not_found}&#39;
        &#39;&#39;&#39;.replace(&quot;&#39;&#39;&quot;, &quot;Null&quot;)
        return sql


# ====================================================================================================
def grade_converter(grade_class) -&gt; str:
    # クラス名からレースのグレードを判定して返す
    if &#39;Icon_GradeType1&#39; in grade_class:
        return &#39;GⅠ&#39;
    elif &#39;Icon_GradeType2&#39; in grade_class:
        return &#39;GⅡ&#39;
    elif &#39;Icon_GradeType3&#39; in grade_class:
        return &#39;GⅢ&#39;
    elif &#39;Icon_GradeType4&#39; in grade_class:
        return &#39;重賞&#39;
    elif &#39;Icon_GradeType5&#39; in grade_class:
        return &#39;OP&#39;
    elif &#39;Icon_GradeType6&#39; in grade_class:
        return &#39;1600万下&#39;
    elif &#39;Icon_GradeType7&#39; in grade_class:
        return &#39;1000万下&#39;
    elif &#39;Icon_GradeType8&#39; in grade_class:
        return &#39;900万下&#39;
    elif &#39;Icon_GradeType9&#39; in grade_class:
        return &#39;500万下&#39;
    elif &#39;Icon_GradeType10&#39; in grade_class:
        return &#39;JGⅠ&#39;
    elif &#39;Icon_GradeType11&#39; in grade_class:
        return &#39;JGⅡ&#39;
    elif &#39;Icon_GradeType12&#39; in grade_class:
        return &#39;JGⅢ&#39;
    elif &#39;Icon_GradeType13&#39; in grade_class:
        return &#39;WIN5&#39;
    elif &#39;Icon_GradeType14&#39; in grade_class:
        return &#39;特選&#39;
    elif &#39;Icon_GradeType15&#39; in grade_class:
        return &#39;L&#39;
    elif &#39;Icon_GradeType16&#39; in grade_class:
        return &#39;3勝&#39;
    elif &#39;Icon_GradeType17&#39; in grade_class:
        return &#39;2勝&#39;
    elif &#39;Icon_GradeType18&#39; in grade_class:
        return &#39;1勝&#39;
    else:
        pass


# ====================================================================================================
def main():
    db = xserver_keiba()
    # データベース内の最新レース日取得する
    sql = &#39;&#39;&#39;
        SELECT
            MAX(race_date) AS last_get_date
        FROM
            race_mst
    &#39;&#39;&#39;
    ret = db.fetch(sql)
    # dbにあるレース開催日の最大値を最初の取得対象日にする
    # レースデータがない（≒初回）は&#39;2014-01-05&#39;で固定する
    target_date = datetime(2014, 1, 5) if ret[0][&#39;last_get_date&#39;] is None else ret[0][&#39;last_get_date&#39;]
    options = Options()
    # 画像を読み込まない
    options.add_argument(&#39;--blink-settings=imagesEnabled=false&#39;)
    # シークレットモードで起動
    options.add_argument(&#39;--incognito&#39;)
    # Chromeを起動する
    driver = webdriver.Chrome(options=options)
    # urlに日付を設定すれば対象日のレース画面になる
    driver.get(f&quot;https://race.netkeiba.com/top/race_list.html?&kaisai_date={datetime.strftime(target_date, &#39;%Y%m%d&#39;)}&quot;)
    sleep(0.5)
    # 対象日付が未来日になるまでループする
    while target_date &lt; datetime.today():
        next_date_tab = True
        while next_date_tab is True:
            next_date_tab = False
            # ページソースをBeautifulSoupに食わせる
            soup = BeautifulSoup(driver.page_source)
            # 上部の日付のliにを確認
            for race_date in soup.select(&#39;#date_list_sub &gt; li[role=&quot;tab&quot;]&#39;):
                # 上部の日付のliにあるdate属性から対象の日付を取得して未来日になったら終わらせる
                if int(race_date.get(&#39;date&#39;)) &gt;= int(datetime.now().strftime(&#39;%Y%m%d&#39;)):
                    break
                # 取得済みの日付ならスキップ・未取得ならクリックする
                sql = f&#39;&#39;&#39;
                    SELECT
                        *
                    FROM
                        race_mst
                    WHERE
                        race_date=&#39;{race_date.get(&#39;date&#39;)}&#39;
                &#39;&#39;&#39;
                ret = db.fetch(sql)
                if len(ret) &gt; 0:
                    continue
                else:
                    driver.find_element(By.CSS_SELECTOR, f&#39;#date_list_sub &gt; li2026/04/23&#39;).click()
                # ↑のクリックでソースが書き換わっているのでもう一度ページソースをBeautifulSoupに食わせる
                soup = BeautifulSoup(driver.page_source)
                # id=&quot;RaceTopRace&quot;が複数ある可能性があるのでループさせる
                for RaceTopRace in soup.select(&#39;#RaceTopRace&#39;):
                    # 今表示されているRaceTopRaceは上の階層の属性で判断する
                    if RaceTopRace.parent.get(&#39;aria-hidden&#39;) == &#39;true&#39;:
                        continue
                    # 会場別でdlが分かれているのでループする
                    for dl in RaceTopRace.select(&#39;dl.RaceList_DataList&#39;):
                        # レースごとにliが分かれてるからループする
                        for li in dl.select(&#39;dd.RaceList_Data &gt; ul &gt; li.RaceList_DataItem&#39;):
                            # --- ここから実際のデータ取得 ---
                            # リンクが複数あるから&#39;result.html&#39;を含んでいるかで正誤判定する
                            for a in li.select(&#39;a&#39;):
                                if &#39;result.html&#39; in a.get(&#39;href&#39;):
                                    # 会場のヘッダー部から会場情報を取得する
                                    data = data_class(dl.select_one(&#39;dt.RaceList_DataHeader &gt; div.RaceList_DataHeader_Top &gt; p.RaceList_DataTitle&#39;).get_text(separator=&#39;/&#39;, strip=True).split(&#39;/&#39;))
                                    # urlのクエリパラメータにレースIDがあるので分解する
                                    url = a.get(&#39;href&#39;)
                                    qs = urllib.parse.urlparse(url).query
                                    qs_d = urllib.parse.parse_qs(qs)
                                    data.race_id = qs_d[&#39;race_id&#39;][0]
                                    # --- a配下にレース情報があるので取得する ---
                                    # レース番号
                                    data.race_no = a.select_one(&#39;div.Race_Num.Race_Fixed &gt; span&#39;).get_text(strip=True).replace(&#39;R&#39;, &#39;&#39;)
                                    # レース名
                                    data.race_name = a.select_one(&#39;div.RaceList_ItemContent &gt; div.RaceList_ItemTitle &gt; span.ItemTitle&#39;).get_text(strip=True)
                                    # レースのグレード設定があれば取得する
                                    if len(a.select(&#39;div.RaceList_ItemContent &gt; div.RaceList_ItemTitle &gt; span.Icon_GradeType&#39;)) &gt; 0:
                                        data.race_grade = grade_converter(a.select_one(&#39;div.RaceList_ItemContent &gt; div.RaceList_ItemTitle &gt; span.Icon_GradeType&#39;).get(&#39;class&#39;))
                                    # 出走時刻
                                    data.race_time = a.select_one(&#39;div.RaceList_ItemContent &gt; div.RaceData &gt; span.RaceList_Itemtime&#39;).get_text(strip=True)
                                    # 障害レースはクラス設定がないので分岐
                                    if len(a.select(&#39;div.RaceList_ItemContent &gt; div.RaceData &gt; span.RaceList_ItemLong&#39;)) &gt; 0:
                                        # 芝・ダートはクラスが設定されているからセレクタ―で指定する
                                        data.coruse_type = a.select_one(&#39;div.RaceList_ItemContent &gt; div.RaceData &gt; span.RaceList_ItemLong&#39;).get_text(strip=True)[0]
                                        data.course_distance = re.findall(R&#39;\d+&#39;, a.select_one(&#39;div.RaceList_ItemContent &gt; div.RaceData &gt; span.RaceList_ItemLong&#39;).get_text(strip=True))[0]
                                    else:
                                        # 障害はクラスが設定されていないから苦肉でindex指定する
                                        data.coruse_type = a.select(&#39;div.RaceList_ItemContent &gt; div.RaceData &gt; span&#39;)[1].get_text(strip=True)[0]
                                        data.course_distance = re.findall(R&#39;\d+&#39;, a.select(&#39;div.RaceList_ItemContent &gt; div.RaceData &gt; span&#39;)[1].get_text(strip=True))[0]
                                    # レース日は変数から反映させる
                                    data.race_date = race_date.get(&#39;date&#39;)
                                    db.execute(data.upsert_sql())
                next_date_tab = True
                break

        # 次ボタンを押すと次開催日に移るのでクリックする
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, &#39;#nextBtn &gt; a&#39;)))
        except TimeoutException:
            # 次がボタンになっていない（≒次がない）時はループを抜ける（けど、過去データしか取得しないから基本的にありえない）
            break
        driver.find_element(By.CSS_SELECTOR, &#39;#nextBtn &gt; a&#39;).click()
        # 一瞬でもsleepしないと処理が早すぎてエラーになる可能性があるので0.5秒待機
        sleep(0.5)
        # クエリパラメータに開催日があるので日付型に変換する
        qs = urllib.parse.urlparse(driver.current_url).query
        qs_d = urllib.parse.parse_qs(qs)
        target_date = datetime.strptime(qs_d[&#39;kaisai_date&#39;][0], &#39;%Y%m%d&#39;)
    # 最後にChromedriverを落として終了
    driver.close()
    driver.quit()


# ====================================================================================================
if __name__ == &#39;__main__&#39;:
    main()
</code></pre></div>



<h2 class="wp-block-heading"><span id="toc8">あとがき</span></h2>



<p>プログラムはもう少しスマートに書いた方が良さそうですが問題なく動いているのでこの辺りで手打ちにしました</p>



<p>netkeibaのスクレイピングにはまだ先は長いですが第一歩のまとめでした</p>



<p>次はレース画面を収集する方法をまとめます！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/python-scraping-netkeiba-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Windows Server】全自動に向けてWindows Serverを契約する</title>
		<link>https://javeo.jp/contracts-windows-server/</link>
					<comments>https://javeo.jp/contracts-windows-server/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sat, 16 Dec 2023 15:07:40 +0000</pubDate>
				<category><![CDATA[雑記・その他]]></category>
		<category><![CDATA[RPA]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[クローラー]]></category>
		<category><![CDATA[クローリング]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=1671</guid>

					<description><![CDATA[目次 そもそもWindows Serverとは？Windows Serverの良い点と悪い点良い点悪い点Xerverのプラン別料金表とオプション料金プラン別料金オプション料金ConoHaのプラン別料金表プラン別料金オプシ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p>24時間365日稼働できるPC環境があると今手作業でやっているような作業を全自動化することを実現できるかもしれません！</p>



<p>もちろん手元に安価なPCを準備して色々構築しても良いのですがオススメは<span class="marker-under">Windows Server</span></p>



<p>オススメしているわけですからもちろん私も利用しているわけで良い点・悪い点を上げていきます</p>



<p>参考までにWindows Serverを提供しているサービスはいくつかあるのですが、私はこのサイトの契約がXserverなのでWindows Serverでも<a rel="noopener noreferrer" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T6L5W+7YDKAQ+CO4+2BCWEQ">Xserver VPS for Windows Server</a>で契約しています</p>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%">
<a rel="nofollow noopener noreferrer" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T6L5W+7YDKAQ+CO4+2BHM5T">
<img decoding="async" border="0" width="300" height="250" alt="" src="https://www29.a8.net/svt/bgt?aid=230414756481&#038;wid=003&#038;eno=01&#038;mid=s00000001642014023000&#038;mc=1"></a>
<img decoding="async" border="0" width="1" height="1" src="https://www13.a8.net/0.gif?a8mat=3T6L5W+7YDKAQ+CO4+2BHM5T" alt="">
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%">
<a rel="nofollow noopener noreferrer" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T8KHY+5KN56Q+50+5MHB4H">
<img decoding="async" border="0" width="300" height="250" alt="" src="https://www26.a8.net/svt/bgt?aid=230507206337&#038;wid=003&#038;eno=01&#038;mid=s00000000018034009000&#038;mc=1"></a>
<img decoding="async" border="0" width="1" height="1" src="https://www13.a8.net/0.gif?a8mat=3T8KHY+5KN56Q+50+5MHB4H" alt="">
</div>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">そもそもWindows Serverとは？</a></li><li><a href="#toc2" tabindex="0">Windows Serverの良い点と悪い点</a><ol><li><a href="#toc3" tabindex="0">良い点</a></li><li><a href="#toc4" tabindex="0">悪い点</a></li></ol></li><li><a href="#toc5" tabindex="0">Xerverのプラン別料金表とオプション料金</a><ol><li><a href="#toc6" tabindex="0">プラン別料金</a></li><li><a href="#toc7" tabindex="0">オプション料金</a></li></ol></li><li><a href="#toc8" tabindex="0">ConoHaのプラン別料金表</a><ol><li><a href="#toc9" tabindex="0">プラン別料金</a></li><li><a href="#toc10" tabindex="0">オプション料金</a></li></ol></li><li><a href="#toc11" tabindex="0">オススメのプランと比較</a></li><li><a href="#toc12" tabindex="0">Xserverでの契約手続き</a><ol><li><a href="#toc13" tabindex="0">申し込み画面</a></li><li><a href="#toc14" tabindex="0">サーバーの種類</a></li><li><a href="#toc15" tabindex="0">サーバー名</a></li><li><a href="#toc16" tabindex="0">プラン</a></li><li><a href="#toc17" tabindex="0">サーバーの契約期間</a></li><li><a href="#toc18" tabindex="0">イメージタイプ</a></li><li><a href="#toc19" tabindex="0">ライセンス</a><ol><li><a href="#toc20" tabindex="0">リモートデスクトップ SAL</a></li><li><a href="#toc21" tabindex="0">Microsoft Office SAL</a></li></ol></li><li><a href="#toc22" tabindex="0">Administratorパスワード&nbsp;</a></li><li><a href="#toc23" tabindex="0">最後に</a></li></ol></li><li><a href="#toc24" tabindex="0">契約が終わったら管理ページへ</a><ol><li><a href="#toc25" tabindex="0">ログインページ</a></li><li><a href="#toc26" tabindex="0">VPS契約管理ページ</a></li><li><a href="#toc27" tabindex="0">VPSパネル</a></li><li><a href="#toc28" tabindex="0">リモートデスクトップ SALを使わないサーバー起動</a></li></ol></li><li><a href="#toc29" tabindex="0">リモートデスクトップを使ってサーバーに接続</a></li><li><a href="#toc30" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">そもそもWindows Serverとは？</span></h2>



<p>正確なサービス名称は<strong>VPS for<span class="marker-under"> Windows Server</span></strong>のこと</p>



<p>そして<strong>VPS</strong>とは「<strong>V</strong>irtual <strong>P</strong>rivate <strong>S</strong>erver」の略で、日本語略では「仮想専用サーバー」です</p>



<p>詳しいことは省略しますが、簡潔に言えば大きなサーバーを小さな仮想サーバーに分割して、その小さなサーバーをユーザーに専用サーバーとして提供してくれるサービスです</p>



<p>さらにそのサーバーのOSが一般的なパソコンに似たWindowsを使っているものを<strong><span class="marker-under">Windows Server</span></strong>というわけです</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-memo block-box">
<p class="has-watery-yellow-background-color has-background">つまりWindows Serverのサービスは24時間どこかで動いていて、誰かが管理してくれているWindows PCをレンタルできるって感じです</p>
</div>



<h2 class="wp-block-heading"><span id="toc2">Windows Serverの良い点と悪い点</span></h2>



<h3 class="wp-block-heading"><span id="toc3">良い点</span></h3>



<ul class="wp-block-list">
<li>初期費用を安く済ませることができる</li>



<li>電気代がかからない</li>



<li>物理的な場所を取らない</li>



<li>プログラム作成や環境構築を誰かに手伝ってもらうことが簡単</li>



<li>必要なときに必要なスケールアップ（スペックアップ）が可能</li>



<li>不要になったら契約解除するだけ（≒廃棄が不要）</li>



<li>Windows PCライクな操作感で利用できる</li>



<li>管理者権限を持っているのでアプリインストール可能</li>



<li>管理者権限を持っているのでGoogle Driveなどのストレージサービスをマウントできる</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4">悪い点</span></h3>



<ul class="wp-block-list">
<li>実機に比べると料金に対するスペックが低い</li>



<li>リモートデスクトップ SALが無いと利用しにくい（別料金）</li>



<li>Microsoft 365ライセンスが使えない（別料金のサーバー専用ライセンスが必要）</li>



<li>他のVPSに比べて料金が高い</li>



<li>サービス側が決める定期メンテナンスに巻き込まれる</li>
</ul>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-memo block-box">
<p class="has-watery-yellow-background-color has-background">使い勝手は良いんですが、使い方次第ではそれなりの料金がかかるので利用目的にあったプランを選ぶことが大事です</p>
</div>



<h2 class="wp-block-heading"><span id="toc5">Xerverのプラン別料金表とオプション料金</span></h2>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box has-border-color has-amber-border-color"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">オトクなキャンペーン中</span></div><div class="tab-caption-box-content block-box-content box-content">
<figure class="wp-block-table">
<div class="scrollable-table"><table class="org-table" style="width: 91.0995%; height: 297px;">
<tbody>
<tr style="height: 45px;">
<td style="background-color: #edf9ff; text-align: left; height: 45px; width: 21.5364%;">キャンペーン対象</td>
<td style="text-align: left; height: 45px; width: 78.3265%;">期間中に、Windows Serverを新規に申し込んだサーバーアカウント</td>
</tr>
<tr style="height: 45px;">
<td style="background-color: #edf9ff; text-align: left; height: 45px; width: 21.5364%;">キャンペーン期間</td>
<td style="text-align: left; height: 45px; width: 78.3265%;">2023年12月11日（月）12:00 ～ 2024年2月13日（火）12:00</td>
</tr>
<tr style="height: 207px;">
<td style="background-color: #edf9ff; text-align: left; height: 207px; width: 21.5364%;">キャンペーン内容</td>
<td style="text-align: left; height: 207px; width: 78.3265%;"><span style="color: #f7716f;"><strong>12ヶ月以上のご契約で、初回のお支払い利用料金が最大20％オフ</strong></span><br>・【12ヶ月契約】<span style="color: #f7716f;"><strong>10％オフ</strong></span><br>・【24ヶ月契約】<span style="color: #f7716f;"><strong>15％オフ</strong></span><br>・【36ヶ月契約】<span style="color: #f7716f;"><strong>20％オフ</strong></span><br><br>より長期のご契約ほどお得にご利用可能に！</td>
</tr>
</tbody>
</table></div>
</figure>
</div></div>



<h3 class="wp-block-heading"><span id="toc6">プラン別料金</span></h3>



<a rel="nofollow noopener noreferrer" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T6L5W+7YDKAQ+CO4+2BH6Q9">
<img decoding="async" border="0" width="468" height="60" alt="" src="https://www29.a8.net/svt/bgt?aid=230414756481&#038;wid=003&#038;eno=01&#038;mid=s00000001642014021000&#038;mc=1"></a>
<img decoding="async" border="0" width="1" height="1" src="https://www19.a8.net/0.gif?a8mat=3T6L5W+7YDKAQ+CO4+2BH6Q9" alt="">



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box has-border-color has-amber-border-color open-toggle"><input id="toggle-checkbox-202312191813060" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202312191813060">キャンペーン中料金</label><div class="toggle-content">
<figure class="wp-block-table is-style-regular">
<div class="scrollable-table"><table class="has-fixed-layout org-table">
<thead>
<tr>
<th>メモリ</th>
<th>CPU</th>
<th>1ヶ月</th>
<th>3ヶ月</th>
<th>6ヶ月</th>
<th>12ヶ月</th>
<th>24ヶ月</th>
<th>36ヶ月</th>
</tr>
</thead>
<tbody>
<tr>
<th>1GB</th>
<th>2コア</th>
<td>&#8211;</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>&#8211;</td>
</tr>
<tr>
<th>2GB</th>
<th>3コア</th>
<td>2,200</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>1,881</td>
<td>1,729</td>
<td>1,584</td>
</tr>
<tr>
<th>4GB</th>
<th>4コア</th>
<td>4,400</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>3,762</td>
<td>3,549</td>
<td>3,168</td>
</tr>
<tr>
<th>8GB</th>
<th>6コア</th>
<td>8,800</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>7,524</td>
<td>6,919</td>
<td>6,336</td>
</tr>
<tr>
<th>16GB</th>
<th>8コア</th>
<td>17,600</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>15,048</td>
<td>13,838</td>
<td>12,672</td>
</tr>
<tr>
<th>32GB</th>
<th>12コア</th>
<td>35,200</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>30,096</td>
<td>27,676</td>
<td>25,344</td>
</tr>
<tr>
<th>64GB</th>
<th>24コア</th>
<td>70,400</td>
<td>&#8211;</td>
<td>&#8211;</td>
<td>60,192</td>
<td>55,352</td>
<td>50,688</td>
</tr>
</tbody>
</table></div>
</figure>
</div></div>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box has-border-color has-key-color-border-color is-style-default"><input id="toggle-checkbox-202312191813061" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202312191813061">通常料金</label><div class="toggle-content">
<figure class="wp-block-table is-style-regular"><div class="scrollable-table"><table class="has-fixed-layout org-table"><thead><tr><th>メモリ</th><th>CPU</th><th>1ヶ月</th><th>3ヶ月</th><th>6ヶ月</th><th>12ヶ月</th><th>24ヶ月</th><th>36ヶ月</th></tr></thead><tbody><tr><th>1GB</th><th>2コア</th><td>&#8211;</td><td>&#8211;</td><td>&#8211;</td><td>&#8211;</td><td>&#8211;</td><td>&#8211;</td></tr><tr><th>2GB</th><th>3コア</th><td>2,200</td><td>&#8211;</td><td>&#8211;</td><td>2,090</td><td>2,035</td><td>1,980</td></tr><tr><th>4GB</th><th>4コア</th><td>4,400</td><td>&#8211;</td><td>&#8211;</td><td>4,180</td><td>4,070</td><td>3,960</td></tr><tr><th>8GB</th><th>6コア</th><td>8,800</td><td>&#8211;</td><td>&#8211;</td><td>8,360</td><td>8,140</td><td>7,920</td></tr><tr><th>16GB</th><th>8コア</th><td>17,600</td><td>&#8211;</td><td>&#8211;</td><td>16,720</td><td>16,280</td><td>15,840</td></tr><tr><th>32GB</th><th>12コア</th><td>35,200</td><td>&#8211;</td><td>&#8211;</td><td>33,440</td><td>32,560</td><td>31,680</td></tr><tr><th>64GB</th><th>24コア</th><td>70,400</td><td>&#8211;</td><td>&#8211;</td><td>66,880</td><td>65,120</td><td>63,360</td></tr></tbody></table></div></figure>
</div></div>



<p>※SSDはどのプランでも100GB<br>※金額は1ヶ月あたりの料金</p>



<p>ConoHaと違って「メモリ：1GB、CPU：2コア」のプランと「３ヶ月、６ヶ月」プランが無い</p>



<p>スペックの方は使い物にならないから使わないし、期間の方も刻んだところで値引き率は低いので個人的には気にならない範囲</p>



<h3 class="wp-block-heading"><span id="toc7">オプション料金</span></h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout org-table"><tbody><tr><th>リモートデスクトップ SAL</th><td>990</td></tr><tr><th>Microsoft Office SAL</th><td>3,080</td></tr><tr><th>SQL Server</th><td>1,320</td></tr><tr><th>追加SSD:200GB</th><td>2,750</td></tr></tbody></table></div></figure>



<p>後述しますが<strong>リモートデスクトップ SAL</strong>は必須レベル</p>



<p>他は使い道次第ですが、月額料金をかけてまで契約する必要はあまりないかと</p>



<h2 class="wp-block-heading"><span id="toc8">ConoHaのプラン別料金表</span></h2>



<a rel="nofollow noopener noreferrer" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T8KHY+5KN56Q+50+5MK3FL">
<img decoding="async" border="0" width="728" height="90" alt="" src="https://www22.a8.net/svt/bgt?aid=230507206337&#038;wid=003&#038;eno=01&#038;mid=s00000000018034022000&#038;mc=1"></a>
<img decoding="async" border="0" width="1" height="1" src="https://www16.a8.net/0.gif?a8mat=3T8KHY+5KN56Q+50+5MK3FL" alt="">



<h3 class="wp-block-heading"><span id="toc9">プラン別料金</span></h3>



<figure class="wp-block-table is-style-regular"><div class="scrollable-table"><table class="has-fixed-layout org-table"><thead><tr><th>メモリ</th><th>CPU</th><th>1ヶ月</th><th>3ヶ月</th><th>6ヶ月</th><th>12ヶ月</th><th>24ヶ月</th><th>36ヶ月</th></tr></thead><tbody><tr><th>1GB</th><th>2コア</th><td>1,210</td><td>1,186</td><td>1,150</td><td>1,102</td><td>1,089</td><td>1,077</td></tr><tr><th>2GB</th><th>3コア</th><td>2,420</td><td>2,360</td><td>2,299</td><td>2,215</td><td>2,203</td><td>2,178</td></tr><tr><th>4GB</th><th>4コア</th><td>4,719</td><td>4,568</td><td>4,477</td><td>4,320</td><td>4,308</td><td>4,296</td></tr><tr><th>8GB</th><th>6コア</th><td>9,317</td><td>9,196</td><td>9,075</td><td>8,531</td><td>8,507</td><td>8,470</td></tr><tr><th>16GB</th><th>8コア</th><td>17,545</td><td>17,243</td><td>16,940</td><td>16,081</td><td>16,033</td><td>15,972</td></tr><tr><th>32GB</th><th>12コア</th><td>35,574</td><td>35,090</td><td>34,485</td><td>32,610</td><td>32,549</td><td>32,428</td></tr><tr><th>64GB</th><th>24コア</th><td>72,358</td><td>71,390</td><td>70,180</td><td>66,308</td><td>65,945</td><td>65,340</td></tr></tbody></table></div></figure>



<p>※SSDはどのプランでも100GB<br>※金額は1ヶ月あたりの料金<br>※1ヶ月の料金は時間課金タイプの上限</p>



<p>プラン料金はserverに比べて若干お高い料金設定</p>



<p>代わりにオプション料金が若干やすいのでトータルで考えれば差は無いと思って良さそう</p>



<h3 class="wp-block-heading"><span id="toc10">オプション料金</span></h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout org-table"><tbody><tr><th>リモートデスクトップ SAL</th><td>770</td></tr><tr><th>Microsoft Office SAL</th><td>2,530</td></tr><tr><th>自動バックアップ</th><td>363</td></tr><tr><th>追加SSD:200GB</th><td>3,025</td></tr><tr><th>追加SSD:500GB</th><td>5,445</td></tr><tr><th>追加SSD:1TB</th><td>8,954</td></tr><tr><th>追加SSD:5TB</th><td>44,770</td></tr><tr><th>追加SSD:10TB</th><td>89,540</td></tr></tbody></table></div></figure>



<p>自動バックアップはVPSなのに必要なの？って気もしますがお安いのでお好みで</p>



<p>その他はXserverと同じく使い道に合わせてお好みで</p>



<h2 class="wp-block-heading"><span id="toc11">オススメのプランと比較</span></h2>



<p>※プラン料金に個人的必須な<strong>リモートデスクトップ SAL</strong>料金を加算しています</p>



<figure class="wp-block-table is-style-regular"><div class="scrollable-table"><table class="has-fixed-layout org-table"><caption>メモリ：2GB　CPU：3コア</caption><thead><tr><th>ｻｰﾋﾞｽ</th><th>区分</th><th>1ヶ月</th><th>3ヶ月</th><th>6ヶ月</th><th>12ヶ月</th><th>24ヶ月</th><th>36ヶ月</th></tr></thead><tbody><tr><th rowspan="2">Xserver</th><th>ｷｬﾝﾍﾟｰﾝ</th><td>3,190</td><td>&#8211;</td><td>&#8211;</td><td>2,871</td><td>2,719</td><td>2,574</td></tr><tr><th>通常</th><td>3,190</td><td>&#8211;</td><td>&#8211;</td><td>3,080</td><td>3,025</td><td>2,970</td></tr><tr><th>ConoHa</th><th>&#8211;</th><td>3,190</td><td>3,130</td><td>3,069</td><td>2,985</td><td>2,973</td><td>2,948</td></tr></tbody></table></div></figure>



<figure class="wp-block-table is-style-regular"><div class="scrollable-table"><table class="has-fixed-layout org-table"><caption>メモリ：3GB　CPU：4コア</caption><thead><tr><th>ｻｰﾋﾞｽ</th><th>区分</th><th>1ヶ月</th><th>3ヶ月</th><th>6ヶ月</th><th>12ヶ月</th><th>24ヶ月</th><th>36ヶ月</th></tr></thead><tbody><tr><th rowspan="2">Xserver</th><th>ｷｬﾝﾍﾟｰﾝ</th><td>5,390</td><td>&#8211;</td><td>&#8211;</td><td>5,170</td><td>5,060</td><td>4,158</td></tr><tr><th>通常</th><td>5,390</td><td>&#8211;</td><td>&#8211;</td><td>5,170</td><td>5,060</td><td>4,950</td></tr><tr><th>ConoHa</th><th>&#8211;</th><td>5,489</td><td>5,338</td><td>5,247</td><td>5,090</td><td>5,078</td><td>5,066</td></tr></tbody></table></div></figure>



<p>私が実際に契約しているのは「<span class="marker-under-blue"><strong>メモリ</strong>：<strong>2GB</strong>、<strong>CPU</strong>：<strong>3コア</strong></span>」のプラン</p>



<p>今のところ定期実行にメモリが必要な処理は少ないのでこれで十分</p>



<p>予算との相談もあってこのプランにしましたが「<span class="marker-under-red"><strong>メモリ</strong>：<strong>4GB</strong>、<strong>CPU</strong>：<strong>4コア</strong></span>」が可能ならそちらの方がオススメ（と言うかプラン変更しようか悩んでます）</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-memo block-box">
<p class="has-watery-yellow-background-color has-background">正直この2社では金額・性能で大差はないと思うのでお好みで良いかと！（私はWordpressをXserverと契約している＆キャンペーン値引きがあったのでXserverにしました）</p>
</div>



<h2 class="wp-block-heading"><span id="toc12">Xserverでの契約手続き</span></h2>



<p>契約のためのサイトは<a rel="noreferrer noopener" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T6L5W+7YDKAQ+CO4+2BCWEQ">コチラ</a>から</p>



<figure class="wp-block-image"><a rel="nofollow noreferrer noopener" target="_blank" href="https://px.a8.net/svt/ejp?a8mat=3T6L5W+7YDKAQ+CO4+2BH6Q9"><img decoding="async" src="https://www23.a8.net/svt/bgt?aid=230414756481&amp;wid=003&amp;eno=01&amp;mid=s00000001642014021000&amp;mc=1" alt=""/></a></figure>



<p>※先にXserverのアカウント登録が必要です</p>



<h3 class="wp-block-heading"><span id="toc13">申し込み画面</span></h3>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55.png"><img decoding="async" width="622" height="1024" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55-622x1024.png" alt="" class="wp-image-1126" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55-622x1024.png 622w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55-182x300.png 182w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55-91x150.png 91w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55-768x1264.png 768w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55-934x1536.png 934w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-16_18h40_55.png 1080w" sizes="(max-width: 622px) 100vw, 622px" /></a></figure>



<p>各項目については以下に</p>



<h3 class="wp-block-heading"><span id="toc14">サーバーの種類</span></h3>



<p>今回はWindows Serverを契約したいわけなので&#8221;<span class="marker-under">Windowsサーバーのお申し込み</span>&#8220;をクリック<br>※初期値は&#8221;<span class="marker-under-blue">VPSのお申し込み</span>&#8220;になっています</p>



<h3 class="wp-block-heading"><span id="toc15">サーバー名</span></h3>



<p>初期値は&#8221;win-yyyy-mm-dd-hh-mm-ss&#8221;ですがお好みで変更を</p>



<h3 class="wp-block-heading"><span id="toc16">プラン</span></h3>



<p>ここもお好みですが私は24時間Pythonプログラムが実行できれば満足でスペックは一番下の&#8221;<span class="marker-under">メモリ：2GB</span>&#8220;にしました</p>



<h3 class="wp-block-heading"><span id="toc17">サーバーの契約期間</span></h3>



<ul class="has-watery-blue-background-color has-background wp-block-list">
<li>1ヶ月</li>



<li>12ヶ月</li>



<li>24ヶ月</li>



<li>36ヶ月</li>
</ul>



<p>から選ぶのですが、長ければ長い方がお得！（当たり前）</p>



<h3 class="wp-block-heading"><span id="toc18">イメージタイプ</span></h3>



<p>契約する対象を選ぶ</p>



<p>サーバーのEdition（プルダウン）はこだわりがなければその時の最新を選んでおけばいいと思う</p>



<p>それと別に契約の組み合わせを選ぶ</p>



<ul class="has-watery-blue-background-color has-background wp-block-list">
<li>Windows Server</li>



<li>Windows Server for Remote Desktop</li>



<li>Windows Server for Remote Desktop+Office（EXCEL、WORD、POWER POINT）</li>
</ul>



<p>Remote Desktopは使い勝手の都合、個人的には必須</p>



<p>OfficeソフトはMicrosoft 365 (旧Office 365)のライセンスが使えないのでWindows ServerでもOfficeソフトを使いたいなら契約が必要</p>



<p>OfficeはわざわざWindows Serverで使う必要がないかなと思うので私は&#8221;<span class="marker-under">サーバー＋Remote Desktop</span>&#8220;にしました</p>



<h3 class="wp-block-heading"><span id="toc19">ライセンス</span></h3>



<h4 class="wp-block-heading"><span id="toc20">リモートデスクトップ SAL</span></h4>



<p class="has-watery-green-background-color has-background">「リモートデスクトップ接続」を利用するために必要なライセンス契約です。<br>ご利用人数分のご契約が必要です。</p>



<p>とのこと</p>



<p>個人利用だけなら1個で十分ですが誰かにメンテナンスしてほしいとか、共同利用したいとかあれば1～2個余剰を持っていても良いかも</p>



<h4 class="wp-block-heading"><span id="toc21">Microsoft Office SAL</span></h4>



<p class="has-watery-green-background-color has-background">「Microsoft Office」を利用するために必要なライセンス契約です。<br>ご利用人数分のご契約が必要です。</p>



<p>考え方は基本的にリモートデスクトップ SALと同じ</p>



<p>ただ地味にお値段高いので契約するにしても必要最低限にしたいところ</p>



<h3 class="wp-block-heading"><span id="toc22">Administratorパスワード&nbsp;</span></h3>



<p>記載されているポリシーに合わせてご自由に</p>



<p class="has-watery-green-background-color has-background">半角英大文字、半角英小文字、半角数字、半角記号（\^$+-*/|()[]{}.,?!_=&amp;@~%#:;'&#8221;）から3種類以上を含んだ9文字以上70文字以内</p>



<p>管理者パスワードだし堅牢にしたいけど考えるのがめんどくさい方は↓↓↓がオススメ</p>




<a rel="noopener noreferrer" target="_blank" href="https://www.luft.co.jp/cgi/randam.php" title="パスワード生成（パスワード作成）ツール" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://www.luft.co.jp/cgi/share.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">パスワード生成（パスワード作成）ツール</div><div class="blogcard-snippet external-blogcard-snippet">パスワード生成（パスワード作成）するweb・ウェブ制作に役立...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.luft.co.jp/cgi/randam.php" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.luft.co.jp</div></div></div></div></a>



<p>ちなみに全ての契約手続きが終わった後、初回ログインで使うので控えておく</p>



<h3 class="wp-block-heading"><span id="toc23">最後に</span></h3>



<p>&#8220;「Xserver VPS利用規約」に同意する&#8221;にチェックを入れて&#8221;お申し込み内容を確認する&#8221;ボタンを押下</p>



<p>この後は最終確認と支払い関係の画面なので割愛・・・</p>



<h2 class="wp-block-heading"><span id="toc24">契約が終わったら管理ページへ</span></h2>



<h3 class="wp-block-heading"><span id="toc25">ログインページ</span></h3>



<p>VPS用のログインページへ</p>




<a rel="noopener noreferrer" target="_blank" href="https://secure.xserver.ne.jp/xapanel/login/xvps/" title="XServer&#12450;&#12459;&#12454;&#12531;&#12488; - &#12525;&#12464;&#12452;&#12531;&#65372;VPS&#12539;&#20206;&#24819;&#23554;&#29992;&#12469;&#12540;&#12496;&#12540;&#65372;XServer VPS" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fsecure.xserver.ne.jp%2Fxapanel%2Flogin%2Fxvps%2F?w=320&#038;h=198" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="198" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">XServer&#12450;&#12459;&#12454;&#12531;&#12488; - &#12525;&#12464;&#12452;&#12531;&#65372;VPS&#12539;&#20206;&#24819;&#23554;&#29992;&#12469;&#12540;&#12496;&#12540;&#65372;XServer VPS</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://secure.xserver.ne.jp/xapanel/login/xvps/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">secure.xserver.ne.jp</div></div></div></div></a>



<h3 class="wp-block-heading"><span id="toc26">VPS契約管理ページ</span></h3>



<p>色々メニューはありますがとりあえず&#8221;VPS管理&#8221;画面へ</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07.png"><img decoding="async" width="1024" height="490" src="https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07-1024x490.png" alt="" class="wp-image-1771" srcset="https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07-1024x490.png 1024w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07-300x144.png 300w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07-150x72.png 150w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07-768x368.png 768w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07-1536x735.png 1536w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h30_07.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc27">VPSパネル</span></h3>



<p>契約直後はまだサーバー起動準備中なので右上の電源状態が&#8221;稼働中&#8221;になるまで待つ</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38.png"><img decoding="async" width="1024" height="490" src="https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38-1024x490.png" alt="" class="wp-image-1772" srcset="https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38-1024x490.png 1024w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38-300x144.png 300w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38-150x72.png 150w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38-768x368.png 768w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38-1536x735.png 1536w, https://javeo.jp/wp-content/uploads/2023/12/2023-12-19_17h33_38.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc28">リモートデスクトップ SALを使わないサーバー起動</span></h3>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>ここからRemote Desktopの契約が必要な理由が・・</p>
</div>



<p>VPSパネルで電源ステータス左にある&#8221;コンソール&#8221;ボタンを押下するとWindowsのログイン画面になるのですがまず画面が小さい・・（なんだこの余白は）</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20.jpg"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20-1024x555.jpg" alt="" class="wp-image-1133" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20-1024x555.jpg 1024w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20-300x163.jpg 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20-150x81.jpg 150w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20-768x416.jpg 768w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20-1536x832.jpg 1536w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_00h58_20.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>そしてロック解除のために画面に従って&#8221;Ctrl + Alt + Del&#8221;キーを押下すると・・PC本体の方に反応してロック解除されない</p>



<p>結論としては画面右上にある&#8221;Send CtrlAltDel&#8221;ボタンを押す必要がありました</p>



<p>続いてパスワード入力</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22.jpg"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22-1024x555.jpg" alt="" class="wp-image-1134" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22-1024x555.jpg 1024w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22-300x163.jpg 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22-150x81.jpg 150w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22-768x416.jpg 768w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22-1536x832.jpg 1536w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-17_01h21_22.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>申し込み画面で登録していた<strong>Administratorパスワード</strong>を入力</p>



<p>私は何となく堅牢な方がいいと思って32桁で半角英大文字、半角英小文字、半角数字、半角記号を全て含んだ乱数にしたのですがこれが仇に・・</p>



<p>もちろんメモは取っていたのですがコピペができない（泣く泣く手打ちしました）</p>



<p>当然パスワードなので堅牢な方がいいですが、この段階ではほどほどに</p>



<p>無事ログインした後の画面がコチラ</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49.jpg"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49-1024x555.jpg" alt="" class="wp-image-1136" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49-1024x555.jpg 1024w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49-300x163.jpg 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49-150x81.jpg 150w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49-768x416.jpg 768w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49-1536x832.jpg 1536w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-19_18h54_49.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>やっぱり小っさ！！</p>



<p>ってことで前置きが長くなりましたが<strong>リモートデスクトップ SAL</strong>は契約した方がイライラから解放されるのでお勧めですよって話でした</p>



<h2 class="wp-block-heading"><span id="toc29">リモートデスクトップを使ってサーバーに接続</span></h2>



<p>スタートメニューで&#8221;Windows アクセサリ → リモートデスクトップ接続&#8221;</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1.jpg"><img decoding="async" width="1024" height="576" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1-1024x576.jpg" alt="" class="wp-image-1154" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1-1024x576.jpg 1024w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1-300x169.jpg 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1-150x84.jpg 150w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1-768x432.jpg 768w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1-1536x864.jpg 1536w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-20_09h03_33-1.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>VPSパネルにIPアドレスを入れて</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16.png"><img decoding="async" width="475" height="295" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16.png" alt="" class="wp-image-1156" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16.png 475w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16-300x186.png 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16-150x93.png 150w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16-240x148.png 240w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h07_16-320x198.png 320w" sizes="(max-width: 475px) 100vw, 475px" /></a></figure>



<p><strong>Administratorパスワード</strong>を入れて</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h15_33-1.png"><img decoding="async" width="456" height="368" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h15_33-1.png" alt="" class="wp-image-1158" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h15_33-1.png 456w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h15_33-1-300x242.png 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-22_17h15_33-1-150x121.png 150w" sizes="(max-width: 456px) 100vw, 456px" /></a></figure>



<p>Windowsのデスクトップが表示されるので後は好きなようにアプリインストールとかしちゃってくださ（↓はスクショ取り忘れて少しアプリインストールした後です・・）</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1.jpg"><img decoding="async" width="1024" height="576" src="https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1-1024x576.jpg" alt="" class="wp-image-1161" srcset="https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1-1024x576.jpg 1024w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1-300x169.jpg 300w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1-150x84.jpg 150w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1-768x432.jpg 768w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1-1536x864.jpg 1536w, https://javeo.jp/wp-content/uploads/2023/04/2023-04-23_12h36_09-1.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading"><span id="toc30">あとがき</span></h2>



<p>私はこのWindows Serverを使ってクローリングからのXポストやLINE通知をするプログラムを日々実行しています</p>



<p>同じような環境が欲しい人はWindows Serverを契約して、外注でプログラム＆環境構築してもらえれば実現可能なので是非検討をー</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/contracts-windows-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】Beautifulsoupでタグがない部分を取得する</title>
		<link>https://javeo.jp/beautifulsoup-sample1/</link>
					<comments>https://javeo.jp/beautifulsoup-sample1/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Fri, 03 Nov 2023 23:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Beautifulsoup]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=1469</guid>

					<description><![CDATA[目次 &#8220;タグがない部分&#8221;の具体例取得しようとした時の問題タグ間の文字を取得する例separatorを設定してsplitで無理やり区切るちなみにget_textの仕様要らない部分を削除する初期値cl [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>直接指定する方法はまだわかっていませんが、暫定的に取得する方法があったのでまとめています</p>



<p>ちなみに私は&#8221;find&#8221;ではなく&#8221;select&#8221;派です</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">&#8220;タグがない部分&#8221;の具体例</a></li><li><a href="#toc2" tabindex="0">取得しようとした時の問題</a></li><li><a href="#toc3" tabindex="0">タグ間の文字を取得する例</a><ol><li><a href="#toc4" tabindex="0">separatorを設定してsplitで無理やり区切る</a><ol><li><a href="#toc5" tabindex="0">ちなみにget_textの仕様</a></li></ol></li><li><a href="#toc6" tabindex="0">要らない部分を削除する</a><ol><li><a href="#toc7" tabindex="0">初期値</a></li><li><a href="#toc8" tabindex="0">clear()</a></li><li><a href="#toc9" tabindex="0">extract()</a></li><li><a href="#toc10" tabindex="0">decompose()</a></li><li><a href="#toc11" tabindex="0">replace_with()</a></li></ol></li><li><a href="#toc12" tabindex="0">next系、previous系で取得する</a></li></ol></li><li><a href="#toc13" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">&#8220;タグがない部分&#8221;の具体例</span></h2>



<p>&#8220;タグがない部分&#8221;だとイマイチ伝わらないのでサンプルを</p>



<p>ソースにするとこれ</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-html" data-file="sample_html" data-lang="HTML"><code>&lt;div class=&quot;test&quot;&gt;
    ①ここを取得したい&lt;p class=one&gt;、ここはいらない、けど&lt;/p&gt;②ここも取得する
    &lt;p class=two&gt;③ここも取得したい&lt;/p&gt;
    &lt;p class=three&gt;ここもいらない&lt;/p&gt;
&lt;/div&gt;</code></pre></div>



<p>htmlなので本当に&#8221;タグがない&#8221;なんてことはないんですが、<span class="marker-under">ピンポイントで指定するためのタグがない</span>ってのが正しい表現</p>



<p>スクレイピングしてると何度かであって苦慮したのでまとめてみました</p>



<p>↓は練習とかに使いたい人用</p>



<div class="test">
    ①ここを取得したい<p class=one>、ここはいらない、けど</p>②ここも取得する
    <p class=two>③ここも取得したい</p>
    <p class=three>ここもいらない</p>
</div>



<h2 class="wp-block-heading"><span id="toc2">取得しようとした時の問題</span></h2>



<p>まず簡単なところで③の取得から</p>



<p>基本的な方法なのであえて説明する必要もないかと</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>print(soup.select_one(&#39;div.test &gt; p.two&#39;).get_text())
&gt;&gt;③ここも取得したい</code></pre></div>



<p>問題は①と②の取得方法、、</p>



<p>当該箇所にタグがないので&#8221;find&#8221;や&#8221;select&#8221;で指定できない（と思う）</p>



<p>じゃあどうするのってのがここから</p>



<h2 class="wp-block-heading"><span id="toc3">タグ間の文字を取得する例</span></h2>



<h3 class="wp-block-heading"><span id="toc4">separatorを設定してsplitで無理やり区切る</span></h3>



<p>まずはソースから</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>print(soup.select_one(&#39;div.test&#39;).get_text(separator=&#39;||&#39;, strip=True).split(&#39;||&#39;))
&gt;&gt;[&#39;①ここを取得したい、&#39;, &#39;②ここはいらない、けど&#39;, &#39;③ここも取得する&#39;, &#39;④ここも取得したい&#39;, &#39;⑤ここもいらない&#39;]</code></pre></div>



<p>Beautifulsoupを使い始めてすぐの頃&#8221;get_text&#8221;の引数に&#8221;separator&#8221;と&#8221;strip&#8221;があるのを知らなかったわけですが、&#8221;separator&#8221;を設定するとタグ間に無理やり指定の文字を挿入できます</p>



<p>つまり、&#8221;separator&#8221;に適当な文字を設定して、同じ文字で&#8221;split&#8221;すればリストにできるのであとはインデックスを指定してあげればOK</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>print(soup.select_one(&#39;div.test&#39;).get_text(separator=&#39;||&#39;, strip=True).split(&#39;||&#39;)[0])
&gt;&gt;&#39;①ここを取得したい、&#39;
print(soup.select_one(&#39;div.test&#39;).get_text(separator=&#39;||&#39;, strip=True).split(&#39;||&#39;)[2])
&gt;&gt;&#39;③ここも取得する&#39;
print(soup.select_one(&#39;div.test&#39;).get_text(separator=&#39;||&#39;, strip=True).split(&#39;||&#39;)[3])
&gt;&gt;&#39;④ここも取得したい&#39;</code></pre></div>



<h4 class="wp-block-heading"><span id="toc5">ちなみにget_textの仕様</span></h4>



<p>どうやって&#8221;separator&#8221;を挿入してるんだと思ったら、そもそも<span class="marker-under-red">Beautifulsoupはelement（≒タグ）で分割されている仕様</span>で、初期値空白でjoinで結合しているので値を指定すれば挟み込めるわけですね</p>



<p>ついでに引数の&#8221;strip&#8221;がなんでタグ毎にstripが適用されるかと言うとこの仕様によるものでした</p>



<p>（たまにパッケージの仕様を調べるとプログラムの作り方の参考になりますよね）</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>def get_text(self, separator=&quot;&quot;, strip=False, types=default):
    &quot;&quot;&quot;Get all child strings of this PageElement, concatenated using the
    given separator.

    :param separator: Strings will be concatenated using this separator.

    :param strip: If True, strings will be stripped before being
        concatenated.

    :param types: A tuple of NavigableString subclasses. Any
        strings of a subclass not found in this list will be
        ignored. Although there are exceptions, the default
        behavior in most cases is to consider only NavigableString
        and CData objects. That means no comments, processing
        instructions, etc.

    :return: A string.
    &quot;&quot;&quot;
    return separator.join([s for s in self._all_strings(strip, types=types)])</code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">要らない部分を削除する</span></h3>



<p>この方法だと要素を削除するのでやり方次第では順番を間違えると④が取得できないのでご注意</p>



<p>削除の仕方はいくつかあるので下記からお好きな方法を</p>



<h4 class="wp-block-heading"><span id="toc7">初期値</span></h4>



<p>参考にするため、まず何もせずに当該箇所を指定してprintした結果を</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>print(soup.select_one(&#39;div.test&#39;))
&gt;&gt;&lt;div class=&quot;test&quot;&gt;
    ①ここを取得したい、&lt;p class=&quot;one&quot;&gt;②ここはいらない、けど&lt;/p&gt;③ここも取得する
    &lt;p class=&quot;two&quot;&gt;④ここも取得したい&lt;/p&gt;
&lt;p class=&quot;three&quot;&gt;⑤ここもいらない&lt;/p&gt;
&lt;/div&gt;</code></pre></div>



<h4 class="wp-block-heading"><span id="toc8">clear()</span></h4>



<p>指定したタグ内の文字だけ消してタグは残るパターン</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>soup.select_one(&#39;div.test &gt; p.one&#39;).clear()
print(soup.select_one(&#39;div.test&#39;))
&gt;&gt;&lt;div class=&quot;test&quot;&gt;
    ①ここを取得したい、&lt;p class=&quot;one&quot;&gt;&lt;/p&gt;③ここも取得する
    &lt;p class=&quot;two&quot;&gt;④ここも取得したい&lt;/p&gt;
&lt;p class=&quot;three&quot;&gt;⑤ここもいらない&lt;/p&gt;
&lt;/div&gt;</code></pre></div>



<p>&#8220;②ここはいらない、けど&#8221;の文字だけが削除されている</p>



<h4 class="wp-block-heading"><span id="toc9">extract()</span></h4>



<p>タグを削除しつつ、要素を取り出す　※つまり切り取りのようなもの</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>element = soup.select_one(&#39;div.test &gt; p.one&#39;).extract()
print(element)
&gt;&gt;&lt;p class=&quot;one&quot;&gt;②ここはいらない、けど&lt;/p&gt;

print(soup.select_one(&#39;div.test&#39;))
&gt;&gt;&lt;div class=&quot;test&quot;&gt;
    ①ここを取得したい、③ここも取得する
    &lt;p class=&quot;two&quot;&gt;④ここも取得したい&lt;/p&gt;
&lt;p class=&quot;three&quot;&gt;⑤ここもいらない&lt;/p&gt;
&lt;/div&gt;</code></pre></div>



<p>タグごとelementに代入されていることがわかる</p>



<h4 class="wp-block-heading"><span id="toc10">decompose()</span></h4>



<p>タグを削除するのみ　※これがズバリ削除</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>element = soup.select_one(&#39;div.test &gt; p.one&#39;).decompose()
print(element)
&gt;&gt;

print(soup.select_one(&#39;div.test&#39;))
&gt;&gt;&lt;div class=&quot;test&quot;&gt;
    ①ここを取得したい、、③けどここも取得する
    &lt;p class=&quot;two&quot;&gt;④ここも取得したい&lt;/p&gt;
&lt;p class=&quot;three&quot;&gt;⑤ここもいらない&lt;/p&gt;
&lt;/div&gt;</code></pre></div>



<p>こっちはelementをprintしても何もないので純粋に削除されていることがわかる</p>



<h4 class="wp-block-heading"><span id="toc11">replace_with()</span></h4>



<p>文字通り置き換える</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>element = soup.select_one(&#39;div.test &gt; p.one&#39;).replace_with(&#39;[hgoe]&#39;)
print(element)
&gt;&gt;&lt;p class=&quot;one&quot;&gt;、ここはいらない、けど&lt;/p&gt;

print(soup.select_one(&#39;div.test&#39;))
&gt;&gt;&lt;div class=&quot;test&quot;&gt;
    ①ここを取得したい[hgoe]②ここも取得する
    &lt;p class=&quot;two&quot;&gt;④ここも取得したい&lt;/p&gt;
&lt;p class=&quot;three&quot;&gt;ここもいらない&lt;/p&gt;
&lt;/div&gt;</code></pre></div>



<p>extractと同じで置換前のelementは変数に代入する</p>



<p>つまり、置換後の文字を空白にすればextractと同じ結果になる</p>



<h3 class="wp-block-heading"><span id="toc12">next系、previous系で取得する</span></h3>



<p>指定したelementの前後が取得できる&#8221;next系&#8221;や&#8221;previous系&#8221;で無理矢理取得する</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>print(soup.select_one(&#39;div.test&#39;).next_element.get_text())
&gt;&gt;&#39;\n    ①ここを取得したい&#39;

print(soup.select_one(&#39;div.test &gt; p.one&#39;).previous_element.get_text())
&gt;&gt;&#39;\n    ①ここを取得したい&#39;

print(soup.select_one(&#39;div.test &gt; p.one&#39;).next_sibling.get_text())
&gt;&gt;&#39;②ここも取得する\n    &#39;

print(soup.select_one(&#39;div.test &gt; p.two&#39;).previous_sibling.get_text())
&gt;&gt;&#39;②ここも取得する\n    &#39;</code></pre></div>



<p>これが一番真っ当な取得方法な気がする</p>



<h2 class="wp-block-heading"><span id="toc13">あとがき</span></h2>



<p>調べてもなかなか出てこない情報なので自分なりにまとめてみました</p>



<p>そもそもサイト構成としてどうなの？とは思うところですが、こちらがとやかく言う話ではないのでどうにかこねくり回して取得していきましょう</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/beautifulsoup-sample1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
