<?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>スクレイピング &#8211; まったりエンジニア</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>Sat, 27 Jun 2026 15:13:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2-32x32.png</url>
	<title>スクレイピング &#8211; まったりエンジニア</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>CSSセレクタの書き方 自動化で要素を狙う指定方法【Selenium】</title>
		<link>https://javeo.jp/css-selector/</link>
					<comments>https://javeo.jp/css-selector/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 15:51:27 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4586</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/css-selector-1-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>自動化(Selenium・スクレイピング)で「要素を特定する」ためのCSSセレクタの書き方をまとめました、デザイン用のCSSとの違い、id・class・属性・結合子・nth-childの使い分け、動的id対策やDevTools任せの落とし穴まで、Pythonの例つきで解説します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/css-selector-1-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">SeleniumやスクレイピングでWebページを自動操作するとき、最初の関門になるのが「狙った要素をどう指定するか」です、ボタンを押す・文字を入力する・値を読み取る、どれも先に<strong>その要素を特定する</strong>ことから始まります</p>



<p class="wp-block-paragraph">そのときの「住所」にあたるのが<strong><span class="swl-marker mark_yellow">CSSセレクタ</span></strong>です、ページの中の「ここの要素」を文字列で言い当てるための書き方で、これが書けると自動化はぐっとラクになります</p>



<p class="wp-block-paragraph">CSSセレクタというとWebデザイン(見た目をつける)の文脈で出てくることが多いんですが、この記事では<strong>自動化で要素を狙う視点</strong>に絞ってまとめます、同じセレクタでも、デザインで便利な書き方と自動化で効く書き方は少しズレるので、そのあたりも整理していきます</p>



<p class="wp-block-paragraph">使用例はPython版のSeleniumで書きますが、<strong><span class="swl-marker mark_yellow">セレクタの構文そのものは言語やツールに依存しません</span></strong>、VBA版のSeleniumでも、BeautifulSoupのようなスクレイピングでも、<strong>UiPathやPower Automate DesktopといったRPAツール</strong>でも、Web要素を指す手段としてCSSセレクタが使えます、Pythonを使っていない方も、セレクタの部分はそのまま読み替えられます</p>



<p class="wp-block-paragraph">実際にブラウザを動かす操作コード(クリックや入力、待機、ループなど)は言語ごとの記事にまとめているので、この記事は<strong>「セレクタの書き方そのもの」に集中</strong>します、たとえばSeleniumVBAでの実装なら「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」にあります</p>



<h2 class="wp-block-heading">デザイン用のCSSと、自動化のセレクタは何が違う？</h2>



<p class="wp-block-paragraph">セレクタの具体的な書き方に入る前に、まずここを押さえておくと迷いません、<strong>同じCSSセレクタでも、見た目をつける(デザイン)目的と、要素を特定する(自動化)目的では、効くものと効かないものが違う</strong>んです</p>



<p class="wp-block-paragraph">大きく分けると、違いは次の4つです</p>



<h3 class="wp-block-heading">違い1 状態・装飾むけの擬似クラス・擬似要素は要素特定に効かない</h3>



<p class="wp-block-paragraph">デザインでよく使う <strong>::before</strong> や <strong>::after</strong>(擬似要素)は、自動化では使えません、これは見た目の上では存在しても、<strong><span class="swl-marker mark_yellow">DOM(ページの構造)には実体のノードが無い</span></strong>からです</p>



<p class="wp-block-paragraph">大事なのは、これがエラーになるのではなく<strong>常に「空」が返る</strong>という点です、MDNにも、擬似要素を含むセレクタは返り値が常に空になると明記されています、つまり「見つからない」のではなく「最初から取れない」ので、原因に気づきにくいハマりどころです</p>



<p class="wp-block-paragraph">同じく <strong>:hover</strong> / <strong>:focus</strong> / <strong>:active</strong> のような操作状態の擬似クラスも、自動化での要素特定にはほぼ使えません、構文としては有効ですが、「その瞬間その状態の要素」しか返さないので、静的に要素を狙う用途には向かないんです、フォーカス中の要素が必要なら、セレクタではなく <strong>activeElement</strong> を使うのが定石になります</p>



<h3 class="wp-block-heading">違い2 判定基準は「見た目に効くか」ではなく「querySelectorAllが解釈できるか」</h3>



<p class="wp-block-paragraph">ここが一番のキモです、自動化で使えるセレクタかどうかの判定基準は、<strong>そのセレクタをブラウザの querySelectorAll が解釈できるかどうか</strong>です</p>



<p class="wp-block-paragraph">というのも、SeleniumでCSSセレクタ指定(<strong>By.CssSelector</strong>)を使うと、<strong><span class="swl-marker mark_yellow">内部ではブラウザの querySelectorAll が呼ばれます</span></strong>、これはW3CのWebDriver仕様で定義されている動きです、要素1つを取る指定は先頭の1件、複数取る指定は当てはまる全件が返ります</p>



<p class="wp-block-paragraph">つまり、<strong>querySelectorが解釈できるセレクタ＝Seleniumで使えるセレクタ</strong>と考えてOKです、ブラウザのDevToolsのコンソールで <strong>document.querySelectorAll(&#8220;セレクタ&#8221;)</strong> を試して、ちゃんと要素が返ればSeleniumでも同じく使えます、これは自分でセレクタを検証するときにも役立つ考え方です</p>



<h3 class="wp-block-heading">違い3 「中の文字」では選べない</h3>



<p class="wp-block-paragraph">自動化だと「『送信』と書かれたボタンを押したい」のように、<strong>表示テキストで要素を狙いたい</strong>場面がよくあります、ところがCSSセレクタには、これがありません</p>



<p class="wp-block-paragraph"><strong>:contains()</strong> という書き方を見かけることがありますが、これはjQuery独自の非標準セレクタです、ブラウザの querySelectorAll に渡すとエラー(SyntaxError)になるので、Seleniumでも使えません</p>



<p class="wp-block-paragraph">テキストの中身で要素を選びたいときは、CSSではなく<strong>XPath</strong>の出番です、XPathなら <strong>text()</strong> や <strong>contains()</strong> が使えて、たとえば <strong>//button[contains(., &#8216;送信&#8217;)]</strong> のように「『送信』を含むボタン」を狙えます、このあたりの実装は実践コード集の方でも触れているので、後ほどリンクします</p>



<h3 class="wp-block-heading">違い4 「壊れにくさ」という評価軸が増える</h3>



<p class="wp-block-paragraph">デザイン用のCSSは、自分のサイトのHTMLに対して書くので、構造が変われば自分でセレクタも直せます、ところが自動化は<strong>他人のサイト(自分で変えられないHTML)</strong>を相手にすることが多いです</p>



<p class="wp-block-paragraph">すると、<strong><span class="swl-marker mark_yellow">そのセレクタが「ページの作りが少し変わっても壊れにくいか」</span></strong>という、装飾CSSには無かった評価軸が出てきます、同じ要素を狙うのにも、壊れにくい書き方と壊れやすい書き方があって、自動化では前者を選ぶ意識が要ります、この観点は後半のTipsでも具体的に見ていきます</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">まとめると、自動化のセレクタは「<strong>querySelectorAllが解釈できる範囲</strong>」で、「<strong>状態・装飾むけのものは除く</strong>」、「<strong>テキストで選ぶならXPath</strong>」、そして「<strong>壊れにくさも意識する</strong>」、この4点を頭に置いておけば、あとは個別の書き方を覚えるだけです</p>
</div></div>



<h2 class="wp-block-heading">基本のセレクタ(id・class・タグ)</h2>



<p class="wp-block-paragraph">まずは土台になる基本のセレクタからです、ここは自動化でもデザインでも共通で、一番よく使うところです</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:800px;"><thead><tr><th>探したいもの</th><th>セレクタ</th><th>例</th></tr></thead><tbody><tr><td>id で探す</td><td>#id名</td><td>#search</td></tr><tr><td>class で探す</td><td>.class名</td><td>.btn</td></tr><tr><td>タグ名で探す</td><td>タグ名</td><td>input</td></tr><tr><td>複数クラスのAND(両方持つ)</td><td>.classA.classB</td><td>.btn.primary</td></tr><tr><td>グループ化のOR(どちらか)</td><td>セレクタA, セレクタB</td><td>.btn, .link</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ポイントになるのが、下2つの組み合わせです、<strong>.btn.primary</strong> のように<strong>クラスをくっつけて書く</strong>と「両方のクラスを持つ要素」を狙えます(AND)、間にスペースを入れないのがコツで、スペースを入れると意味が変わるので注意です</p>



<p class="wp-block-paragraph">逆に<strong>カンマで区切る</strong>と「どちらかに当てはまる要素」をまとめて取れます(OR)、複数種類のボタンをいっぺんに集めたいときなどに便利です</p>



<p class="wp-block-paragraph">Python版のSeleniumだと、こんな感じで指定します、<strong>find_element</strong> の第2引数に、上のセレクタ文字列をそのまま渡すだけです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from selenium.webdriver.common.by import By

# id が search の要素を探す
driver.find_element(By.CSS_SELECTOR, "#search")

# class が btn かつ primary の要素(両方のクラスを持つもの)
driver.find_element(By.CSS_SELECTOR, ".btn.primary")

# input タグを全部取る(find_elements は複数形・リストで返る)
driver.find_elements(By.CSS_SELECTOR, "input")</code></pre></div>



<p class="wp-block-paragraph">セレクタの文字列が同じなら、VBA版のSeleniumでも考え方は同じです、VBAなら <strong>driver.FindElement(By.CssSelector, &#8220;#search&#8221;)</strong> のようにメソッド名や書き方は変わりますが、渡すセレクタ文字列(<strong>#search</strong>)はまったく同じものを使えます</p>



<h2 class="wp-block-heading">属性セレクタ(動的id・class対策の主役)</h2>



<p class="wp-block-paragraph">ここからが、自動化でとくに頼りになるセレクタです、<strong>属性セレクタ</strong>は、要素が持つ属性(name・type・href・id・classなど)を手がかりに要素を狙う書き方です</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:900px;"><thead><tr><th>狙い方</th><th>セレクタ</th><th>意味・例</th></tr></thead><tbody><tr><td>属性が存在する</td><td>[attr]</td><td>[disabled] … disabled属性を持つ</td></tr><tr><td>完全一致</td><td>[attr=&#8217;値&#8217;]</td><td>[name=&#8217;q&#8217;] … nameがちょうど q</td></tr><tr><td>前方一致(で始まる)</td><td>[attr^=&#8217;値&#8217;]</td><td>[id^=&#8217;btn-&#8216;] … idが btn- で始まる</td></tr><tr><td>後方一致(で終わる)</td><td>[attr$=&#8217;値&#8217;]</td><td>[href$=&#8217;.pdf&#8217;] … hrefが .pdf で終わる</td></tr><tr><td>部分一致(を含む)</td><td>[attr*=&#8217;値&#8217;]</td><td>[class*=&#8217;primary&#8217;] … classに primary を含む</td></tr><tr><td>単語一致(空白区切り)</td><td>[attr~=&#8217;値&#8217;]</td><td>空白区切りの単語のどれかに一致</td></tr><tr><td>ハイフン始まり一致</td><td>[attr|=&#8217;値&#8217;]</td><td>値 か 値- で始まる(lang指定などで使う)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">このうち、自動化でとくに重宝するのが<strong><span class="swl-marker mark_yellow">前方一致(^=)・後方一致($=)・部分一致(*=)の3つ</span></strong>です、なぜかというと、最近のサイトは <strong>id=&#8221;btn-8f3a2&#8243;</strong> のように、<strong>毎回ランダムに変わるid・class</strong>を持っていることが多いからです</p>



<p class="wp-block-paragraph">こういう「変わる部分」を完全一致で書くと、ページを開き直すたびに壊れます、そこで、<strong>変わらない部分だけを前方一致や部分一致で拾う</strong>と安定します、たとえば <strong>btn-</strong> の部分が固定なら、後ろのランダム文字は無視して <strong>[id^=&#8217;btn-&#8216;]</strong> で狙う、という具合です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># name 属性が q の要素(完全一致)
driver.find_element(By.CSS_SELECTOR, "[name='q']")

# id が btn- で始まる要素(後ろがランダムでもOK・前方一致)
driver.find_element(By.CSS_SELECTOR, "[id^='btn-']")

# class に primary を含む要素(部分一致)
driver.find_element(By.CSS_SELECTOR, "[class*='primary']")

# href が .pdf で終わるリンクを全部取る(後方一致)
driver.find_elements(By.CSS_SELECTOR, "[href$='.pdf']")</code></pre></div>



<p class="wp-block-paragraph">ちなみに、値の大文字・小文字を無視したいときは、閉じカッコの直前に <strong> i</strong> を付けます、<strong>[type=&#8217;text&#8217; i]</strong> のように書くと、TEXT でも Text でもマッチします、地味ですが、サイトによって表記がそろっていないときに効きます</p>



<h2 class="wp-block-heading">結合子(子孫・直下・隣接・一般兄弟)</h2>



<p class="wp-block-paragraph">セレクタ同士をつないで「位置関係」で絞り込むのが<strong>結合子</strong>です、似た要素がたくさんあるページで、狙った1つに寄せるときに効いてきます</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:900px;"><thead><tr><th>結合子</th><th>書き方</th><th>意味</th></tr></thead><tbody><tr><td>子孫(スペース)</td><td>.親 .子</td><td>親の中にある(何段下でもよい)</td></tr><tr><td>直下の子(&gt;)</td><td>.親 &gt; .子</td><td>親のすぐ下の子だけ</td></tr><tr><td>隣接兄弟(+)</td><td>.A + .B</td><td>Aの直後にある兄弟B(1つだけ)</td></tr><tr><td>一般兄弟(~)</td><td>.A ~ .B</td><td>Aより後ろにある兄弟Bすべて</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">このうち、<strong>子孫(スペース)</strong>と<strong>直下の子(&gt;)</strong>は基本でよく使うので、ここでは軽めにいきます、ざっくり言うと、スペースは「ずっと下まで含めて探す」、<strong>&gt;</strong> は「すぐ下の階層だけに限定する」です</p>



<p class="wp-block-paragraph">むしろ覚えておきたいのが、後半の2つ、<strong>隣接兄弟(+)</strong>と<strong>一般兄弟(~)</strong>です、これは「ある要素の<strong>横(同じ親の中の並び)</strong>」を狙う書き方で、フォームのラベルと入力欄のような「隣り合った要素」を取るときに便利です</p>



<p class="wp-block-paragraph"><strong>+</strong> は「<strong><span class="swl-marker mark_yellow">直後の兄弟1つだけ</span></strong>」、<strong>~</strong> は「<strong>後ろに続く兄弟すべて</strong>」を指します、たとえば「<strong>label</strong> のすぐ後ろの <strong>input</strong>」を狙うなら <strong>label + input</strong>、「ある見出しより後ろにある段落を全部」なら <strong>h2 ~ p</strong> という具合です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># .list の中にある .item をすべて(子孫・何段下でもよい)
driver.find_elements(By.CSS_SELECTOR, ".list .item")

# .list のすぐ下の .item だけ(直下の子)
driver.find_elements(By.CSS_SELECTOR, ".list &gt; .item")

# label の直後にある input(隣接兄弟・1つだけ)
driver.find_element(By.CSS_SELECTOR, "label + input")

# .title より後ろに並ぶ .row をすべて(一般兄弟)
driver.find_elements(By.CSS_SELECTOR, ".title ~ .row")</code></pre></div>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">兄弟系の結合子はあくまで「<strong>後ろ方向</strong>」しか狙えません、「直前の兄弟」や「親」を遡る指定はCSSセレクタにはありません(親方向は後半で触れます)、横の並びは前から後ろへ、と覚えておくと混乱しにくいです</p>
</div></div>



<h2 class="wp-block-heading">位置・除外で狙う(:nth-child・:not とFindElements+indexの使い分け)</h2>



<p class="wp-block-paragraph">「上から何番目」や「これは除く」という狙い方もあります、構造系の擬似クラスと呼ばれるもので、自動化でも普通に使えます、ただ、ここはSeleniumならではの選択肢もあるので、その使い分けまで含めて見ていきます</p>



<h3 class="wp-block-heading">除外できる :not() はCSSの強み</h3>



<p class="wp-block-paragraph">まず、自動化でも素直に役立つのが <strong>:not()</strong> です、これは「<strong>カッコ内のセレクタに当てはまらないもの</strong>」を狙う書き方で、「○○以外」をセレクタ1本で表現できます</p>



<p class="wp-block-paragraph">たとえば <strong>input:not([disabled])</strong> と書くと、「<strong><span class="swl-marker mark_yellow">無効化されていない入力欄だけ</span></strong>」を取れます、押せないボタンや入力できない欄を最初から除けるので、自動化のエラー回避にそのまま効きます、これはVBA側でループして弾く手間が省けるので、CSSセレクタならではの便利さです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 無効化(disabled)されていない input だけを取る
driver.find_elements(By.CSS_SELECTOR, "input:not([disabled])")</code></pre></div>



<h3 class="wp-block-heading">:nth-child は「使えるけど、集めてループでも同じ」</h3>



<p class="wp-block-paragraph">「上から○番目の要素」を狙うのが <strong>:nth-child(n)</strong> です、ほかにも <strong>:first-child</strong>(最初)、<strong>:last-child</strong>(最後)、<strong>:nth-of-type(n)</strong>(同じタグの中で○番目)があります</p>



<p class="wp-block-paragraph">これらは確かに使えるんですが、自動化では<strong><span class="swl-marker mark_yellow">FindElements で全部集めてから、index(番号)やループで取り出しても同じこと</span></strong>ができます、どちらが正解というより、両方できると知っておくのが良いです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 方法A セレクタで「2番目の li」を直接狙う
driver.find_element(By.CSS_SELECTOR, "li:nth-child(2)")

# 方法B 全部集めてから index で2番目を取る(リストは0始まりなので [1] が2番目)
els = driver.find_elements(By.CSS_SELECTOR, "li")
print(els[1].text)   # [0]が1番目、[1]が2番目</code></pre></div>



<p class="wp-block-paragraph">むしろ <strong>:nth-child</strong> には、知らないとハマるクセがあります、これは「<strong>すべての兄弟をひっくるめて数えた○番目</strong>」を見るので、たとえば <strong>li:nth-child(2)</strong> は「2番目の子が li ならそれ」という意味です、もし li の前に別のタグが混じっていると、番号がズレて狙いが外れます</p>



<p class="wp-block-paragraph">「同じ種類のタグの中での○番目」が欲しいなら、<strong>:nth-of-type</strong> の方が直感に近いです、ただ、このあたりの数え方の混乱もあって、自動化では<strong>FindElements で集めてindexやループで取り出す方が、結果が読めて安全な場面が多い</strong>と感じます、番号がズレる心配がなく、コードを見ても何番目を取っているかが分かりやすいからです</p>



<p class="wp-block-paragraph">ついでに、CSSで「親に近いこと」をやりたいなら <strong>:has()</strong> という擬似クラスもあります、<strong>div:has(&gt; img)</strong> で「imgを直下に持つdiv」のように、中身を条件にして親側を狙えます、ただし<strong><span class="swl-marker mark_yellow">:has() は比較的新しい機能</span></strong>(Chrome・Edgeは105、Safariは15.4、Firefoxは121以降)なので、古いブラウザを自動操作する場合は注意してください</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">使い分けの目安はこんな感じです、<strong>「○○以外」を除くのは :not() が手早い</strong>、<strong>「上から○番目」は :nth-child でも書けるが、FindElements で集めてindex・ループの方が読めて安全なことが多い</strong>、と覚えておけば十分です、どちらにしても、位置で狙う指定は<strong>ページの構造が変わると壊れやすい</strong>ので、可能ならidやclass・属性で狙える方を先に探すのがおすすめです、実際のループ処理の書き方は「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」の複数要素ループの章にまとめています</p>
</div></div>



<h2 class="wp-block-heading">自動化での実践Tips</h2>



<p class="wp-block-paragraph">最後に、セレクタを実際に書くときに効いてくるコツを、いくつかまとめておきます、ここを意識すると、壊れにくくて読みやすいセレクタが書けるようになります</p>



<h3 class="wp-block-heading">一意に絞るコツ … 属性やclassを組み合わせる</h3>



<p class="wp-block-paragraph">狙った1つに絞れないときは、<strong>条件を足して組み合わせる</strong>のが基本です、タグ＋属性、class＋属性、親の中の子…と重ねていくと、似た要素の中から目的のものを言い当てられます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># タグ + 属性 + 親で絞り込む(検索フォームの中の送信ボタンなど)
driver.find_element(By.CSS_SELECTOR, "form.search button[type='submit']")</code></pre></div>



<h3 class="wp-block-heading">動的id・classは部分一致で逃がす</h3>



<p class="wp-block-paragraph">さっきの属性セレクタの章ともつながりますが、<strong>毎回変わるid・class</strong>を相手にするときは、完全一致を避けて<strong>前方一致・部分一致</strong>で「変わらない部分」だけを拾います、これは動的なページを自動操作するときの定番テクニックです</p>



<h3 class="wp-block-heading">DevToolsの「Copy selector」は鵜呑みにしない</h3>



<p class="wp-block-paragraph">ブラウザのDevToolsには、要素を右クリックして「Copy selector」でセレクタをコピーできる機能があります、便利なんですが、<strong><span class="swl-marker mark_yellow">出てくるのは body からの長い nth-child パスになりがち</span></strong>で、これがけっこう脆いんです</p>



<p class="wp-block-paragraph">こういう「上から数えていく」パスは、ページの作りがちょっと変わるだけで簡単に壊れます、なので、コピーしたものをそのまま使うより、<strong>ユニークなidやclassを見つけて手で書き直す</strong>方が、ずっと壊れにくいセレクタになります、Copy selectorは「とっかかり」くらいに考えておくのがちょうどいいです</p>



<h3 class="wp-block-heading">テキスト・親方向で狙うときはXPath</h3>



<p class="wp-block-paragraph">ここまで見てきたとおり、CSSセレクタには2つだけ苦手があります、<strong>表示テキストで選ぶこと</strong>と、<strong>子から親へ遡ること</strong>です、この2つはXPathの担当だと割り切ると、迷わなくなります</p>



<figure class="wp-block-table is-style-stripes"><table><thead><tr><th>やりたいこと</th><th>得意なほう</th></tr></thead><tbody><tr><td>id・class・属性で特定</td><td>CSS(簡潔)</td></tr><tr><td>構造(子孫・兄弟)で特定</td><td>CSS(簡潔)</td></tr><tr><td>表示テキストで選ぶ</td><td>XPath(text() / contains())</td></tr><tr><td>子から親へ遡る</td><td>XPath(.. を使う)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">テキストで探す書き方(全要素を集めてループで文字一致を見る方法)や、親へ遡る <strong>&#8220;..&#8221;</strong> の使い方は、「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」でVBA版の実際のコード付きで紹介しています、CSSで狙えるところはCSSで、苦手なところだけXPathで、と分担させるのが組みやすいです</p>



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



<p class="wp-block-paragraph">自動化で要素を狙うCSSセレクタの書き方を、ひととおり整理してみました、最後にポイントをまとめておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>自動化で使えるセレクタかどうかは「<strong>querySelectorAllが解釈できるか</strong>」が判定基準、<strong>::before</strong> などの擬似要素は常に空が返る、<strong>:contains()</strong> は非標準で使えない</li>



<li>基本は <strong>#id</strong> / <strong>.class</strong> / タグ、複数クラスのANDは <strong>.a.b</strong>、ORは <strong>カンマ区切り</strong>で書ける</li>



<li>毎回変わるid・class対策には、<strong>属性の前方一致(^=)・部分一致(*=)</strong>が主役、結合子は子孫(スペース)・直下(&gt;)・隣接兄弟(+)・一般兄弟(~)</li>



<li>「○○以外」は <strong>:not()</strong>、位置で狙う <strong>:nth-child</strong> は使えるが番号のズレに注意、<strong>FindElements で集めてindex・ループ</strong>の方が安全な場面も多い</li>



<li>DevToolsの <strong>Copy selector</strong> は脆いので手で書き直す、テキスト・親方向はXPathに任せる</li>
</ul>



<p class="wp-block-paragraph">セレクタの書き方そのものは、ここまでの内容でだいたいカバーできます、あとは実際にブラウザを動かすコード(クリック・入力・待機・ループなど)と組み合わせるだけです、SeleniumVBAでの実装は「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」に、導入から知りたい方は「<a href="https://javeo.jp/selenium-vba/" target="_blank" rel="noopener noreferrer">Excelでもブラウザ操作！SeleniumVBAの使い方</a>」にまとめてあります</p>



<p class="wp-block-paragraph">Python版で「結局どのByを使えばいいの？」というところは「<a href="https://javeo.jp/selenium-find-element/" target="_blank" rel="noopener noreferrer">Seleniumのfind_elementの使い方</a>」が、要素が出てくるまで待つ書き方は「<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Selenium WebDriverWaitの使い方</a>」が参考になります、Chromeの起動オプションまわりは「<a href="https://javeo.jp/chrome-options-service/" target="_blank" rel="noopener noreferrer">SeleniumのOptionsとServiceまとめ</a>」も合わせてどうぞ</p>



<p class="wp-block-paragraph">セレクタが書けるようになると、自動化でできることが一気に広がります、まずは身近なページで、DevToolsの <strong>document.querySelectorAll()</strong> を使ってセレクタを試してみるところから始めてみてください</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240" alt="Pythonクローリング&amp;スクレイピング 増補改訂版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Pythonクローリング&amp;スクレイピング 増補改訂版</p><p class="jv-book-author">加藤耕太</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4297107384">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4297107384">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "Pythonクローリング&スクレイピング 増補改訂版", "a": "加藤耕太", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F", "id": "4297107384"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/css-selector/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SeleniumVBAの使い方 実践コード集【VBA】</title>
		<link>https://javeo.jp/selenium-vba-code/</link>
					<comments>https://javeo.jp/selenium-vba-code/#comments</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 14:38:52 +0000</pubDate>
				<category><![CDATA[Excel・VBA]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4571</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/selenium-vba-code-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>SeleniumVBAで実際によく書くコードを実践編としてまとめました、要素の探し方をBy.CssSelectorに寄せるコツ、クリックや入力・待機やIsPresentでの存在チェック・プルダウン・複数要素ループ・スクショ・JS実行、そして便利なヘルパー関数まで、コピペで使える形で解説します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/selenium-vba-code-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">SeleniumVBAを入れてみたものの、「で、実際にやりたい操作はどう書くの？」というところで止まっていませんか？</p>



<p class="wp-block-paragraph">導入と基本の流れは前の記事「<a href="https://javeo.jp/selenium-vba/" target="_blank" rel="noopener noreferrer">Excelでもブラウザ操作！SeleniumVBAの使い方</a>」で書いたので、この記事は<strong><span class="swl-marker mark_yellow">実際に書くコードに集中した実践編</span></strong>です、導入はそちらで済んでいる前提で進めます</p>



<p class="wp-block-paragraph">クリックや入力、待機、要素の存在チェック、プルダウン、複数要素のループ、スクショ、JavaScript実行…と、ブラウザ自動化で「結局これ毎回書くよね」というコードをまとめました、私が普段よく使う書き方をベースにしているので、コピペして手を入れながら使ってもらえればと思います</p>



<p class="wp-block-paragraph">最初に一番だいじな「要素の探し方」から見ていきます、ここを <strong>By.CssSelector</strong> に寄せておくと、あとがぐっとラクになります</p>



<h2 class="wp-block-heading">要素の探し方は By.CssSelector に寄せる</h2>



<p class="wp-block-paragraph">SeleniumVBAで要素を探すときは <strong>FindElement(By.X, &#8220;値&#8221;)</strong> という形で書きます、この <strong>By</strong> には id・class・name・タグ名・CSSセレクタ・XPath…と何種類か指定できるんですが、初心者のうちは全部覚えようとしなくて大丈夫です</p>



<p class="wp-block-paragraph">個人的なおすすめは、<strong><span class="swl-marker mark_yellow">基本は By.CssSelector ひとつに寄せる</span></strong>やり方です、CSSセレクタはWeb制作でも使う書き方で、id・class・属性・子孫…とだいたいの探し方をこれ1本でカバーできます、覚えることが減るぶん、つまずきにくくなります</p>



<p class="wp-block-paragraph">「探したいもの」と「CSSセレクタの書き方」を対応表にするとこんな感じです</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:800px;"><thead><tr><th>探したいもの</th><th>CSSセレクタ</th><th>例</th></tr></thead><tbody><tr><td>id で探す</td><td>#id名</td><td>#search</td></tr><tr><td>class で探す</td><td>.class名</td><td>.btn</td></tr><tr><td>name 属性で探す</td><td>[name=&#8217;値&#8217;]</td><td>[name=&#8217;q&#8217;]</td></tr><tr><td>タグ名で探す</td><td>タグ名</td><td>div</td></tr><tr><td>属性で探す</td><td>タグ[属性=&#8217;値&#8217;]</td><td>input[type=&#8217;text&#8217;]</td></tr><tr><td>子孫をたどる(スペース)</td><td>.親 .子</td><td>.list .item</td></tr><tr><td>直下の子に限定(&gt;)</td><td>.親 &gt; .子</td><td>.list &gt; .item</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">そして、これらを<strong>スペース(子孫)</strong>や<strong>「&gt;」(直下の子)</strong>でつなげられるのがCSSセレクタの強みです、階層をたどって狙った要素をピンポイントに指定できるので、似た要素がたくさんあるページほどここが効いてきます</p>



<p class="wp-block-paragraph">属性での絞り込み(<strong>[id^=]</strong>など)や <strong>:not</strong>・<strong>:nth-child</strong> といったCSSセレクタ自体の書き方は、別記事「<a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方 自動化で要素を狙う指定方法</a>」に詳しくまとめたので、狙った要素がうまく取れないときはこちらもどうぞ</p>



<p class="wp-block-paragraph">たとえば id が &#8220;search&#8221; の検索ボックスを探すなら、こう書けます、<strong>By.Name</strong> や <strong>By.ID</strong> を使い分けなくても、CSSセレクタの書き方を変えるだけで済むのがラクなところです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' id が search の要素を探す
Dim el As WebElement
Set el = driver.FindElement(By.CssSelector, "#search")

' name 属性が q の要素を探す(Googleの検索ボックスなど)
Set el = driver.FindElement(By.CssSelector, "[name='q']")</code></pre></div>



<p class="wp-block-paragraph">ちなみに <strong>FindElementByCssSelector(&#8220;#search&#8221;)</strong> のように、Byを書かずに呼べるショートカットのメソッドも用意されています、どちらでも結果は同じなので、書きやすい方で大丈夫です</p>



<h3 class="wp-block-heading">CSSで足りないとき … テキスト検索はループ、親だけXPath</h3>



<p class="wp-block-paragraph">正直に書いておくと、CSSセレクタは「要素の中の文字で探す」のと「子から親へさかのぼる」のが苦手です、SeleniumVBAには <strong>By.LinkText</strong> や <strong>By.XPath</strong> もあるので手っ取り早くはそれを使えばいいんですが、<strong><span class="swl-marker mark_yellow">By.CssSelectorに寄せ切りたいなら、テキスト検索は独自functionで再現できます</span></strong></p>



<p class="wp-block-paragraph">考え方はシンプルで、<strong>CSSで候補を集めて、VBAでループしながらtext一致を探す</strong>だけです、まずはリンクを表示文字で探す関数、全aタグを集めてループするので、これで <strong>By.LinkText</strong> の代わりになります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' リンクを表示文字で探す(全aタグをループしてtext一致・LinkTextの代わり)
Public Function FindLinkByText(driver As WebDriver, ByVal keyword As String) As WebElement
    Dim els As WebElements, el As WebElement
    Set els = driver.FindElements(By.CssSelector, "a")
    For Each el In els
        If InStr(el.GetText, keyword) &gt; 0 Then
            Set FindLinkByText = el
            Exit Function
        End If
    Next el
    Set FindLinkByText = Nothing   ' 見つからなければ Nothing
End Function</code></pre></div>



<p class="wp-block-paragraph">同じ考え方を、リンク以外の要素にも広げたのがこちらです、探す範囲のCSSセレクタとキーワードを渡すと、その中からtext一致の要素を返します、<strong>「送信」という文字のボタン</strong>のような、<strong>By.XPath</strong> でやりがちなテキスト検索を、CSSとループだけで書けます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 指定CSSの要素をループして表示文字で探す(XPathを使わずtext一致)
Public Function FindByText(driver As WebDriver, ByVal cssSel As String, _
                           ByVal keyword As String) As WebElement
    Dim els As WebElements, el As WebElement
    Set els = driver.FindElements(By.CssSelector, cssSel)
    For Each el In els
        If InStr(el.GetText, keyword) &gt; 0 Then
            Set FindByText = el
            Exit Function
        End If
    Next el
    Set FindByText = Nothing
End Function

' 使い方(button の中からテキスト「送信」を探す)
' FindByText(driver, "button", "送信").Click</code></pre></div>



<p class="wp-block-paragraph">これで、リンク文字もテキスト一致も <strong>By.CssSelector</strong> ＋ループで書けるので、覚える <strong>By</strong> を増やさずに済みます</p>



<p class="wp-block-paragraph">そして、<strong><span class="swl-marker mark_yellow">CSSでもループでも唯一どうにもならないのが、子から親へさかのぼる逆引き</span></strong>です、CSSは子孫しか選べないので、ここだけは <strong>By.XPath</strong> の <strong>&#8220;..&#8221;</strong>(親を表す書き方)を使います</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 見つけた要素から親をたどる(CSSでは無理・XPathの ".." を使う)
Dim child As WebElement, parent As WebElement
Set child = driver.FindElement(By.CssSelector, "#price")

' その要素を起点に ".." で親要素を取る
Set parent = child.FindElement(By.XPath, "..")</code></pre></div>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">整理すると、<strong>子・孫への絞り込み</strong>はCSSセレクタ、<strong>テキストで探す</strong>のはCSSセレクタ＋ループの独自function、<strong>子から親への逆引き</strong>だけがXPathの <strong>&#8220;..&#8221;</strong>、という棲み分けです、ほぼCSSに寄せておいて、親をたどるときだけXPathを出す、くらいの感覚でちょうどいいと思います</p>
</div></div>



<h2 class="wp-block-heading">よく使う操作コード集</h2>



<p class="wp-block-paragraph">ここからは、見つけた要素に対して「何をするか」のコードをまとめていきます、どれも前の記事の基本コード(<strong>StartChrome → OpenBrowser → NavigateTo</strong> でページを開いたあと)の流れの中で使う想定です</p>



<h3 class="wp-block-heading">クリックする・文字を入力する</h3>



<p class="wp-block-paragraph">クリックは <strong>Click</strong>、文字入力は <strong>SendKeys</strong> です、入力欄に元から入っている文字を消したいときは、<strong>SendKeys</strong> の <strong>clearBeforeTyping</strong> を True にするか、先に <strong>Clear</strong> を呼びます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' ボタンをクリック
driver.FindElement(By.CssSelector, ".btn-search").Click

' 入力欄に文字を打ち込む
driver.FindElement(By.CssSelector, "[name='q']").SendKeys "SeleniumVBA"

' 元の文字を消してから入力(clearBeforeTyping)
driver.FindElement(By.CssSelector, "#keyword").SendKeys "新しい値", clearBeforeTyping:=True

' 入力欄を空にするだけ
driver.FindElement(By.CssSelector, "#keyword").Clear

' フォームを送信する
driver.FindElement(By.CssSelector, "#keyword").Submit</code></pre></div>



<h3 class="wp-block-heading">テキスト・属性・CSSを取り出す</h3>



<p class="wp-block-paragraph">表示テキストを取るのは <strong>GetText</strong>、リンク先(href)などの属性は <strong>GetAttribute</strong>、文字色などの見た目は <strong>GetCSSProperty</strong> で取れます、メソッド名を間違えやすいところなので、ここはまとめて覚えておくと安心です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Dim el As WebElement
Set el = driver.FindElement(By.CssSelector, "#title")

' 表示テキストを取る
Debug.Print el.GetText

' 属性を取る(リンク先の href など)
Debug.Print el.GetAttribute("href")

' 見た目のCSS値を取る(文字色など)
Debug.Print el.GetCSSProperty("color")

' 中のHTMLやタグ名を取りたいとき
Debug.Print el.GetInnerHTML
Debug.Print el.GetTagName

' 表示・有効・選択の状態を真偽値で取れる
Debug.Print el.IsDisplayed
Debug.Print el.IsEnabled
Debug.Print el.IsSelected</code></pre></div>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">名前を取り違えやすいので注意です、テキストは <strong>.Text</strong> ではなく <strong>GetText</strong>(メソッド)、CSS値は <strong>GetCSSProperty</strong> で取ります、PythonのSeleniumと名前が少し違うので、ここは間違えやすいポイントです</p>
</div></div>



<h3 class="wp-block-heading">待機する(ImplicitMaxWait が基本)</h3>



<p class="wp-block-paragraph">ブラウザ自動化でハマりやすいのが「要素がまだ表示されていないのに探しにいって失敗する」パターンです、対策の基本が <strong>ImplicitMaxWait</strong> です</p>



<p class="wp-block-paragraph">これを設定しておくと、<strong><span class="swl-marker mark_yellow">以降の FindElement が、要素が出てくるまで自動でリトライしながら待ってくれます</span></strong>、ページ表示がもたつくサイトでも、これだけでだいぶ安定します</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 以降の FindElement は、最大10秒まで要素を待つ(ミリ秒指定)
driver.ImplicitMaxWait = 10000

' 単純にその場で止めたいだけなら Wait(ミリ秒)
driver.Wait 1000   ' 1秒待つ</code></pre></div>



<p class="wp-block-paragraph"><strong>ImplicitMaxWait</strong> は「要素が出るまで待つ賢い待機」、<strong>Wait</strong> は「とにかく指定ミリ秒止まる」だけのシンプルな待機です、基本は <strong>ImplicitMaxWait</strong> を最初に1回セットしておき、どうしても固定で待ちたい場面だけ <strong>Wait</strong> を足す、という使い分けがおすすめです</p>



<h3 class="wp-block-heading">要素があるか確認する(IsPresent)</h3>



<p class="wp-block-paragraph">覚えておきたいのが、<strong>FindElement</strong> は要素が見つからないとエラーになる、という点です、なので「あるかどうか分からない要素」を相手にするときは、いきなり <strong>FindElement</strong> しないほうが安全です</p>



<p class="wp-block-paragraph">そこで使うのが <strong>IsPresent</strong> です、これは要素があるかどうかを <strong>True / False</strong> で返してくれるので、エラーで止まらずに分岐できます、第3引数で「この要素は最大何ミリ秒待つか」も指定できます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 要素があるかを True / False で確認する
If driver.IsPresent(By.CssSelector, ".alert") Then
    Debug.Print "アラートが出ています"
End If

' 待ち時間を指定しつつ、見つかった要素を受け取る
Dim el As WebElement
If driver.IsPresent(By.CssSelector, "#result", 5000, , el) Then
    Debug.Print el.GetText   ' 見つかったときだけ使う
End If</code></pre></div>



<p class="wp-block-paragraph">最後の引数に <strong>ByRef</strong> で変数を渡すと、見つかった要素をそのまま受け取れます、「あるか確認 → あれば使う」を1回で書けるので、地味に便利です</p>



<h3 class="wp-block-heading">プルダウン(select)を選ぶ</h3>



<p class="wp-block-paragraph">プルダウン(select要素)は、専用のメソッドで選べます、表示文字で選ぶ <strong>SelectByVisibleText</strong>、値で選ぶ <strong>SelectByValue</strong>、順番で選ぶ <strong>SelectByIndex</strong> の3つを覚えておけば十分です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Dim sel As WebElement
Set sel = driver.FindElement(By.CssSelector, "#prefecture")

' 表示されている文字で選ぶ
sel.SelectByVisibleText "東京都"

' value 属性の値で選ぶ
sel.SelectByValue "13"

' 上から数えた順番で選ぶ(0始まり)
sel.SelectByIndex 0</code></pre></div>



<h3 class="wp-block-heading">複数の要素をまとめて取る・ループする</h3>



<p class="wp-block-paragraph">1つではなく、条件に合う要素を<strong>全部</strong>取りたいときは <strong>FindElements</strong>(複数形)を使います、これは要素のコレクションを返すので、<strong>For Each</strong> でぐるっと回せます、一覧ページから値をまとめて拾うときの定番です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Dim els As WebElements
Dim el As WebElement

' class="item" の要素を全部取る
Set els = driver.FindElements(By.CssSelector, ".item")

For Each el In els
    Debug.Print el.GetText
Next el</code></pre></div>



<h3 class="wp-block-heading">表をまるごとExcelに取り込む</h3>



<p class="wp-block-paragraph">VBAでブラウザを動かす一番のうまみが、<strong><span class="swl-marker mark_yellow">取ってきた値をそのままExcelに書き出せる</span></strong>ことです、ページの表(table要素)なら、<strong>TableToArray</strong> で2次元配列にできるので、シートへの貼り付けがかなりラクになります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' ページの表を2次元配列にして、シートに一気に貼る
Dim tbl As WebElement
Set tbl = driver.FindElement(By.CssSelector, "table#data")

Dim arr As Variant
arr = tbl.TableToArray

Range("A1").Resize(UBound(arr, 1) + 1, UBound(arr, 2) + 1).Value = arr

' 1セルずつ書きたいときは For Each で
Dim els As WebElements, el As WebElement, r As Long
Set els = driver.FindElements(By.CssSelector, ".price")
r = 1
For Each el In els
    Cells(r, 1).Value = el.GetText
    r = r + 1
Next el</code></pre></div>



<p class="wp-block-paragraph">逆に、Excelの一覧を読みながらページを順に開く、という回し方もできます、A列に並べたURLやIDを <strong>For</strong> で回して、そのつど <strong>NavigateTo</strong> でページを開けば、Excel主導のブラウザ自動化が組めます</p>



<h3 class="wp-block-heading">スクリーンショットを撮る</h3>



<p class="wp-block-paragraph">画面の証跡を残したいときは <strong>SaveScreenshot</strong> です、ページ全体・特定の要素だけ・縦に長いページの全体…と撮り分けられます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 表示中の画面を保存
driver.SaveScreenshot "C:\temp\shot.png"

' 縦に長いページ全体を保存(fullScreenShot)
driver.SaveScreenshot "C:\temp\full.png", , fullScreenShot:=True

' 特定の要素だけ保存
Dim el As WebElement
Set el = driver.FindElement(By.CssSelector, "#chart")
el.SaveScreenshot "C:\temp\chart.png"</code></pre></div>



<h3 class="wp-block-heading">iframe・タブを切り替える</h3>



<p class="wp-block-paragraph">ページの中に別ページが埋め込まれている <strong>iframe</strong> の中身は、そのままだと操作できません、<strong>SwitchToFrame</strong> で中に入って、終わったら <strong>SwitchToDefaultContent</strong> で元に戻ります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' iframe の中に入る
Dim frame As WebElement
Set frame = driver.FindElement(By.CssSelector, "iframe#content")
driver.SwitchToFrame frame

' iframe 内の要素を操作したあと、元のページに戻る
driver.SwitchToDefaultContent</code></pre></div>



<p class="wp-block-paragraph">タブやウィンドウの切り替えは <strong>Windows</strong> 経由で行います、タイトルやURLで目的のタブに移ったり、新しいタブを開いたりできます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' タイトルやURLで目的のタブへ切り替える
driver.Windows.SwitchToByTitle "注文一覧"
driver.Windows.SwitchToByUrl "https://example.com/orders"

' 次のタブへ・新しいタブを開く
driver.Windows.SwitchToNext
driver.Windows.SwitchToNew windowType:=svbaTab</code></pre></div>



<h3 class="wp-block-heading">JavaScriptを実行する・スクロールする</h3>



<p class="wp-block-paragraph">標準のメソッドだけだと届かない操作は、<strong>ExecuteScript</strong> でJavaScriptを直接走らせて片付けられます、戻り値も受け取れるので、ちょっとした計算やページ内の値取得にも使えます</p>



<p class="wp-block-paragraph">JS側では、VBAから渡した引数を <strong>arguments[0]</strong> の形で受け取れます、よく使うのは「目的の要素まで画面をスクロールする」用途です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' JSを実行して戻り値を受け取る(5 * 10 = 50)
Dim ret As Variant
ret = driver.ExecuteScript("return arguments[0]*arguments[1];", 5, 10)
Debug.Print ret

' 指定した要素までスクロールする
Dim el As WebElement
Set el = driver.FindElement(By.CssSelector, "#footer")
driver.ExecuteScript "arguments[0].scrollIntoView(true);", el

' 画面を下に1000pxスクロールする
driver.ExecuteScript "window.scrollBy(0,1000);"</code></pre></div>



<h3 class="wp-block-heading">エンターキーなどの特殊キーを送る</h3>



<p class="wp-block-paragraph">検索ボックスに文字を打って、そのままエンターで検索したい…というのもよくあります、特殊キーは <strong>WebKeyboard</strong> を用意して、<strong>SendKeys</strong> の文字とつなげて送ります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Dim k As New WebKeyboard
Dim box As WebElement
Set box = driver.FindElement(By.CssSelector, "[name='q']")

' 検索語を打ってエンターキーで送信
box.SendKeys "SeleniumVBA" & k.ReturnKey

' Ctrl + A で入力欄を全選択する
box.SendKeys k.Chord(k.CtrlKey, "a")</code></pre></div>



<h3 class="wp-block-heading">ヘッドレス・起動オプションを付ける</h3>



<p class="wp-block-paragraph">画面を出さずに裏で動かす(ヘッドレス)や、起動時のオプションを足したいときは、<strong>StartChrome</strong> のあとに <strong>CreateCapabilities</strong> で設定オブジェクトを作って、<strong>OpenBrowser</strong> に渡します</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Dim driver As New WebDriver
driver.StartChrome

Dim caps As WebCapabilities
Set caps = driver.CreateCapabilities

' 画面を出さずに動かす(ヘッドレス)
caps.RunInvisible

' 起動オプションを足す
caps.AddArguments "&#45;&#45;start-maximized"

' ダウンロード先と確認ダイアログの設定
caps.SetDownloadPrefs downloadFolderPath:="C:\dl\", promptForDownload:=False

' 設定を渡してブラウザを開く
driver.OpenBrowser caps</code></pre></div>



<p class="wp-block-paragraph">ヘッドレスにすると画面が出ないぶん動作が軽くなるので、定期実行や大量処理のときに向いています、ただ動作確認のうちは、画面を出したまま挙動を見ながら作るほうが安心です</p>



<h2 class="wp-block-heading">便利なヘルパー関数を用意しておく</h2>



<p class="wp-block-paragraph">同じような書き方を毎回くり返すなら、自分用の小さな関数(ヘルパー)にまとめておくと、コードがぐっと読みやすくなります、ここでは私がよく使うものを紹介します、どれも検証済みのメソッドだけで組んでいるので、そのままコピペして使えます</p>



<h3 class="wp-block-heading">TryFind … 無ければ Nothing を返す(エラーを出さない)</h3>



<p class="wp-block-paragraph">さっき書いたとおり <strong>FindElement</strong> は要素が無いとエラーになります、<strong>TryFind</strong> は <strong>IsPresent</strong> を使って、見つかれば要素を、無ければ <strong>Nothing</strong> を返します、「あるかどうか分からない要素」を扱うときの土台になります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 存在チェック付き取得(無ければNothing・エラーを出さない)
Public Function TryFind(driver As WebDriver, ByVal sel As String, _
                        Optional ByVal waitMS As Long = 3000) As WebElement
    Dim el As WebElement
    If driver.IsPresent(By.CssSelector, sel, waitMS, , el) Then
        Set TryFind = el
    Else
        Set TryFind = Nothing
    End If
End Function</code></pre></div>



<h3 class="wp-block-heading">WaitFor … 出るまで待って、ダメなら明示エラー</h3>



<p class="wp-block-paragraph"><strong>WaitFor</strong> は逆に、「この要素は確実に出るはず」という場面用です、時間内に出れば返し、出なければ「何のセレクタで失敗したか」が分かるエラーを出します、原因が分からないまま止まるより、メッセージが残るぶんデバッグがラクになります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 要素が出るまで待って取得(ダメなら明示エラー)
Public Function WaitFor(driver As WebDriver, ByVal sel As String, _
                        Optional ByVal timeoutMS As Long = 10000) As WebElement
    Dim el As WebElement
    If driver.IsPresent(By.CssSelector, sel, timeoutMS, , el) Then
        Set WaitFor = el
    Else
        Err.Raise vbObjectError + 513, , "要素が見つかりません: " & sel
    End If
End Function</code></pre></div>



<h3 class="wp-block-heading">Css … By.CssSelector を短く書くラッパー</h3>



<p class="wp-block-paragraph">毎回 <strong>driver.FindElement(By.CssSelector, &#8220;&#8230;&#8221;)</strong> と書くのは長いので、<strong>Css(driver, &#8220;&#8230;&#8221;)</strong> だけで済むようにしたラッパーです、CSSセレクタに寄せる方針と相性がよく、本文のコードがかなりスッキリします</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' By.CssSelector 短縮ラッパー
Public Function Css(driver As WebDriver, ByVal sel As String) As WebElement
    Set Css = driver.FindElement(By.CssSelector, sel)
End Function

' 使うとこう書ける
' Css(driver, ".btn-search").Click</code></pre></div>



<h3 class="wp-block-heading">SafeClick … 存在・表示・有効を確かめてからクリック</h3>



<p class="wp-block-paragraph">クリックは、要素はあっても「まだ表示されていない・押せない状態」だと失敗することがあります、<strong>SafeClick</strong> は <strong>IsPresent</strong> で存在を確かめ、さらに <strong>IsDisplayed</strong> と <strong>IsEnabled</strong> が True のときだけ <strong>Click</strong> します、押せないときに止まらず素通りするので、流れが安定します</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 安全クリック(存在＋表示＋有効を確認してClick)
Public Sub SafeClick(driver As WebDriver, ByVal sel As String, _
                     Optional ByVal waitMS As Long = 5000)
    Dim el As WebElement
    If driver.IsPresent(By.CssSelector, sel, waitMS, , el) Then
        If el.IsDisplayed And el.IsEnabled Then el.Click
    End If
End Sub</code></pre></div>



<h3 class="wp-block-heading">スクロール系 … 最下部まで・要素を画面中央へ</h3>



<p class="wp-block-paragraph">スクロールまわりも、<strong>ExecuteScript</strong>でJavaScriptを走らせる独自functionにしておくと便利です、よく出番があるのが、遅延読み込みや無限スクロールのページで<strong><span class="swl-marker mark_yellow">最下部まで自動で送って中身を出し切る</span></strong>処理と、目的の要素を画面の真ん中まで持ってくる処理です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>' 最下部までオートスクロール(無限スクロール・遅延読み込み対策)
' 高さが伸びなくなったら読み切ったとみなして止まる
Public Sub ScrollToBottom(driver As WebDriver, _
                          Optional ByVal maxLoops As Long = 30, _
                          Optional ByVal waitMS As Long = 800)
    Dim lastH As Double, newH As Double, i As Long
    lastH = driver.ExecuteScript("return document.body.scrollHeight;")
    For i = 1 To maxLoops
        driver.ExecuteScript "window.scrollTo(0, document.body.scrollHeight);"
        driver.Wait waitMS
        newH = driver.ExecuteScript("return document.body.scrollHeight;")
        If newH = lastH Then Exit For
        lastH = newH
    Next i
End Sub

' 対象の要素を画面の中央へスクロール
Public Sub ScrollToCenter(driver As WebDriver, el As WebElement)
    driver.ExecuteScript "arguments[0].scrollIntoView({block:'center', inline:'center'});", el
End Sub</code></pre></div>



<p class="wp-block-paragraph"><strong>ScrollToBottom</strong>は、ページの高さが伸びなくなったら「もう読み切った」と判断して止まる作りなので、件数の読めない無限スクロールでも空回りしません、<strong>ScrollToCenter</strong>は要素を上端ではなく中央に置くので、固定ヘッダーに隠れて押せない…みたいなクリック事故も減らせます</p>



<h2 class="wp-block-heading">ハマりどころとTips</h2>



<p class="wp-block-paragraph">最後に、書きはじめのうちにつまずきやすいところを、軽くまとめておきます</p>



<ul class="wp-block-list is-style-note_list -list-under-dashed">
<li><strong>閉じ忘れに注意</strong> … 処理の終わりに <strong>CloseBrowser</strong> → <strong>Shutdown</strong> を呼ばないと、裏でWebDriverが残ることがあります、処理の最後に毎回呼ぶ形にしておくのがおすすめです</li>



<li><strong>まず ImplicitMaxWait をセット</strong> … 「要素がまだ無い」系のエラーは、最初に <strong>ImplicitMaxWait</strong> を入れておくだけでかなり減ります</li>



<li><strong>存在チェックは IsPresent で</strong> … 無いかもしれない要素を <strong>FindElement</strong> で取りにいくとエラーになります、迷ったら <strong>IsPresent</strong> で分岐するのが安全です</li>



<li><strong>メソッド名の取り違えに注意</strong> … 探すのは <strong>By.CssSelector</strong>(By.Cssではない)、テキストは <strong>GetText</strong>、CSS値は <strong>GetCSSProperty</strong> です、名前が紛らわしいので、ここはコピペで間違いを防ぐのがラクです</li>
</ul>



<p class="wp-block-paragraph">このあたりを押さえておけば、たいていの「動かない…」はかなり減らせると思います、あとは作りたい処理に合わせて、ここまでのコードを組み合わせていく感じです</p>



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



<p class="wp-block-paragraph">SeleniumVBAの実践コードを、ひととおり並べてみました、最後にポイントを整理しておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>要素の探し方は <strong>By.CssSelector</strong> に寄せると覚えることが減る、リンク文字やテキスト検索はCSS＋ループの独自functionで再現でき、XPathが要るのは親への逆引き(<strong>&#8220;..&#8221;</strong>)だけ</li>



<li>操作は <strong>Click</strong> / <strong>SendKeys</strong> / <strong>GetText</strong> / <strong>GetAttribute</strong> が基本、待機は <strong>ImplicitMaxWait</strong> をまずセット</li>



<li>無いかもしれない要素は <strong>IsPresent</strong> で確認、プルダウンや複数要素・スクショ・JS実行も専用メソッドで書ける</li>



<li>よく使う処理は <strong>TryFind</strong> / <strong>WaitFor</strong> / <strong>Css</strong> / <strong>SafeClick</strong> のようにヘルパー関数化しておくと読みやすい</li>
</ul>



<p class="wp-block-paragraph">まだ導入が済んでいない方は、まず「<a href="https://javeo.jp/selenium-vba/" target="_blank" rel="noopener noreferrer">Excelでもブラウザ操作！SeleniumVBAの使い方</a>」で土台を作ってから、この記事のコードを動かしてみてください</p>



<p class="wp-block-paragraph">ドライバーの更新まわりで困ったときは「<a href="https://javeo.jp/vba-chromedriver-auto-update/" target="_blank" rel="noopener noreferrer">VBAでChromeDriverを自動更新する方法</a>」、これまでの定番だったSeleniumBasicから入りたい方は「<a href="https://javeo.jp/seleniumbasic-startup/" target="_blank" rel="noopener noreferrer">SeleniumBasicの導入方法</a>」も合わせて読んでもらえると、VBAでのブラウザ自動化がだいぶ見通しよくなると思います</p>


<div class="p-blogParts post_content" data-partsID="4601">
<div class="jv-books" data-shelf="vba"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> VBAの独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839975728?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5722/9784839975722_1_2.jpg?_ex=240x240" alt="Excel VBA塾【動画×本で学ぶ!】" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Excel VBA塾【動画×本で学ぶ!】</p><p class="jv-book-author">たてばやし淳</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839975728?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="amazon" data-book="4839975728">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="rakuten" data-book="4839975728">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297108755?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8755/9784297108755.jpg?_ex=240x240" alt="パーフェクトExcel VBA" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">パーフェクトExcel VBA</p><p class="jv-book-author">高橋宣成</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297108755?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="amazon" data-book="4297108755">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="rakuten" data-book="4297108755">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4815631298?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1291/9784815631291.jpg?_ex=240x240" alt="Excel マクロ&amp;VBA［実践ビジネス入門講座］完全版 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Excel マクロ&amp;VBA［実践ビジネス入門講座］完全版 第3版</p><p class="jv-book-author">国本温子</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4815631298?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="amazon" data-book="4815631298">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="rakuten" data-book="4815631298">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='vba';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "Excel VBA塾【動画×本で学ぶ!】", "a": "たてばやし淳", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5722/9784839975722_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839975728?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F", "id": "4839975728"}, {"t": "パーフェクトExcel VBA", "a": "高橋宣成", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8755/9784297108755.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297108755?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F", "id": "4297108755"}, {"t": "Excel マクロ&VBA［実践ビジネス入門講座］完全版 第3版", "a": "国本温子", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1291/9784815631291.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4815631298?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F", "id": "4815631298"}, {"t": "増強改訂版 できる イラストで学ぶ 入社1年目からのExcel VBA", "a": "きたみあきこ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8414/9784295018414.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295018414?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17725381%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17725381%2F", "id": "4295018414"}, {"t": "Excel マクロ&VBA やさしい教科書 Office 2024/2021 Microsoft 365対応", "a": "古川順平", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0430/9784815630430.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4815630437?tag=javeo2022-22", "rk": "", "id": "4815630437"}, {"t": "てっとり早く確実にマスターできる Excel VBAの教科書 改訂新版", "a": "大村あつし", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/9232/9784297119232.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297119234?tag=javeo2022-22", "rk": "", "id": "4297119234"}, {"t": "スラスラ読める Excel VBAふりがなプログラミング 増補改訂版", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3594/9784295013594_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295013595?tag=javeo2022-22", "rk": "", "id": "4295013595"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/selenium-vba-code/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Claudeで競馬予想AIを自作する #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・Claude]]></category>
		<category><![CDATA[netkeiba]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[競馬]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3908</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/03/AIで競馬-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>競馬予想AIを作るための過去データ収集編。JRA-VAN データラボとnetkeibaスクレイピングを比較し、データベース保存・小分け取得・逐次処理など実際に採用した方針をまとめました]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/03/AIで競馬-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">2026年初頭AIの進歩が凄まじく、AIを使った何かをやってみたいと競馬予想AIを作ってみましたのでその取り組みをまとめてみました</p>



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



<p class="wp-block-paragraph">今回は第二回でデータ収集についてまとめています</p>



<p class="wp-block-paragraph">前回(第一回)はこちら→<a href="https://javeo.jp/keiba-ai-challenge-01/" target="_blank" rel="noopener noreferrer">汎用AIと一緒に競馬予想AI作ってnote投稿まで自動化する #1-はじめに</a></p>
</div></div>



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



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



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



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



<p class="wp-block-paragraph">JRA公式データを使うなら<strong><span class="swl-marker mark_yellow">データラボが本命</span></strong></p>



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



<p class="wp-block-paragraph"><a href="https://jra-van.jp/dlb/feature.html" target="_blank" rel="noopener noreferrer">https://jra-van.jp/dlb/feature.html</a></p>



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



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



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



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>サポート対象言語</span></div><div class="cap_box_content">
<ul class="wp-block-list -list-under-dashed">
<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>



<p class="wp-block-paragraph"><a href="https://support.jra-van.jp/jravan/detail?site=SVKNEGBV&amp;category=16&amp;id=209" target="_blank" rel="noopener noreferrer">https://support.jra-van.jp/jravan/detail?site=SVKNEGBV&amp;category=16&amp;id=209</a></p>
</div></div>



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



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>卍氏の書籍紹介</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">2007-2009年の3年間で、1億円以上の価値を得た卍氏の書籍はコチラ</p>



<p class="wp-block-paragraph">「馬券の勝ち方」を論理的かつ丁寧に解説されてます！</p>



<p class="wp-block-paragraph"><a href="https://amzn.to/4sy3Kd8" target="_blank" rel="nofollow noopener noreferrer">卍氏の書籍を見る(Amazon)</a></p>
</div></div>



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



<p class="wp-block-paragraph">結論から言うと<strong><span class="swl-marker mark_yellow">今回採用したのはこちら</span></strong></p>



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



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



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



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



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



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



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



<p class="wp-block-paragraph"><a href="https://race.netkeiba.com/race/result.html?race_id=201405010303" target="_blank" rel="noreferrer noopener nofollow">https://race.netkeiba.com/race/result.html?race_id=201405010303</a></p>



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



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



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



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



<p class="wp-block-paragraph">※netkeibaのスクレイピングはPythonでの実装例を別記事にもまとめています→<a href="https://javeo.jp/python-scraping-netkeiba-1/" target="_blank" rel="noopener noreferrer">【Python】netkeibaをスクレイピングする-その1</a></p>



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



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



<p class="wp-block-paragraph">参考までに私はこのブログサイトのために<a href="https://px.a8.net/svt/ejp?a8mat=2ZTU22+94NC8Y+CO4+609HU" target="_blank" rel="nofollow noopener noreferrer">エックスサーバー</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">データは小分けに取得</h3>



<p class="wp-block-paragraph">データベースを使う利点の一つとも言える、<strong><span class="swl-marker mark_yellow">取得情報をもとに次の情報を取得</span></strong>が個人的推奨方法</p>



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



<ul style="background-color:#FFFFDC80" class="wp-block-list -list-under-dashed has-background">
<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 class="wp-block-paragraph">SQLの作り方次第ではありますが、これでエラーが発生しても途中再開が簡単にできるようになります</p>



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



<p class="wp-block-paragraph">前述の通り利用規約では</p>



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



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



<p class="wp-block-paragraph">早く情報を収集したい気持ちで並列処理をするとアクセスブロックをされて結果余計に時間がかかる、最悪取得できなくなる可能性もあるので<strong><span class="swl-marker mark_yellow" style="color:#e8313b">節度を持った処理をしましょう</span></strong></p>



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



<p class="wp-block-paragraph">なかなか満足できるAIができないので次回はnoteへの自動投稿をまとめる予定です</p>


<div class="p-blogParts post_content" data-partsID="4603">
<div class="jv-books" data-shelf="ai"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Claude・生成AIを学べる本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2909/9784065342909.jpg?_ex=240x240" alt="面倒なことはChatGPTにやらせよう" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">面倒なことはChatGPTにやらせよう</p><p class="jv-book-author">カレーちゃん・からあげ</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4065342902">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4065342902">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3540/9784297153540_1_2.jpg?_ex=240x240" alt="実践Claude Code入門" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">実践Claude Code入門</p><p class="jv-book-author">西見公宏・吉田真吾・大嶋勇樹</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4297153548">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4297153548">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2758/9784297152758_1_2.jpg?_ex=240x240" alt="Claude CodeによるAI駆動開発入門" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Claude CodeによるAI駆動開発入門</p><p class="jv-book-author">平川知秀</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4297152754">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4297152754">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='ai';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "面倒なことはChatGPTにやらせよう", "a": "カレーちゃん・からあげ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2909/9784065342909.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F", "id": "4065342902"}, {"t": "実践Claude Code入門", "a": "西見公宏・吉田真吾・大嶋勇樹", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3540/9784297153540_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F", "id": "4297153548"}, {"t": "Claude CodeによるAI駆動開発入門", "a": "平川知秀", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2758/9784297152758_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F", "id": "4297152754"}, {"t": "3時間で身につくClaude活用術", "a": "尾藤克之", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5495/9784866215495_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4866215496?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18576909%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18576909%2F", "id": "4866215496"}, {"t": "開発効率をアップする! Claude Code 実用入門", "a": "大澤文孝", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0206/9784839990206.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839990204?tag=javeo2022-22", "rk": "", "id": "4839990204"}, {"t": "Microsoft 365 Copilot踏み込み活用術", "a": "太田浩史", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3401/9784295023401_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/429502340X?tag=javeo2022-22", "rk": "", "id": "429502340X"}, {"t": "Google NotebookLM 即効活用大全", "a": "増田智明", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5995/9784297155995_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297155990?tag=javeo2022-22", "rk": "", "id": "4297155990"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/keiba-ai-challenge-02/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Claudeで競馬予想AIを自作する #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・Claude]]></category>
		<category><![CDATA[netkeiba]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[競馬]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3838</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/03/AIで競馬-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>競馬予想AIをAIと一緒に作ってみるシリーズの第一回(はじめに)。AIで何か作りたいという動機から、相棒に選んだClaude、スクレイピング→予想→note自動投稿までの全体構成をまとめました]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/03/AIで競馬-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">2026年初頭AIの進歩が凄まじく、AIを使った何かをやってみたいと競馬予想AIを作ってみましたのでその取り組みをまとめてみました</p>



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



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



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



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



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



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



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



<p class="wp-block-paragraph">今回一緒に開発を進めるAIパートナーとして選ばれたのは「<strong><span class="swl-marker mark_yellow" style="color:#e8313b">Claude（クロード）</span></strong>」でした</p>



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



<p class="wp-block-paragraph">汎用AIの優劣はネットでも様々議論されていますが、今の情勢と一カ月後の情勢はきっと違うので<strong><span class="swl-marker mark_yellow">好みで使えばいい</span></strong>と思います</p>



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


<div class="p-blogParts post_content" data-partsID="4603">
<div class="jv-books" data-shelf="ai"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Claude・生成AIを学べる本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2909/9784065342909.jpg?_ex=240x240" alt="面倒なことはChatGPTにやらせよう" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">面倒なことはChatGPTにやらせよう</p><p class="jv-book-author">カレーちゃん・からあげ</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4065342902">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4065342902">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3540/9784297153540_1_2.jpg?_ex=240x240" alt="実践Claude Code入門" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">実践Claude Code入門</p><p class="jv-book-author">西見公宏・吉田真吾・大嶋勇樹</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4297153548">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4297153548">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2758/9784297152758_1_2.jpg?_ex=240x240" alt="Claude CodeによるAI駆動開発入門" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Claude CodeによるAI駆動開発入門</p><p class="jv-book-author">平川知秀</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4297152754">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4297152754">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='ai';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "面倒なことはChatGPTにやらせよう", "a": "カレーちゃん・からあげ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2909/9784065342909.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F", "id": "4065342902"}, {"t": "実践Claude Code入門", "a": "西見公宏・吉田真吾・大嶋勇樹", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3540/9784297153540_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F", "id": "4297153548"}, {"t": "Claude CodeによるAI駆動開発入門", "a": "平川知秀", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2758/9784297152758_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F", "id": "4297152754"}, {"t": "3時間で身につくClaude活用術", "a": "尾藤克之", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5495/9784866215495_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4866215496?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18576909%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18576909%2F", "id": "4866215496"}, {"t": "開発効率をアップする! Claude Code 実用入門", "a": "大澤文孝", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0206/9784839990206.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839990204?tag=javeo2022-22", "rk": "", "id": "4839990204"}, {"t": "Microsoft 365 Copilot踏み込み活用術", "a": "太田浩史", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3401/9784295023401_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/429502340X?tag=javeo2022-22", "rk": "", "id": "429502340X"}, {"t": "Google NotebookLM 即効活用大全", "a": "増田智明", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5995/9784297155995_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297155990?tag=javeo2022-22", "rk": "", "id": "4297155990"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>


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



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



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



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



<div class="wp-block-group is-style-emboss_box"><div class="wp-block-group__inner-container">
<p class="has-text-align-center wp-block-paragraph"><strong>スクレイピング　→　競馬AIで予想　→　予想結果をnoteに投稿</strong></p>
</div></div>



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



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



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



<p class="wp-block-paragraph">今時点では4回に分けて下記順番で作るつもり</p>



<ol style="background-color:#f3fafe80" class="wp-block-list -list-under-dashed has-background">
<li>過去データの収集
<ol class="wp-block-list">
<li><a href="https://javeo.jp/keiba-ai-challenge-02/" target="_blank" rel="noopener noreferrer">netkeibaからのスクレイピング</a></li>



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



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



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



<li><a href="https://javeo.jp/keiba-ai-challenge-03/" target="_blank" rel="noopener noreferrer">予想のアウトプットでnote記事の自動作成と販売</a></li>
</ol>



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



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



<p class="wp-block-paragraph">今時点ではAI未完成で<strong><span class="swl-marker mark_yellow">スクレイピングは完成とnote投稿8割くらい</span></strong>です</p>



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



<p class="wp-block-paragraph">あまり間延びしないように作っていくので追いかけてもらえると嬉しいです！</p>


<div class="p-blogParts post_content" data-partsID="4603">
<div class="jv-books" data-shelf="ai"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Claude・生成AIを学べる本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2909/9784065342909.jpg?_ex=240x240" alt="面倒なことはChatGPTにやらせよう" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">面倒なことはChatGPTにやらせよう</p><p class="jv-book-author">カレーちゃん・からあげ</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4065342902">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4065342902">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3540/9784297153540_1_2.jpg?_ex=240x240" alt="実践Claude Code入門" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">実践Claude Code入門</p><p class="jv-book-author">西見公宏・吉田真吾・大嶋勇樹</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4297153548">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4297153548">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2758/9784297152758_1_2.jpg?_ex=240x240" alt="Claude CodeによるAI駆動開発入門" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Claude CodeによるAI駆動開発入門</p><p class="jv-book-author">平川知秀</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="amazon" data-book="4297152754">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="ai" data-mall="rakuten" data-book="4297152754">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='ai';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "面倒なことはChatGPTにやらせよう", "a": "カレーちゃん・からあげ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2909/9784065342909.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4065342902?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17728615%2F", "id": "4065342902"}, {"t": "実践Claude Code入門", "a": "西見公宏・吉田真吾・大嶋勇樹", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3540/9784297153540_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297153548?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18439208%2F", "id": "4297153548"}, {"t": "Claude CodeによるAI駆動開発入門", "a": "平川知秀", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2758/9784297152758_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297152754?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18401065%2F", "id": "4297152754"}, {"t": "3時間で身につくClaude活用術", "a": "尾藤克之", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5495/9784866215495_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4866215496?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18576909%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18576909%2F", "id": "4866215496"}, {"t": "開発効率をアップする! Claude Code 実用入門", "a": "大澤文孝", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0206/9784839990206.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839990204?tag=javeo2022-22", "rk": "", "id": "4839990204"}, {"t": "Microsoft 365 Copilot踏み込み活用術", "a": "太田浩史", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3401/9784295023401_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/429502340X?tag=javeo2022-22", "rk": "", "id": "429502340X"}, {"t": "Google NotebookLM 即効活用大全", "a": "増田智明", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5995/9784297155995_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297155990?tag=javeo2022-22", "rk": "", "id": "4297155990"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></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[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3721</guid>

					<description><![CDATA[プロキシサーバーとは？ プロキシサーバーはインターネットへの接続を中継してくれるサービスで、WEBサイトから見ればプロキシサーバーがアクセスしていることになるので結果としてIPアドレスが秘匿されることになります 絵にする [&#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 class="wp-block-paragraph">RPA・スクレイピングをしているとIPアドレス変えたいなと思うことありませんか？</p>



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



<p class="wp-block-paragraph">プロキシサーバー中で「jpProxy」についてご紹介します</p>
</div>



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



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



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



<figure class="wp-block-image size-large"><a 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 class="wp-block-paragraph">プロキシサーバーは無料もあれば有料もあり、優良なものもあれば粗悪なものあるということで実際に私が利用しているサービスの一つ「<a href="https://jpproxy.com/" target="_blank" rel="noreferrer noopener">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">jpProxyについて</h2>



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



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



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



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



<p class="wp-block-paragraph">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">クローリング時のアクセス回数制限を回避したい</h3>



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



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



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



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



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



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



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



<p class="wp-block-paragraph">jpProxyのIPアドレスは<strong>日本国内の固定IPアドレス</strong>ですので安心です</p>



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



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



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



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



<p class="wp-block-paragraph">jpProxyは通信内容をロギングおよび閲覧していません</p>



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



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



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



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



<figure class="wp-block-image size-large"><a 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">接続元IP登録</h3>



<p class="wp-block-paragraph">プロキシサーバーに接続するIPアドレスを登録できます</p>



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



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



<figure class="wp-block-image size-large"><a 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">ユーザID・パス確認</h3>



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



<figure class="wp-block-image size-large"><a 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 class="wp-block-paragraph">Basic認証とはなんぞや、って方に簡単な説明すると画面上部に表示されるユーザー名とパスワードを入力するフォームでの認証</p>



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



<figure class="wp-block-image size-large"><a 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">プロキシサーバー経由でインターネットアクセスする方法</h2>



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



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



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



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



<div class="wp-block-columns">
<div class="wp-block-column" style="flex-basis:50%">
<figure class="wp-block-image size-full"><a 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" style="flex-basis:50%">
<figure class="wp-block-image size-full"><a 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 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">まとめ</h2>



<p class="wp-block-paragraph">個人的にはスクレイピングするときによく使う<a href="https://jpproxy.com/" target="_blank" rel="noreferrer noopener nofollow">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 class="wp-block-paragraph">使い方としては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[Excel・VBA]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SeleniumBasic]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3569</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-1024x512.jpg" class="webfeedsFeaturedVisual" /></p>待機処理が必要な理由 SeleniumでWebサイトを操作するときにありがちな内容がこちら これらを解決するには「要素が存在する・表示される・有効になる」まで待機処理が必要です WebDriverWaitクラスでできるこ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-1024x512.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p class="wp-block-paragraph">PythonでSeleniumを利用するときに利用必須ともいえるWebDriverWaitとexpected_conditionsですが、残念ながらVBAにはありません</p>



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



<p class="wp-block-paragraph">※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">
https://javeo.jp/python_wait/
</div></figure>
</div>



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



<p class="wp-block-paragraph">SeleniumでWebサイトを操作するときにありがちな内容がこちら</p>



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



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



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



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



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



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



<figure class="wp-block-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></figure>



<p class="wp-block-paragraph">ポイント：</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">VBA版WebDriverWaitの実装例</h2>



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



<figure class="wp-block-image size-large"><a 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 line-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">使い方サンプル</h2>



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



<p class="wp-block-paragraph">ポイントはInit部分で引数は下記の通りです</p>



<div class="hcb_wrap"><pre class="prism line-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 line-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">まとめ</h2>



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



<p class="wp-block-paragraph">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[Excel・VBA]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SeleniumBasic]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3564</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-1024x512.jpg" class="webfeedsFeaturedVisual" /></p>やっていること 以前作成したVBAはJSON API endpointsを総当たりで取得していたのでJSONをパースする必要がありましたが、APIでドライバのバージョンを直接取得できることに気づいて少し手順を簡略化できま [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2024/07/ExcelVBA-1024x512.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p class="wp-block-paragraph">以前に別で作成したVBAのChromedriver自動更新プログラムですが色々見直すと実はVBA-JSONなしでも十分ってことに気づいて別途作成しました</p>



<p class="wp-block-paragraph">条件付きの簡略版ではありますのでご自身の環境に合わせて使い分けてください</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">
https://javeo.jp/vba-chromedriver-auto-update/
</div></figure>
</div>



<h2 class="wp-block-heading">やっていること</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 class="wp-block-paragraph">以前作成したVBAはJSON API endpointsを総当たりで取得していたのでJSONをパースする必要がありましたが、APIでドライバのバージョンを直接取得できることに気づいて少し手順を簡略化できました</p>



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



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



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



<p class="wp-block-paragraph">このプログラムを実行するために設定した参照設定</p>



<figure class="wp-block-image size-full"><a 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 class="wp-block-paragraph">追加したのは下記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 class="wp-block-paragraph">ここは旧バージョンと変わりありません</p>



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



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



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



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



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



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



<figure class="wp-block-image size-large"><a 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">標準モジュールを追加</h3>



<p class="wp-block-paragraph">自動更新プログラム用にモジュールを追加する</p>



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



<figure class="wp-block-image size-large"><a 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">モジュール名を変更する</h3>



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



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



<figure class="wp-block-image size-large"><a 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">プログラムの使い方</h3>



<p class="wp-block-paragraph">「<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 line-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">Chromedriverの書き込み権限がない時</h2>



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



<p class="wp-block-paragraph">画像の通りですが下記手順で権限設定ができます</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 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">サンプルファイル</h2>



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





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



<p class="wp-block-paragraph">まずはGithubをご利用の方向けはこちら</p>



<p class="wp-block-paragraph"><a href="https://github.com/javeo2022/webdriver_manager_VBA_Lite" target="_blank" rel="noreferrer noopener">https://github.com/javeo2022/webdriver_manager_VBA_Lite</a></p>



<p class="wp-block-paragraph">例によってコピペ用はこちらです</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 line-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">あとがき</h2>



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



<p class="wp-block-paragraph">今後改修するとしたらこちらになる予定です</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/vba-chromedriver-auto-update-lite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SeleniumのOptionsとServiceまとめ【Python】</title>
		<link>https://javeo.jp/chrome-options-service/</link>
					<comments>https://javeo.jp/chrome-options-service/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sat, 23 Aug 2025 17:07:21 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3418</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/chrome-options-service-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>SeleniumでChromeを起動する前に指定するOptionsとServiceについて、おすすめを目的別にまとめました、Optionsはバージョンアップとともに変わったりするので不定期に更新していきます、2026年6 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/chrome-options-service-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">SeleniumでChromeを起動する前に指定する<strong>Options</strong>と<strong>Service</strong>について、おすすめを目的別にまとめました、Optionsはバージョンアップとともに変わったりするので不定期に更新していきます、2026年6月時点での最新版です</p>
</div></div>



<h2 class="wp-block-heading">前置き</h2>



<p class="wp-block-paragraph">特にOptionsは動作軽量を目指す機能も多いのですが、スクレイピングはなるべく人が操作している状態を再現したほうが安定するので、<strong><span class="swl-marker mark_yellow">なるべく使わない方がいい</span></strong>が持論です</p>



<p class="wp-block-paragraph">プロファイルを指定しなければ毎回、何も設定していない<strong><span class="swl-marker mark_yellow">インストール直後のピュアな状態</span></strong>で起動するはずなので、その前提で必要な機能だけ選んでいけばいいと思います</p>



<h2 class="wp-block-heading">Optionsについて</h2>



<p class="wp-block-paragraph">いわゆる起動オプションとして、Chromeの機能を設定できます、あくまでChrome用の機能なので「ChromeDriverとして要る？」と思うものもありますが、目的別に分類したので気になるところからチェックしてみてください</p>



<p class="wp-block-paragraph">記述は<strong>options.add_argument(argument: str)</strong>で、必要な分だけ書いていきます、評価はあくまで個人的なものなので、お好みで取捨選択してください</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">数は多いですが全部覚える必要はありません、迷ったら後半の<strong>結局何を使うべきか</strong>のテンプレが基本で、中でもBot検知対策の<strong><span class="swl-marker mark_yellow">&#45;&#45;disable-blink-features=AutomationControlled</span></strong>は入れておくと安定します</p>
</div></div>



<h3 class="wp-block-heading">高速化・軽量化目的</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;headless=new</td><td>画面を表示せず(headless)起動、バックグラウンド処理向き</td><td>一番需要あり、ただしエラーに気づきにくい/サイトによっては弾かれることも(昔の&#45;&#45;headlessでなく今は=new)</td></tr><tr><td>&#45;&#45;disable-gpu</td><td>GPU処理を無効化</td><td>昔の名残、新しいheadless(Chrome 109以降)ではほぼ不要、自分は付けない</td></tr><tr><td>&#45;&#45;disable-extensions</td><td>拡張機能を無効化して起動</td><td>そもそも拡張なしが基本なのであってもなくても</td></tr><tr><td>&#45;&#45;disable-dev-shm-usage</td><td>Linux/Dockerで共有メモリを避けクラッシュ防止</td><td>Windowsなら不要、おまじない枠</td></tr><tr><td>&#45;&#45;no-sandbox</td><td>サンドボックス(セキュリティ)を無効化</td><td>Linuxで必要なことはあるが基本は付けない方がいい</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">テスト・自動化向け</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;start-maximized</td><td>ウィンドウを最大化して起動</td><td>個人的に必須級、小さいと要素が表示されないことがある</td></tr><tr><td>&#45;&#45;window-size=幅,高さ</td><td>ウィンドウサイズを指定して起動</td><td>&#45;&#45;start-maximized推奨だがこちらでもOK</td></tr><tr><td>&#45;&#45;disable-popup-blocking</td><td>ポップアップブロックを無効化</td><td>既定でブロックされないはずなので不要</td></tr><tr><td>&#45;&#45;disable-notifications</td><td>通知を無効化</td><td>通知を受ける操作はしないのであってもなくても</td></tr><tr><td>&#45;&#45;auto-open-devtools-for-tabs</td><td>起動時にDevToolsを自動表示</td><td>完成品には不要、開発は普通のChromeでやるはず</td></tr><tr><td>&#45;&#45;disable-blink-features=AutomationControlled</td><td>navigator.webdriverを偽装して自動化検知を回避</td><td><strong>Bot検知対策の基本、まず入れておきたい</strong>(ただし単体では不十分=後述)</td></tr></tbody></table></figure>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">2026年はこの手の基本フラグだけではほぼ見抜かれます</span></strong>、ChromeDriverが残すcdc_から始まる変数やCDP(DevTools Protocol)の痕跡、ヘッドレス特有のUA(HeadlessChrome)など、チェックされるポイントは増える一方です、本気で検知を避けたいならundetected-chromedriverのような専用ツールや、痕跡をまとめて潰す対策が前提になります</p>
</div></div>



<h3 class="wp-block-heading">プライバシー・偽装目的</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;incognito</td><td>シークレットモードで起動</td><td>毎回ピュアな状態なのでおまじない枠</td></tr><tr><td>&#45;&#45;user-agent=任意のUA</td><td>ユーザーエージェントを偽装</td><td>requestsならともかくSeleniumで効果あるか疑問、UA文字列はfake-useragentが便利</td></tr><tr><td>&#45;&#45;user-data-dir=プロファイルのパス</td><td>ユーザープロファイルを指定して起動</td><td>cookieなども残せて幅が広がる(プロファイルの詳細は割愛)</td></tr><tr><td>&#45;&#45;ignore-certificate-errors</td><td>SSL証明書のエラーを無視</td><td>自己署名サイト等、使う機会は少なく不要でOK</td></tr><tr><td>&#45;&#45;disable-password-manager</td><td>パスワード保存を無効化</td><td>保存させる場面がないので不要</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">表示・UI制御</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;hide-scrollbars</td><td>スクロールバーを非表示</td><td>スクショを残すときくらい、お好みで</td></tr><tr><td>&#45;&#45;app=URL</td><td>指定したURLをアプリモードで起動</td><td>手動操作しないので使う機会はなさそう</td></tr><tr><td>&#45;&#45;disable-images</td><td>画像の読み込みを無効化</td><td>古い指定、headlessだと効かないことがある</td></tr><tr><td>&#45;&#45;blink-settings=imagesEnabled=false</td><td>画像の読み込みを無効化(より確実)</td><td>headlessでも効く、画像を止めて高速化したいなら今はこちら</td></tr><tr><td>&#45;&#45;disable-javascript</td><td>JavaScriptを無効化</td><td>JS無効で動くサイトは少ない、JS不要ならrequestsが軽い、今は後述のprefs推奨</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">このほか、どうしても読み込みたいローカル拡張があれば<strong>&#45;&#45;load-extension=拡張のパス</strong>もありますが、拡張を使うなら個人的には&#45;&#45;user-data-dir派です</p>



<h3 class="wp-block-heading">実験的・高度な制御(add_experimental_option)</h3>



<p class="wp-block-paragraph">ここからはoptions.add_argumentではなく<strong>options.add_experimental_option(name: str, value)</strong>で設定する実験的オプションです、記述の形が変わる点に注意してください</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#8220;excludeSwitches&#8221;, [&#8220;enable-automation&#8221;]</td><td>「Chromeは自動テストソフトウェアによって制御されています」のメッセージを非表示</td><td>Bot検知回避の一つ、設定し得</td></tr><tr><td>&#8220;useAutomationExtension&#8221;, False</td><td>navigator.webdriverをundefinedに近づける(Bot検知回避)</td><td>★現在は非推奨、Chromeが使わなくなったので<strong>excludeSwitchesだけでOK</strong></td></tr><tr><td>&#8220;mobileEmulation&#8221;, {&#8220;deviceName&#8221;: deviceName}</td><td>スマホとしてブラウザを起動</td><td>deviceNameに&#8221;iPhone 14 Pro Max&#8221;や&#8221;Pixel 7&#8243;など、DevToolsのデバイス一覧が参考</td></tr><tr><td>&#8220;prefs&#8221;, {dict}</td><td>環境設定(preferences)をまとめて指定</td><td>オプションと同じ内容ならこちらが推奨</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">excludeSwitchesを設定すると、↓のメッセージが消えます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2025/08/image-18.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2025/08/image-18-1024x538.png" alt="excludeSwitchesで「自動テストソフトウェアによって制御されています」の表示を消した例" class="wp-image-3419" srcset="https://javeo.jp/wp-content/uploads/2025/08/image-18-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2025/08/image-18-300x158.png 300w, https://javeo.jp/wp-content/uploads/2025/08/image-18-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/08/image-18-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/08/image-18.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h4 class="wp-block-heading">prefs(preferences)で指定できる主なもの</h4>



<p class="wp-block-paragraph">prefsの中身も多いので、よく使うものを表にまとめました、値は例なので環境に合わせて書き換えてください</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>キー</th><th>効果</th></tr></thead><tbody><tr><td>&#8220;download.default_directory&#8221;: &#8220;保存先のパス&#8221;</td><td>ダウンロード先を指定</td></tr><tr><td>&#8220;download.prompt_for_download&#8221;: False</td><td>ダウンロード時の確認ダイアログを無効化</td></tr><tr><td>&#8220;download.directory_upgrade&#8221;: True</td><td>既存フォルダでも強制的に保存</td></tr><tr><td>&#8220;download_bubble.partial_view_enabled&#8221;: False</td><td>ダウンロードの吹き出し通知(部分表示)を無効化</td></tr><tr><td>&#8220;savefile.default_directory&#8221;: &#8220;保存先のパス&#8221;</td><td>「名前を付けて保存」ダイアログの初期ディレクトリを指定</td></tr><tr><td>&#8220;credentials_enable_service&#8221;: False</td><td>パスワード保存のポップアップを無効化</td></tr><tr><td>&#8220;plugins.always_open_pdf_externally&#8221;: True</td><td>Chrome内蔵のPDFビューアを使わない</td></tr><tr><td>&#8220;profile.managed_default_content_settings.javascript&#8221;: 2</td><td>JavaScriptの有効(1)/無効(2)を制御</td></tr><tr><td>&#8220;profile.managed_default_content_settings.images&#8221;: 2</td><td>画像読み込みの有効(1)/無効(2)を制御</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Serviceについて</h2>



<p class="wp-block-paragraph">今のServiceは特に指定しなくてもいいレベルで、個人的に使うのは1つだけです</p>



<h3 class="wp-block-heading">creation_flags</h3>



<p class="wp-block-paragraph">creation_flagsを指定すると、<strong><span class="swl-marker mark_yellow">ChromeDriverの黒いコンソールウィンドウを非表示</span></strong>にできます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from subprocess import CREATE_NO_WINDOW

# Serviceオブジェクトを作成
service = Service()
service.creation_flags = CREATE_NO_WINDOW
service.creation_flags = 0x08000000 # CREATE_NO_WINDOWインポートしていない場合

# Serviceを渡してWebDriverを起動
driver = webdriver.Chrome(service=service)

# これ以降の処理...
driver.get(&#39;https://www.google.com&#39;)
print(driver.title)
driver.quit()</code></pre></div>



<p class="wp-block-paragraph">実行方法によりますが、VSCodeなどで実行したときは↓のメッセージが表示されなくなります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>DevTools listening on ws://127.0.0.1:50152/devtools/browser/～</code></pre></div>



<p class="wp-block-paragraph">PyInstallerでアプリ化したときなんかは余計なメッセージが出なくてすっきりする気もしますが、その場合はおそらく&#45;&#45;noconsoleオプションを付けることが多いので、おまじない的な位置づけでしょうか</p>



<h3 class="wp-block-heading">余談(executable_pathが不要になった件)</h3>



<p class="wp-block-paragraph">その昔、chromedriverをChromeに合わせたバージョンに入れ替えていた時代がありまして、webdriver-managerが自動で入れ替えてくれるのでexecutable_pathと組み合わせて使っていました(当時はかなり画期的なモジュールでした)</p>



<p class="wp-block-paragraph">が、Selenium v4.6.0からはSelenium Managerが機能として実装され、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">自動でWebDriverを管理してくれるので今は不要</span></strong>です、ネットには今でもこの方法を紹介しているページが残っていますが、無視して大丈夫です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># webdriver_managerを使っていた頃の起動
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Serviceオブジェクトを作成
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# これ以降の処理...
driver.get(&#39;https://www.google.com&#39;)
print(driver.title)
driver.quit()</code></pre></div>



<h2 class="wp-block-heading">結局何を使うべきか</h2>



<p class="wp-block-paragraph">プログラムによって調整は必要ですが、個人的に必須なものだけをまとめました、お好みで追加・削除してください</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

options = Options()
options.add_argument(&#39;--start-maximized&#39;)
options.add_argument(&quot;--disable-blink-features=AutomationControlled&quot;)
options.add_experimental_option(&quot;excludeSwitches&quot;, [&quot;enable-automation&quot;])
prefs = {
    &quot;profile.managed_default_content_settings.images&quot;: 2,
    &quot;download.default_directory&quot;: os.path.dirname(__file__),
    &quot;download.prompt_for_download&quot;: False,
    &quot;download_bubble.partial_view_enabled&quot;: False,
}
options.add_experimental_option(&quot;prefs&quot;, prefs)

service = Service()
service.creation_flags = 0x08000000
driver = webdriver.Chrome(options=options, service=service)

driver.get(&#39;https://www.google.com&#39;)
print(driver.title)
driver.quit()</code></pre></div>



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



<p class="wp-block-paragraph">オプションはかなりの量がありましたが、実のところ使うものは限られているので、上のテンプレのように<strong><span class="swl-marker mark_yellow">テンプレ化しておくのが推奨</span></strong>です</p>



<p class="wp-block-paragraph">起動まわりの設定はテンプレで固定して、要素の待ち方は<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Selenium WebDriverWaitの使い方</a>のほうにまとめているので、あわせて押さえておくと<strong><span class="swl-marker mark_yellow">スクレイピングがぐっと安定</span></strong>します</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240" alt="Pythonクローリング&amp;スクレイピング 増補改訂版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Pythonクローリング&amp;スクレイピング 増補改訂版</p><p class="jv-book-author">加藤耕太</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4297107384">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4297107384">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "Pythonクローリング&スクレイピング 増補改訂版", "a": "加藤耕太", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F", "id": "4297107384"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/chrome-options-service/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】Seleniumのfind_elementの使い方 結局CSS_SELECTOR一本でいい</title>
		<link>https://javeo.jp/selenium-find-element/</link>
					<comments>https://javeo.jp/selenium-find-element/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Wed, 20 Aug 2025 14:02:51 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3305</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/selenium-find-element-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>PythonのSeleniumでfind_element / find_elementsを使う方法を、Byの選び方からエラー回避までまとめました、結局CSS_SELECTOR一本でいい理由、各Byの書き換え方、NoSuchElementExceptionに強い待機の書き方まで、例つきで解説します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/selenium-find-element-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">Seleniumで一番よく使うのが、要素を探す<strong>find_element</strong>と<strong>find_elements</strong>ですよね、ブラウザを自動操作するときは、画面上のボタンや入力欄を「どうやって特定するか」がそのまま安定度に効いてきます</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">この記事は<strong>find_element の使い方</strong>=「Byの選び方」と「エラーの回避」が主役です、<strong><span class="swl-marker mark_yellow">CSSセレクタの書き方そのもの</span></strong>(属性・結合子・nth-childなどの一覧)は別記事「<a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方 自動化で要素を狙う指定方法</a>」にまとめたので、書き方を深掘りしたいときはそちらをどうぞ</p>
</div></div>



<h2 class="wp-block-heading">まずは要素検索の基本</h2>



<p class="wp-block-paragraph">まずはよくある基本の書き方です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get(&quot;https://example.com&quot;)

element = driver.find_element(By.ID, &quot;username&quot;)</code></pre></div>



<p class="wp-block-paragraph">このように<strong>By.ID</strong>や<strong>By.NAME</strong>などを使って要素を探します、1件だけなら<strong>find_element</strong>、当てはまる要素を全部リストで取りたいときは<strong>find_elements</strong>です</p>



<p class="wp-block-paragraph">でも、この<strong><span class="swl-marker mark_yellow">Byの選び方</span></strong>によって、コードの安定性や書きやすさが全然変わってきます</p>



<h2 class="wp-block-heading">Byの種類とそれぞれの特徴</h2>



<p class="wp-block-paragraph">Byの種類は実は結構な数がありまして、こんな感じです</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>By.ID</li>



<li>By.NAME</li>



<li>By.CLASS_NAME</li>



<li>By.TAG_NAME</li>



<li>By.LINK_TEXT</li>



<li>By.PARTIAL_LINK_TEXT</li>



<li>By.CSS_SELECTOR</li>



<li>By.XPATH</li>
</ul>



<p class="wp-block-paragraph">ネットでは By.ID や By.CLASS_NAME もよく見かけますが、結論は <strong><span class="swl-marker mark_yellow" style="color:#e8313b">By.CSS_SELECTOR</span></strong> を使っておけば間違いないです</p>



<p class="wp-block-paragraph">もう一つの候補が <strong>By.XPATH</strong> ですが、CSS_SELECTORはスクレイピングで使う<strong>Beautiful Soup</strong>にも応用できますし、記述がすっきりしてわかりやすいので、こちらに軍配が上がります</p>



<h2 class="wp-block-heading">結局CSS_SELECTOR一本でいい理由</h2>



<p class="wp-block-paragraph">CSS_SELECTORが最適な一番の理由は、<strong><span class="swl-marker mark_yellow">他のByを全部CSS_SELECTORで代用できる</span></strong>ところにあります</p>



<p class="wp-block-paragraph">つまり、CSS_SELECTORさえ覚えてしまえば、他を使う必要がなくなるんです</p>



<p class="wp-block-paragraph">ここからは、各Byを CSS_SELECTOR に書き換えるとどうなるかの一覧です、<strong>find_element(By.◯◯, &#8216;値&#8217;)</strong> の◯◯と値が、CSS_SELECTORならこう書けます(XPATHも参考に並べました)</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1000px;"><thead><tr><th>探したいもの</th><th>普通のBy指定</th><th>CSS_SELECTOR一本だと</th><th>XPATH(参考)</th></tr></thead><tbody><tr><td>id</td><td>By.ID, &#8216;hoge&#8217;</td><td>&#8216;#hoge&#8217;</td><td>&#8216;//*[@id=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>class</td><td>By.CLASS_NAME, &#8216;hoge&#8217;</td><td>&#8216;.hoge&#8217;</td><td>&#8216;//*[@class=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>タグ</td><td>By.TAG_NAME, &#8216;div&#8217;</td><td>&#8216;div&#8217;</td><td>&#8216;//div&#8217;</td></tr><tr><td>name属性</td><td>By.NAME, &#8216;hoge&#8217;</td><td>&#8216;[name=&#8221;hoge&#8221;]&#8217;</td><td>&#8216;//*[@name=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>その他の属性</td><td>専用のByなし</td><td>&#8216;[data-test=&#8221;hoge&#8221;]&#8217;</td><td>&#8216;//*[@data-test=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>複数クラス</td><td>専用のByなし</td><td>&#8216;div.hoge.piyo&#8217;</td><td>&#8216;//div[contains(@class,&#8221;hoge&#8221;) and contains(@class,&#8221;piyo&#8221;)]&#8217;</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ひとつ例外があって、リンクを<strong>文字(テキスト)</strong>で探す By.LINK_TEXT / By.PARTIAL_LINK_TEXT だけは、CSS_SELECTORに「文字で探す」書き方がありません、その場合は <strong>aタグを集めて for でテキスト一致</strong>させると同じことができます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># テキストが完全一致するリンク(By.LINK_TEXT 相当)
next((a for a in driver.find_elements(By.CSS_SELECTOR, &#39;a&#39;) if a.text == &#39;hoge&#39;), None)

# テキストが部分一致するリンク(By.PARTIAL_LINK_TEXT 相当)
next((a for a in driver.find_elements(By.CSS_SELECTOR, &#39;a&#39;) if &#39;hoge&#39; in a.text), None)</code></pre></div>



<h3 class="wp-block-heading">親子・兄弟もCSS_SELECTORでたどれる</h3>



<p class="wp-block-paragraph">CSS_SELECTORのもう一つの大きな強みが、<strong><span class="swl-marker mark_yellow">親子要素・兄弟要素をたどって一意に指定できる</span></strong>ところです</p>



<p class="wp-block-paragraph">親子・兄弟というのは、HTMLソースで見たときの縦・横の関係です</p>



<ul class="wp-block-list is-style-check_list">
<li>親子　…　階層の深さ(入れ子の関係)</li>



<li>兄弟　…　同じ階層での横並び</li>
</ul>



<figure class="wp-block-image size-full is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2025/08/image-16.png"><img decoding="async" width="707" height="544" src="https://javeo.jp/wp-content/uploads/2025/08/image-16.png" alt="親要素・子要素・兄弟要素の階層を示したHTML構造の図" class="wp-image-3316" title="" srcset="https://javeo.jp/wp-content/uploads/2025/08/image-16.png 707w, https://javeo.jp/wp-content/uploads/2025/08/image-16-300x231.png 300w, https://javeo.jp/wp-content/uploads/2025/08/image-16-150x115.png 150w" sizes="(max-width: 707px) 100vw, 707px" /></a></figure>



<p class="wp-block-paragraph">例えば上の図で黄色く囲った<strong>説明文2です</strong>の要素を取りたいとき、クラス名だけで指定すると</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>driver.find_element(By.CLASS_NAME, &quot;description&quot;)</code></pre></div>



<p class="wp-block-paragraph">上にある「説明文です」の方を先に拾ってしまいます(n番目で指定する手もありますが、ややこしくなるので割愛します)</p>



<p class="wp-block-paragraph">うまく取るには、指定が一意になるよう<strong>親要素から</strong>たどります、どこまで丁寧に書くかですが</p>



<ul class="wp-block-list is-style-check_list">
<li>&#8216;.younger .description&#8217;</li>



<li>&#8216;.younger &gt; .card &gt; .description&#8217;</li>



<li>&#8216;div.younger &gt; div.card &gt; p.description&#8217;</li>
</ul>



<p class="wp-block-paragraph">などで取れます</p>



<p class="wp-block-paragraph">ここで使った スペース(子孫)や <strong>&gt;</strong>(直下の子)といった<strong>結合子</strong>は、隣接(<strong>+</strong>)や兄弟(<strong>~</strong>)も含めて種類があります、結合子の一覧と使い分けは別記事「<a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方</a>」の結合子の節にまとめたので、引き出しを増やしたいときはどうぞ</p>



<p class="wp-block-paragraph">※このページの下部に同じ画像とサンプルHTMLを置いてあるので、実際に試してみてください</p>



<h3 class="wp-block-heading">開発者ツールでセレクタを下書きする</h3>



<p class="wp-block-paragraph">慣れればソースを見て起点の要素と狙った要素までの道のりが判断できるようになりますが、最初のうちは<strong>開発者ツール(DevTools)</strong>に下書きさせると早いです</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2025/08/image-17.png"><img decoding="async" width="1024" height="645" src="https://javeo.jp/wp-content/uploads/2025/08/image-17-1024x645.png" alt="開発者ツールでCSSセレクタをコピーする画面" class="wp-image-3320" srcset="https://javeo.jp/wp-content/uploads/2025/08/image-17-1024x645.png 1024w, https://javeo.jp/wp-content/uploads/2025/08/image-17-300x189.png 300w, https://javeo.jp/wp-content/uploads/2025/08/image-17-150x94.png 150w, https://javeo.jp/wp-content/uploads/2025/08/image-17-768x483.png 768w, https://javeo.jp/wp-content/uploads/2025/08/image-17.png 1185w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">右クリックの<strong>Copy → Copy selector</strong>でセレクタを取得できます、ただそのまま使うには長くて<strong><span class="swl-marker mark_yellow">壊れやすい</span></strong>ことも多いので、下書きとして受け取って自分で短く整えるのがおすすめです</p>



<h2 class="wp-block-heading">find_elementでよくあるエラーと回避方法</h2>



<p class="wp-block-paragraph">Seleniumを触っているとよく出会うのが <strong>NoSuchElementException</strong> や <strong>ElementNotInteractableException</strong> です</p>



<p class="wp-block-paragraph">要素が見つからなかったり、まだ読み込みが終わっていないのが原因です</p>



<p class="wp-block-paragraph">例えば画面の文字を取得するとき、素直に書くとこうなりますが</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>一般的な文字の取得方法</span></div><div class="cap_box_content">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>hoge = driver.find_element(By.CSS_SELECTOR, &#39;#hoge&#39;).text</code></pre></div>
</div></div>



<p class="wp-block-paragraph">ただ、これだと指定した要素が見つからなかったときに<strong><span class="swl-marker mark_yellow">エラーで止まってしまいます</span></strong></p>



<p class="wp-block-paragraph">それを防ぐには、次の2パターンのどちらかがおすすめです</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>WebDriverWaitで要素の出現を待つ</span></div><div class="cap_box_content">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 10秒待っても要素が見つからないエラーをキャッチする
try:
    elm = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, &#39;#hoge&#39;)))
    hoge = elm.text
except TimeoutException:
    print(&#39;#hoge が見つかりませんでした&#39;)
except Exception:
    print(&#39;予期せぬエラーが発生しました&#39;)</code></pre></div>
</div></div>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>ジェネレータ式で最初の要素を取得する</span></div><div class="cap_box_content">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 要素が見つからないとNoneを返す
elm = next((e for e in driver.find_elements(By.CSS_SELECTOR, &#39;#hoge&#39;)), None)
if elm:
    hoge = elm.text
else:
    print(&#39;#hoge が見つかりませんでした&#39;)</code></pre></div>
</div></div>



<p class="wp-block-paragraph">やり方は違いますが、どちらも「<strong><span class="swl-marker mark_yellow">まず要素を検索</span></strong>」してから「目的のアクションを実行」することでエラーを防いでいます</p>



<p class="wp-block-paragraph">このやり方なら、文字の取得だけでなく、文字入力やクリックにもそのまま流用できます</p>



<p class="wp-block-paragraph">1つ目の <strong>WebDriverWait</strong> は奥が深くて、何を待つか(<strong>expected_conditions</strong>)の選び方で安定感が変わります、待ちでつまづいたら別記事「<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Seleniumで要素を確実に待つ方法</a>」に詳しくまとめたので、あわせてどうぞ</p>



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



<p class="wp-block-paragraph">基礎の基礎に見える find_element でも、Byの選び方やエラー回避まで含めると結構奥が深いです</p>



<p class="wp-block-paragraph">少しずつ理解を深めて、Seleniumを活用していきたいですね</p>



<p class="wp-block-paragraph">あわせて読みたい記事も置いておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>セレクタの書き方を深掘りしたい … <a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方</a></li>



<li>要素の待ち方で困っている … <a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Seleniumで要素を確実に待つ方法</a></li>



<li>ExcelのVBAで同じことをやりたい … <a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBA実践コード集</a></li>
</ul>



<p class="wp-block-paragraph">最後に、練習に使えるHTMLを置いておきますので、ご自由にどうぞ</p>



<h2 class="wp-block-heading">サンプルHTML</h2>



<p class="wp-block-paragraph">下のサンプルはこのページに実際に表示されています、開発者ツールで構造を見ながら、上で紹介したセレクタを試してみてください</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>練習用サンプル</span></div><div class="cap_box_content">
<section class="sample">

    <div class="parent">

        <p>親要素です</p>

        <div class="child older">

            <p>子要素です</p>

            <div class="grandchild">

                <p>孫要素です</p>

                <div class="card">

                    <p class="description">説明文です</p>

                    <a href="#" class="cta">詳しく見る</a>

                </div>

            </div>

        </div>

        <div class="child younger">

            <p>子要素の兄弟要素です</p>

            <div class="card">

                <p class="description">説明文2です</p>

                <a href="#" class="cta">詳しく見る</a>

            </div>

        </div>

    </div>

</section>
</div></div>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240" alt="Pythonクローリング&amp;スクレイピング 増補改訂版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Pythonクローリング&amp;スクレイピング 増補改訂版</p><p class="jv-book-author">加藤耕太</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4297107384">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4297107384">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "Pythonクローリング&#038;スクレイピング 増補改訂版", "a": "加藤耕太", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F", "id": "4297107384"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/selenium-find-element/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[<p><img src="https://javeo.jp/wp-content/uploads/2024/10/Python×SQLite-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>SQLiteとは SQLiteはMySQL（MariaDB）やMicrosoft&#160;SQL Serverと同じでRDBMS（データベース管理システム）で、その名の通り軽量でオープンソースのデータベースです と言っ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2024/10/Python×SQLite-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p class="wp-block-paragraph">Pythonでスクレイピングをする時にデータベースがあると色々楽でして、MySQL（MariaDB）やMicrosoft&nbsp;SQL Serverなど機能的にも優れたメジャーなデータベースを使うのもいいですが、個人利用かつ一時利用にはオーバースペック気味なのでお手軽使えるSQLiteの利用方法をご紹介します</p>



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">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">
https://javeo.jp/sqlite-tool-install/
</div></figure>



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



<p class="wp-block-paragraph">SQLiteもデータベースなのでデータ型が存在します</p>



<p class="wp-block-paragraph">値としてのデータ型とカラムとしてのデータ型の2つの観点があって詳細を知りたいなら<a 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" target="_blank" rel="noreferrer noopener nofollow">公式ページはコチラ</a>で、ざっくり書き出すと↓↓の通り</p>



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



<p class="wp-block-paragraph">SQLiteの値は5種類だけで下記参照</p>



<figure class="wp-block-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></figure>



<p class="wp-block-paragraph">他のデータベースでよくある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">カラムのデータ型について</h2>



<p class="wp-block-paragraph">続いてカラムで設定できるデータ型について</p>



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



<figure class="wp-block-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></figure>



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



<p class="wp-block-paragraph">“<strong>SQLite.exe</strong>“でデータを見てみるとこんな感じ</p>



<figure class="wp-block-image size-large"><a 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 class="wp-block-paragraph">この仕様は良いのか悪いのか・・・</p>



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



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



<p class="wp-block-paragraph">代表的なサンプルソース（≒SQL）を書き出します</p>



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



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



<div class="hcb_wrap"><pre class="prism line-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">テーブル削除と作成</h4>



<p class="wp-block-paragraph">SQLiteには<strong>&#8220;TRUNCATE TABLE&#8221;</strong>はないので<strong>&#8220;DROP &amp; CREATE&#8221;</strong>で代替</p>



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



<div class="hcb_wrap"><pre class="prism line-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">データの作成（挿入）</h4>



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



<p class="wp-block-paragraph">無理にまとめて処理しなくてもPythonの中でループ処理もありかも</p>



<div class="hcb_wrap"><pre class="prism line-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">データの取得</h4>



<p class="wp-block-paragraph">普通のSELECT文</p>



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



<p class="wp-block-paragraph">変数に格納するならexecute後にfetchallで値を取得できる</p>



<div class="hcb_wrap"><pre class="prism line-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">データの削除</h4>



<p class="wp-block-paragraph">特に変わりのない一般的な<strong>&#8220;DELETE文&#8221;</strong></p>



<div class="hcb_wrap"><pre class="prism line-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">データの更新</h4>



<p class="wp-block-paragraph">こちらも一般的な<strong>&#8220;UPDATE文&#8221;</strong></p>



<div class="hcb_wrap"><pre class="prism line-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">同時に削除＆挿入 or 挿入＆更新</h4>



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



<p class="wp-block-paragraph">データベース的にはUPSERTの方が適切なんだけどREPLACE INTOの方が簡単</p>



<div class="hcb_wrap"><pre class="prism line-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">全部をまとめたサンプルソース</h4>



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



<div class="hcb_wrap"><pre class="prism line-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">あとがき</h2>



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



<p class="wp-block-paragraph">入門編としてSQLiteは導入コストはないし学習コストも少ないのでオススメです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/python-sqlite3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
