<?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>ビジPy</title>
	<atom:link href="https://ai-inter1.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://ai-inter1.com</link>
	<description>ビジネスに役立つPython入門</description>
	<lastBuildDate>Tue, 03 Feb 2026 03:46:23 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://ai-inter1.com/wp-content/uploads/2018/07/cropped-8b296d4aeaa1aa9e17f90b729aa4a5ff-1-32x32.png</url>
	<title>ビジPy</title>
	<link>https://ai-inter1.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/>	<item>
		<title>Pythonの辞書(dict)に要素を追加する方法を徹底解説！(単一・複数)</title>
		<link>https://ai-inter1.com/python-dictionary-add/</link>
					<comments>https://ai-inter1.com/python-dictionary-add/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Sat, 07 Dec 2024 01:51:28 +0000</pubDate>
				<category><![CDATA[09. ディクショナリ(Dictionary)]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=8970</guid>

					<description><![CDATA[Pythonの辞書(dict)に要素を追加する方法について初心者向けに解説した記事です。辞書に対して１つの要素を追加する方法や複数の要素をまとめて追加する方法について、実例を用いてプログラミング未経験 ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>Pythonの辞書(dict)に要素を追加する方法について初心者向けに解説した記事です。辞書に対して１つの要素を追加する方法や複数の要素をまとめて追加する方法について、実例を用いてプログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。</p>
<p>&nbsp;<br />
「要素の追加」以外の辞書に関するトピックは、次の記事をご参照ください。<br />
<a href="https://ai-inter1.com/python-dictionary/"> >> Pythonの辞書を徹底解説！</a></p>
<h2>辞書に対して１つの要素を追加する方法</h2>
<p>Pythonの辞書（dictionary）は、キーと値のペアを格納するデータ構造で、データの追加、変更、削除が簡単に行えます。まずは辞書に対して１つの要素を追加する方法を確認します。</p>
<h3>基本的な要素の追加方法</h3>
<div class="graybox">dictionary[新しいキー] = 代入値</div>
<p>辞書に新しい要素を追加するには、<span class="rmarker-s">存在していないキーを指定して値を代入</span>します。</p>
<p>&nbsp;<br />
例えば、以下のようにして新しい要素を追加できます。</p><pre class="crayon-plain-tag"># 辞書の定義
employee_data = {'Tanaka': 'Project Manager', 'Suzuki': 'Developer', 'Sato': 'Business Analyst'}

# 新しい要素の追加
employee_data['Yamada'] = 'Designer'</pre><p>
<p>このコードでは、まず <code>employee_data</code> という辞書を定義しています。次に、新しいキー <code>'Yamada'</code>さんとその値 <code>'Designer'</code> を追加しています。</p>
<p>追加後の辞書の中身を確認すると、以下のようになります。</p>
<pre class="crayon-plain-tag">print(employee_data)</pre>
<div class="yellowbox">
{&#8216;Tanaka&#8217;: &#8216;Project Manager&#8217;, &#8216;Suzuki&#8217;: &#8216;Developer&#8217;, &#8216;Sato&#8217;: &#8216;Business Analyst&#8217;, <span class="hutoaka">&#8216;Yamada&#8217;: &#8216;Designer&#8217;</span>}
</div>
<p>このように、<code>print</code>を使用して辞書の中身を表示すると、<code>'Yamada'</code>さんのデータが正しく追加されていることが確認できます。</p>
<p>&nbsp;</p>
<h3>setdefault()メソッドを使った追加(※重複するキーは上書きしない)</h3>
<div class="graybox">dictionary.setdefault(新しいキー, 代入値)</div>
<p><code>setdefault()</code> メソッドでは、<span class="rmarker-s">キーが存在しないときのみ要素を追加できます。</span>これは、<span class="ymarker-s">既に存在するキーの値を上書きしたくない</span>場合に利用します。<br />
&nbsp;<br />
例えば、以下のようにして新しい要素を追加できます。</p><pre class="crayon-plain-tag"># 辞書の定義
employee_data = {'Tanaka': 'Project Manager', 'Suzuki': 'Developer', 'Sato': 'Business Analyst'}

# キーが存在しない場合にのみ追加
employee_data.setdefault('Yamada', 'Designer')</pre><p>
<p>このコードでは、<code>'Yamada'</code>さんというキーが存在しない場合にのみ、<code>'Designer'</code> という値を追加します。既にキーが存在する場合は、何も変更されません。</p>
<p>最後に、<code>print(employee_data)</code> を使って辞書の内容を表示します。</p>
<pre class="crayon-plain-tag">print(employee_data)</pre>
<div class="yellowbox">
{&#8216;Tanaka&#8217;: &#8216;Project Manager&#8217;, &#8216;Suzuki&#8217;: &#8216;Developer&#8217;, &#8216;Sato&#8217;: &#8216;Business Analyst&#8217;, <span class="hutoaka">&#8216;Yamada&#8217;: &#8216;Designer&#8217;</span>}
</div>
<p>辞書の中身を表示すると、<code>'Yamada'</code>さんのデータが正しく追加されていることが確認できます。</p>
<p>&nbsp;</p>
<h2>辞書に対して複数の要素を追加する方法</h2>
<p>次に辞書に対して複数の要素を追加する方法を確認します。まとめていくつかの要素を追加したい場合に便利です。</p>
<h3>update()メソッドを使った要素の追加(※重複するキーは上書き)</h3>
<div class="graybox">dictionary.update({新しいキー１=代入値１, 新しいキー２=代入値２, &#8230;})</div>
<p><code>update()</code>に対して、新しいキー=代入値を渡すとことで、要素を追加できます。新しいキー=代入値の組み合わせは複数、渡すことができます。また<span class="ymarker-s">既存のキーと重複するキーを渡した場合は、引数に指定した値で上書きされます。</span><br />
&nbsp;<br />
例えば、以下のようにして新しい要素を追加できます。</p><pre class="crayon-plain-tag"># 辞書の定義
employee_data = {'Tanaka': 'Project Manager', 'Suzuki': 'Developer', 'Sato': 'Business Analyst'}

# 複数の要素を追加
employee_data.update({'Yamada'='Designer', 'Kato'='Tester'})</pre><p>
<p>このコードでは、<code>employee_data</code> に <code>'Yamada'</code>さんと <code>'Kato'</code>さんという2つの新しい要素を一度に追加しています。<code>update()</code> メソッドを使うことで、複数のキーと値を一度に追加できます。</p>
<p>追加後の辞書の中身を確認すると、以下のようになります。</p>
<pre class="crayon-plain-tag">print(employee_data)</pre>
<div class="yellowbox">
{&#8216;Tanaka&#8217;: &#8216;Project Manager&#8217;, &#8216;Suzuki&#8217;: &#8216;Developer&#8217;, &#8216;Sato&#8217;: &#8216;Business Analyst&#8217;, <span class="hutoaka">&#8216;Yamada&#8217;: &#8216;Designer&#8217;</span>, <span class="hutoaka">&#8216;Kato&#8217;: &#8216;Tester&#8217;</span>}
</div>
<p><code>'Yamada'</code>さんと<code>'Kato'</code>さんのデータが正しく追加されていることが確認できます。</p>
<p>&nbsp;</p>
<h3>辞書のアンパック（展開）を使った要素の追加</h3>
<div class="graybox">new_dictionary = {**dictionary, 新しいキー１:代入値１, 新しいキー２:代入値２, &#8230;}</div>
<p><code>**dictionary</code>のように、辞書の前に**を２つ付けることで、辞書をアンパック（展開）することができます。<span class="rmarker-s">アンパック（展開）することで、辞書のキーと値のペアを個別の引数として渡すことができます。</span><br />
&nbsp;<br />
ここでは{}に対して、辞書dictionaryのキーと値のペアと、新しいキーと代入値のペアを渡して、新しい辞書new_dictionaryを定義しています。</p>
<p>&nbsp;<br />
例えば、以下のようにして新しい要素を追加できます。</p><pre class="crayon-plain-tag"># 辞書の定義
employee_data = {'Tanaka': 'Project Manager', 'Suzuki': 'Developer', 'Sato': 'Business Analyst'}

# 辞書のアンパック（展開）を使って新しい辞書を作成
new_employee_data = {**employee_data, 'Yamada': 'Designer', 'Kato': 'Tester'}</pre><p>
<p>このコードでは、元の辞書 <code>employee_data</code> に新しい要素を追加した新しい辞書 <code>new_employee_data</code> を作成しています。辞書をアンパック（展開）することで、元の辞書を変更せずに新しい辞書を作成できます。</p>
<p>上記の<code>**employee_data</code>の箇所は、元の辞書<code>employee_data</code>がアンパック（展開）されて、その要素<code>'Tanaka': 'Project Manager', 'Suzuki': 'Developer', 'Sato': 'Business Analyst'</code>が挿入されます。</p>
<p>追加後の辞書の中身を確認すると、以下のようになります。</p>
<pre class="crayon-plain-tag">print(new_employee_data)</pre>
<div class="yellowbox">
{&#8216;Tanaka&#8217;: &#8216;Project Manager&#8217;, &#8216;Suzuki&#8217;: &#8216;Developer&#8217;, &#8216;Sato&#8217;: &#8216;Business Analyst&#8217;, <span class="hutoaka">&#8216;Yamada&#8217;: &#8216;Designer&#8217;</span>, <span class="hutoaka">&#8216;Kato&#8217;: &#8216;Tester&#8217;</span>}
</div>
<p>こちらも<code>'Yamada'</code>さんと<code>'Kato'</code>さんのデータが正しく追加されていることが確認できます。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-dictionary-add/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Twitter API申請に関する質問の回答例</title>
		<link>https://ai-inter1.com/twitter-api-application/</link>
					<comments>https://ai-inter1.com/twitter-api-application/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Mon, 28 Feb 2022 12:37:14 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=6477</guid>

					<description><![CDATA[&#160; Developer Portal（開発者ポータル）におけるTwitter APIの利用申請にあたっては、「1. Basic info（基本情報）」「2. Intended to use（ ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Developer Portal（開発者ポータル）におけるTwitter APIの利用申請にあたっては、「1. Basic info（基本情報）」「2. Intended to use（利用目的）」に分けて、質問がいくつかなされます。参考となる回答例を掲載しております。申請の際にご参考ください。</p>
<h2>Basic Info</h2>
<p>「Basic Info」タブに含まれる質問の回答例を記載します。</p>
<h3>What would you like us to call you? （ニックネームは？）</h3>
<div class="redbox">Test User</div>
<p>英語でニックネームを記載してください。ここではTest Userとしました。</p>
<p>&nbsp;</p>
<h3>What country do you live in? （お住まいの国は？）</h3>
<div class="redbox">Japan</div>
<p>日本</p>
<p>&nbsp;</p>
<h3>What’s your current coding skill level?（現在のコーディングスキルのレベルは？）</h3>
<div class="redbox">Some experience</div>
<p>　<br />
いくらか経験あり</p>
<p>&nbsp;</p>
<h3>Get the latest Twitter API news? (optional)　（最新のTwitter APIニュースを取得する？（任意））</h3>
<p>未チェックとしました。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Intended Use</h2>
<p>「Intended Use」タブに含まれる質問の回答例を記載します。</p>
<p>&nbsp;</p>
<h3>How will you use the Twitter API or Twitter Data?（Twitter APIやTwitterデータをどのように使いますか？）</h3>
<div class="redbox">I want to use Twitter API to analyze Twitter data to improve my business.</div>
<p>Twitter APIを使用してTwitterデータを分析し、ビジネスを改善したいと考えています。</p>
<p>&nbsp;</p>
<h3>Are you planning to analyze Twitter Data?（Twitterデータを分析する予定ですか？）</h3>
<div class="redbox">Yes</div>
<p>はい</p>
<p>&nbsp;</p>
<h3>Please describe how you will analyze Twitter data including any analysis of Tweets or Twitter users.（ツイートやTwitterユーザーの分析も含めて、どのようにTwitterデータを分析しますか？）</h3>
<div class="redbox">I want to get and analyze Tweet data related to our products including Tweet text, user name, no of followers, and posted date.</div>
<p>ツイートテキスト、ユーザー名、フォロワー数、投稿日など、自社製品に関連するツイートデータを取得して分析したい。</p>
<p>&nbsp;</p>
<h3>Will your app use Tweet, Retweet, Like, Follow, or Direct Message functionality?（あなたのアプリケーションでは、ツイート、リツイート、いいね、フォロー、ダイレクトメッセージの機能を使う予定ですか？）</h3>
<div class="redbox">No</div>
<p>いいえ</p>
<p>&nbsp;</p>
<h3>Do you plan to display Tweet or aggregate data about Twitter content outside Twitter?（Twitter外でTwitterのコンテンツの集約データやツイートを表示する予定ですか？）</h3>
<div class="redbox">No</div>
<p>いいえ</p>
<p>&nbsp;</p>
<h3>Will your product, service, or analysis make Twitter content or derived information available to a government entity?（あなたの製品、サービス、または分析により、Twitterのコンテンツまたは派生情報を政府機関が利用できるようになりますか？）</h3>
<div class="redbox">No</div>
<p>いいえ</p>
<p>&nbsp;<br />
Twitter API申請に関する質問の回答例は以上です。</p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/twitter-api-application/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>図解！Python Scrapyの使い方を徹底解説！(サンプルコード付きチュートリアル)</title>
		<link>https://ai-inter1.com/python-scrapy-for-begginer/</link>
					<comments>https://ai-inter1.com/python-scrapy-for-begginer/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Tue, 02 Nov 2021 08:54:54 +0000</pubDate>
				<category><![CDATA[05. Scrapy]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=5452</guid>

					<description><![CDATA[Python3におけるScrapyの使い方について初心者向けに解説した記事です。 &#160; 最初にScrapyとはどのようなものかを説明し、その後に、Scrapyのインストール方法と基本的な使い方 ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>Python3におけるScrapyの使い方について初心者向けに解説した記事です。<br />
&nbsp;<br />
最初にScrapyとはどのようなものかを説明し、その後に、Scrapyのインストール方法と基本的な使い方を、サンプルコード付きのチュートリアル形式で、具体的な例を用いて解説していきます。<br />
&nbsp;<br />
<span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用ください。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！」(Udemyへのリンク)</a></p>
<h2>Scrapyとは、できること</h2>
<p>Scrapy（読み方：スクレイピー）とは、<span class="rmarker-s">Pythonのスクレイピング・クローリング専用のフレームワークです。</span>主にWebページからのデータ取得に用いられます。</p>
<p>&nbsp;<br />
今までのWebスクレイピングの方法では、BeautifulSoupやRequestsなど、複数のライブラリを継ぎはぎに組み合わせながら、多くのコーディングを行う必要がありました。この結果、スクレイピングの学習や作業に非常に多くの時間を費やし、せっかく取得したデータの活用に割ける時間が奪われてしまっていました。</p>
<p>&nbsp;<br />
しかしスクレイピング専用のフレームワークであるScrapyの登場により、これは劇的に変わりました。フレームワークとは、全体の処理の流れがある程度、事前に組み込まれているソフトウェアの基盤になります。従って、<span class="ymarker-s">面倒な多くのことはフレームワーク自体が行ってくれて、これによりデータの取得が容易になり、効率的に行うことができるようになりました。</span></p>
<p>&nbsp;<br />
別のページへのリンクのたどり方や、どのデータを取得するかなど、最低限必要なコーディングだけを行えばよくなりました。さらに１つのフレームワークで実現するので、一貫性が保たれ、非常に高速にデータを取得することができます。</p>
<p>&nbsp;<br />
<span class="rmarker-s">これにより効率的にWebサイトからデータを取得することができ、データ取得の本来の目的であるデータの活用に、より多くの時間を割くことができるようになります。</span></p>
<p>&nbsp;<br />
この記事では、このPythonのスクレイピング専用フレームワークScrapyの使い方を、徹底的に解説していきます。<br />
&nbsp;<br />
<span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用ください。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！」(Udemyへのリンク)</a></p>
<p>&nbsp;</p>
<h2>ScrapyとBeautifulSoup、Seleniumとの違い</h2>
<h3>データ取得のステップ</h3>
<p>Webページからのデータ取得は、次の３ステップで行われます。<br />
<img fetchpriority="high" decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/62c63248fc6524b2791f0ce16a1f7e1c.png" alt="scrapyのメリットとscrapyとbeautifulsoupの違いを比較" width="541" height="235" class="aligncenter size-full wp-image-5865" /></p>
<p>１つ目はWEBページのHTMLデータのダウンロードです。ただし、HTMLには必要な文章のデータだけでなく、タグなどのデータも混じっているので、必要なものだけを抽出する作業が必要になります。</p>
<p>そこで２つ目のデータの抽出が欠かせません。ここでは、複雑な構造のHTMLデータを解析し、必要なデータだけを抽出します。</p>
<p>そして最後に抽出したデータをデータベースやファイルなどに保存します。</p>
<p>&nbsp;</p>
<h3>データ取得に利用するライブラリ</h3>
<p>Pythonでデータ取得によく使われるライブラリとしては、Requests、Beautiful Soup、Selenium、Scrapyがあります。<br />
&nbsp;<br />
先ほどのデータ取得の３ステップの中で、それぞれのライブラリがどこで使われるのかをまとめると次のようになります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/57054ef4d8aff6ed97c0968c19f49b0e.png" alt="scrapyのメリットとscrapyとseleniumの違いを比較" width="523" height="158" class="aligncenter size-full wp-image-5868" /><br />
Requestsは１つ目のHTMLデータのダウンロードによく用いられます。PythonではRequestsを利用して、簡単にWebページからHTMLを自動的にダウンロードすることができます。<br />
&nbsp;<br />
その後、取得したHTMLからBeautiful Soupなどの別のライブラリを用いて必要なデータのみを抽出します。<br />
&nbsp;<br />
またSeleniumは、JavaScriptが使われている特殊なWebページからのHTMLデータのダウンロードや、サイトへのログインなどに使います。<br />
&nbsp;<br />
Seleniumは、HTMLのダウンロードだけでなく、必要なデータの抽出も行うことができますが、ブラウザを操作してデータを取得しますので、動作が遅いことが難点です。従って、できるだけ必要最低限の箇所でSeleniumを使うことをお勧めします。<br />
&nbsp;<br />
そして<span class="rmarker-s">これら３つのステップを全てカバーするのがScrapyになります。</span>Scrapyでは、コードは主にSpiderと呼ばれるクラスに記述していきます。Spiderにコードを記述すれば、後は他のものがうまく連動してくれて、必要な作業を行ってくれます。<br />
&nbsp;<br />
<span class="ymarker-s">Spiderには、最初のURLとリンクのたどり方を記述します。すると後はScrapyが、当てはまるWebページを次々自動的に高速にダウンロードしてくれます。そして、取得したHTMLの中から、どのデータを抽出するのかを、Spiderに記述します。すると、データの抽出自体はScrapyが行ってくれます。</span><br />
&nbsp;<br />
<span class="rmarker-s">ファイル出力は、コマンド１つでScrapyがCSV、JSON、XMLなど各種ファイルに出力・保存してくれます。</span><br />
&nbsp;<br />
またJavaScriptが使われている特殊なWebページに対しては、Scrapy-SeleniumやScrapy-Splashを使います。これらについては別の記事で紹介していきます。</p>
<p>&nbsp;</p>
<h2>Scrapyのインストール方法（Anacondaでの環境構築）</h2>
<h3>Anacondaでの環境構築(Python3.8)</h3>
<p>本記事では、AnacondaとVS Codeを元にScrapyの開発環境を構築していきます。詳細は、以下のリンクを参照ください。またAnacondaでの仮想環境の作成においては、<span class="rmarker-s">Pythonのバージョンは、必ず3.8を選択してください。現時点で、Scrapyはpython3.9に対応していません。</span><br />
<a href="https://ai-inter1.com/python-vscode/" target="_blank" rel="noopener noreferrer">>> VS CodeでPython開発環境の構築</a></p>
<p>&nbsp;</p>
<h3>Scrapyのインストール</h3>
<p>次にScrapyをインストールします。Anaconda Navigatorから仮想環境を選択し、三角のボタンをクリックして表示されたメニューから「Open Terminal」を選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/364dce4b1144ecad188b3c5c9b719987.png" alt="scrapyの日本語環境のインストール" width="451" height="201" class="aligncenter size-full wp-image-5857" /><br />
&nbsp;<br />
ターミナルが立ち上がったら、環境が先ほど作成したものであることを確認します。そして次のコマンドを入力し実行します。</p>
<div class="graybox">conda install -c conda-forge scrapy==2.4.1</div>
<p><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/cf77168b1bfe31efe74b47a69f51ab6c.png" alt="pipでのscrapy2.4のインストール" width="718" height="90" class="aligncenter size-full wp-image-5858" /><br />
途中で Proceed ([y]/n)?　とインストールの確認メッセージが表示されたらyと入力し、Scrapyをインストールします。<br />
&nbsp;<br />
インストールが終わりましたら、Scrapyの環境構築は終わりです。</p>
<p>&nbsp;</p>
<h2>Scrapyで利用できるコマンド</h2>
<p>Scrapyでは、ターミナルを起動してコマンドを入力・実行することで、次のことを行うことができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/e6285178ad701fa41e9682bfa35ee0ee.png" alt="scrapyで利用できるコマンドの一覧(scrapy run spiderやscrapy crawlコマンドなど)" width="811" height="446" class="aligncenter size-full wp-image-5823" /><br />
&nbsp;<br />
コマンドの詳細については、以下を参照ください。<br />
<a href="https://ai-inter1.com/python-scrapy-command/" target="_blank" rel="noopener noreferrer">>> Scrapyで利用できるコマンド</a><br />
&nbsp;<br />
後で実際に実行していきますが、基本的な流れとしては、startprojectコマンドでプロジェクトを作成し、genspiderでプロジェクト内にspiderを作成していきます。<br />
 &nbsp;<br />
spiderのコーディングでは、必要に応じてshellでデータ取得方法を確認し、それをspiderに反映します。またScrapyのコーディングは、VS Codeで行います。<br />
&nbsp;<br />
そしてコーディングが終わりましたら、crawlコマンドでspiderを実行する　というのが一連の流れになります。</p>
<p>&nbsp;</p>
<h2 id="startproject">プロジェクトの作成</h2>
<p>それでは実際にプロジェクトの作成、spiderの作成と一連の流れを確認していきます。<br />
&nbsp;</p>
<h3>Scrapyでの開発ステップ</h3>
<p>後で実際に１つ１つ確認していきますが、基本的な流れとしては、次のようになります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/e8d34a16522e7ed03b5c2451f779d457-1.png" alt="Scrapyでの開発ステップのドキュメント" width="1059" height="349" class="aligncenter size-full wp-image-5738" /><br />
まずは大きく分けて２つのパートがあります。１つは、スクレイピング対象のサイトを分析し、データの取得方法の検討・確認を行うパート（左側）と、もう１つは、プロジェクトの作成からspiderの作成と、実際にコーディングを行うパート（右側）です。</p>
<p>&nbsp;<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/22f922acf751eac2bca7da0bd3964937.png" alt="Scrapyでの開発ステップのドキュメント" width="1323" height="496" class="aligncenter size-full wp-image-5740" /><br />
<span class="ymarker-s">まずデータの取得方法の検討・確認を行うパート（左側）では、最初に目的のWebサイトからデータの取得方法を検討します。</span>データの取得は、XPathやCSSセレクタと呼ばれるHTMLの中から必要な情報を取得するのに利用する簡易言語を使います。<br />
&nbsp;<br />
ブラウザGoogle Chromeの開発者ツールを用いて、取得したいデータがあるサイトのHTMLを確認し、XPathやCSSセレクタでデータの取得方法などを検討していきます。<br />
&nbsp;<br />
XPathやCSSセレクタの詳しい説明は、以下を参照ください。<br />
<a href="https://ai-inter1.com/xpath/" target="_blank" rel="noopener noreferrer">>> XPathでスクレイピングする方法</a><br />
<a href="https://ai-inter1.com/beautifulsoup_1/#st-toc-h-26" target="_blank" rel="noopener noreferrer">>> CSSセレクタを用いたBeautifulSoupのselectメソッドの使い方</a><br />
&nbsp;<br />
そして必要に応じて、これら検討したXPathやCSSセレクタで、正しくデータ取得できることをshellで確認します。<span class="ymarker-s">shellでの確認は任意ですので、これを行わず、直接spiderへコーディングを行い、実行してエラーがあれば修正するという方法でも問題ありません。</span>慣れてくると、通常は、shellでの確認は、行わなくなるかと思います。<br />
&nbsp;<br />
またこれらのデータの取得方法の検討・確認は、spiderのコーディングまでに終えていれば良いので、これを最初に行わず、プロジェクトやspiderの作成の後や、さらにはspiderのコーディングの最中に行っても問題ありません。<br />
&nbsp;<br />
またスクレイピング対象のサイトが構造の異なる複数のページに分かれている場合、１つのページの取得方法を検討・確認してはコーディングを行い、もう１つのページの取得方法を検討・確認してはコーディングを行うと行ったり来たりすることもあります。</p>
<p>&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/4f0d83f5b7f85d3eecb006a53433b18a.png" alt="Scrapyでの開発ステップの概念" width="1321" height="491" class="aligncenter size-full wp-image-5742" /><br />
そしてコーディングを行っていくパート（右側）では、最初にターミナルからstartprojectコマンドでプロジェクトを作成し、genspiderでプロジェクト内にspiderを作成していきます。<span class="rmarker-s">１つのプロジェクト内には、目的に応じて複数のspiderを作成することができます。</span><br />
&nbsp;<br />
次にspiderのコーディングでは、これら確認したXPathやCSSセレクタをspiderに反映していきます。またspiderではXPathやCSSセレクタ以外のコーディングも行います。spiderのコーディングはVS Codeで行います。<br />
&nbsp;<br />
そしてコーディングが終わったら、crawlコマンドでspiderを実行して、実行結果を確認し、問題があればコードに戻って修正します。<br />
&nbsp;<br />
というのが一連の流れになります。<span class="rmarker-s">これらの各ステップは、この後で１つずつ確認していきます。</span></p>
<p>&nbsp;</p>
<h3>Scrapyの練習用サイト</h3>
<p>この記事では、スクレイピング用の練習サイト、<a href="https://books.toscrape.com/" target="_blank" rel="noopener noreferrer">Books to Scrape</a>のサイトから書籍のデータを取得していきます。</p>
<p>&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/BooksToScrape1.png" alt="Scrapyの例(練習サイト)" width="1280" height="720" class="aligncenter size-full wp-image-5744" /><br />
このサイトは、書籍を販売しているサイトのイメージで作成されています。スクレイピング用の練習サイトですので、実際に書籍を販売しているわけではありません。ここには、全部で１０００冊の書籍があり、1ページに２０冊分ずつの書籍が一覧で表示されています。<br />
&nbsp;<br />
一覧では書籍の簡単な情報が掲載されており、書籍の表紙の画像、星での評価、タイトル、価格、在庫状況、バスケットに追加のボタンが表示されています。</p>
<p>&nbsp;<br />
&nbsp;<br />
各書籍のタイトルをクリックすると、詳細ページへ遷移します。この詳細ページでは、その書籍に関する、より詳しい情報を確認することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/BooksToScrape3.png" alt="Scrapyでリンクをたどったページ遷移のサンプル" width="1226" height="514" class="aligncenter size-full wp-image-5746" /></p>
<p>&nbsp;<br />
&nbsp;<br />
また一覧に戻ってページの下の方へ行くと、次のページへのリンクがあります。このnextをクリックすると、次のページへ遷移することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/BooksToScrape4.png" alt="Scrapyで次のページ遷移のスクリーンショット" width="928" height="461" class="aligncenter size-full wp-image-5748" /></p>
<p>&nbsp;<br />
&nbsp;<br />
また各書籍はカテゴリ分けされていて、左側にはカテゴリのメニューが表示されています。<br />
このメニューをクリックすると、一覧に表示される書籍を、カテゴリ毎に絞り込んでいくことができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/BooksToScrape5.png" alt="Scrapyの練習サイトの流れ" width="511" height="478" class="aligncenter size-full wp-image-5752" /><br />
&nbsp;<br />
この記事では、全ての書籍から情報を取得していては時間がかかりますので、カテゴリfantasyに属する４８冊の書籍に絞って、データを取得していきます。<br />
&nbsp;<br />
まずはfantasyのカテゴリの１ページ目に表示されている、書籍のタイトルとURLの一覧を取得していきます。そして、後で２ページ目以降のデータの取得方法を検討していきます。</p>
<p>&nbsp;</p>
<h3>プロジェクトの作成</h3>
<p>Scrapyでプロジェクトの作成には、startprojectコマンドを使います。</p>
<div class="graybox">scrapy startproject プロジェクト名 [ディレクトリ]</div>
<p>ディレクトリの指定は任意で、指定しなくても問題ありません。<br />
&nbsp;<br />
指定したディレクトリの下に ここで指定した名前の新しいScrapyプロジェクトを作成します。 ディレクトリ を指定しなかった場合、 ディレクトリ は プロジェクト名 と同じになります。<br />
&nbsp;<br />
まずはprojectsというディレクトリを作成します。その中にこれからの様々なプロジェクトを作成していきます。ディレクトリの作成は、mkdirを使います。</p>
<div class="graybox">mkdir projects</div>
<p>&nbsp;<br />
ディレクトリprojectsを作成した後、コマンドcdでprojectsに移動します。</p>
<div class="graybox">cd projects</div>
<p>&nbsp;<br />
そして先ほどのstartprojectコマンドでScrapyのプロジェクトを作成します。ここではプロジェクト名はbooks_toscrapeとします。</p>
<div class="graybox">scrapy startproject books_toscrape</div>
<p>startprojectコマンドを実行すると、プロジェクトに必要なディレクトリ、ファイルが自動的に作成されます。</p>
<p>&nbsp;</p>
<h3>フォルダ・ファイルの説明</h3>
<p>ここで、startprojectコマンドで作成されたものを確認してみましょう。使い方、設定方法は後で解説いたします。ここではざっくりと、どのようなものがあるかを説明いたします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/cdfd60b28fbf76feb432a6d0caf57557.png" alt="Scrapyで作成されたフォルダ階層(middlewares.pyなどの配置)" width="258" height="241" class="aligncenter size-full wp-image-5759" /></p>
<p>・scrapy.cfgファイル<br />
spiderの作成やデプロイに重要な設定ファイルです。</p>
<p>・spidersフォルダ<br />
<span class="rmarker-s">このフォルダの中にspiderが作成されます。</span></p>
<p>・items.pyファイル<br />
スクレイピングで取得したデータを格納する入れ物のようなものです。これはアイテムと呼ばれています。アイテムの各フィールドは、このような形で定義し、予め定義していないとデータを格納できません。この例では、フィールド名nameが定義されています。またspiderではアイテムを使わず、辞書に格納することもできます。</p>
<div class="graybox">name = scrapy.Field()</div>
<p>&nbsp;<br />
・middlewares.pyファイル<br />
requestとresponseに関連する追加の処理を拡張する為に、ロジックを記述します。２つのmiddlewareがあり、１つはspider middlewareでWebサイトへのrequestやresponseに関連する処理を拡張することができます。もう１つは、download middlewareで、Webサイトからページのダウンロードに関する処理を拡張することができます。</p>
<p>・pipline.pyファイル<br />
Webサイトから取得したデータのクレンジング、チェック、DBへの更新などの処理を記述するのに利用します。</p>
<p>・settings.pyファイル<br />
<span class="rmarker-s">パラメーターで各種設定を行う設定ファイルです。今後よく使うことになります。</span></p>
<p>&nbsp;</p>
<h2>Spiderの作成</h2>
<p>それではspiderを作成していきます。先ほど作成したプロジェクトbooks_toscrapeへ移動します。</p>
<div class="graybox">cd books_toscrape</div>
<p>&nbsp;<br />
そしてspiderを作成します。scrapy genspider と入力し、基本的にはスパイダー名、URLを入力します。</p>
<div class="graybox">scrapy genspider [-t テンプレート] スパイダー名 URL</div>
<p><span class="ymarker-s">URLの内、最初のhttps://と最後の / は削除してください。</span>URLのこれらのものは、scrapyが自動で付加してくれますので、重複を避ける為、ここでは削除します。但し、scrapyはhttp://のプロトコルでテンプレートを自動的に作成しますので、後でhttpsに修正する必要があります。<br />
&nbsp;<br />
またspiderはScrapyで予め用意されたテンプレートを元に作成されます。<br />
必要に応じて、-t に続いて、テンプレートを指定します。<br />
&nbsp;<br />
利用できるテンプレートは、次のコマンドで確認することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/3c52752ed6f089df763c63043198c8fa.png" alt="Scrapyのテンプレート(crawlなど)" width="674" height="123" class="aligncenter size-full wp-image-5764" /><br />
<span class="rmarker-s">何も指定しなければ、basicのテンプレートになります。</span>ここでは、このbasicのテンプレートを使います。<br />
&nbsp;<br />
crawlは、通常のWebサイトをクロールするために使われるテンプレートです。ルールを定義してリンクをたどっていくテンプレートになります。このテンプレートは、別の記事で詳しく解説いたします。<br />
&nbsp;<br />
csvfeedはcsvファイルを、xmlfeedはxmlファイルを読み込むテンプレートです。これらはめったに使いません。通常はbasicかcrawlテンプレートを使うことになります。<br />
&nbsp;<br />
それでは、genspiderコマンドでspiderを作成します。scrapy genpiderに続いて、spider名を入力します。ここではbooks_basicとします。またURLはサイトから取得して貼り付けます。そして、https://と最後の/を消します。</p>
<div class="graybox">scrapy genspider books_basic books.toscrape.com/catalogue/category/books/fantasy_19/index.html</div>
<p>&nbsp;<br />
コマンドを実行すると、spidersフォルダの下にspiderのファイル、books_basic.pyが作成されています。</p>
<p>&nbsp;</p>
<h3>Spiderのclassの説明（basicテンプレート）</h3>
<p>作成したspiderのファイル、books_basic.pyを開きます。</p><pre class="crayon-plain-tag">import scrapy

class BooksBasicSpider(scrapy.Spider):
    name = 'books_basic'
    allowed_domains = ['books.toscrape.com/catalogue/category/books/fantasy_19/index.html']
    start_urls = ['http://books.toscrape.com/catalogue/category/books/fantasy_19/index.html/']

    def parse(self, response):
        pass</pre><p>
<p>spiderはクラスです。scrapyモジュールにあるspiderクラスを継承しています。つまり、このspiderクラスの多くの機能を引き継いでいます。<br />
&nbsp;<br />
この中には、オーバーライド、<span class="rmarker-s">つまり上書きすべきコードだけを記述していきます。</span>従って、Scrapyではほんの数行のコードでも、多くのことを実現することができます。<br />
&nbsp;<br />
属性としては、これらの３つが定義されています。</p>
<ul>
<li>name属性には、先ほどのgenspiderコマンドで入力したspiderの名前が入っています。 それぞれのspiderはユニークな名前を持っています。ここでは、books_basicになります。１つのprojectで複数のspiderを作成できますが、<span class="rmarker-s">それぞれユニークな名前を付ける必要があります。重複してはダメです。</span></li>
<li>allowed_domeinsは、spiderがアクセスできるドメインを示します。リストなので複数指定することも可能です。無くても良いですが、spiderがリンクをたどって思わぬドメインもスクレイピングしないように設定する方がよいです。
<div class="yellowbox-s">またドメインなので、http://などのプロトコルは付ける必要が御座いません。</div>
</li>
<li>start_urlsは、spiderがスクレイピングを開始するURLが設定されます。spiderは初期設定では、http://で作成するので、<span class="ymarker-s">https://とsを付ける必要があります。（※コードにsを追記する。）</span></li>
</ul>
<p>またメソッドとしてparseメソッドが記述されています。</p>
<p>&nbsp;</p>
<h4>Scrapyの処理の流れ</h4>
<p>Scrapyの処理の説明に入る前に、まずHTTP通信とリクエストメソッドについて、概要を簡単に説明します。WebブラウザでWebページを開くと、WebブラウザとWebサーバの間でデータの通信が行われます。この通信はHTTPというプロトコルに基づいて行われます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/b9be7c146faaa87055c6fec10876c938.png" alt="Scrapyの処理の流れ" width="476" height="296" class="aligncenter size-full wp-image-5768" /><br />
Webブラウザは最初に、開きたいWebページのアドレスをWebサーバに要求、リクエストを送信します。するとWebサーバは、ブラウザからのリクエストを受けて様々な処理を行った後、ブラウザへ回答、レスポンスを返します。<span class="ymarker-s">Scrapyは、ここでのブラウザの役割の代わりを担い、リクエストの送信やレスポンスの受け取りを行います。</span><br />
&nbsp;<br />
<span class="rmarker-s">Scrapyの一連の処理では、まずrequestがstart_urls属性に設定されたURLに送られます。そして、Webサイトからのresponseをparseメソッドでキャッチします。このparseメソッドの中にXPathやCSSセレクタを用いて情報の抽出を行っていきます。</span><br />
&nbsp;<br />
Webサイトから返ってくるresponseの中には、WebページのHTMLコードも含まれます。1ページ全てのコードになりますので、非常に多くのコードが含まれており、その中から必要な情報だけを取得する必要があります。<br />
&nbsp;<br />
XPathやCSSセレクタは、HTMLの多くのコードの中から必要なものを取得するのに利用する簡易言語です。Scrapyを使ったスクレイピングでは大変重要になってきます。XPathやCSSセレクタの詳しい説明は、以下を参照ください。<br />
<a href="https://ai-inter1.com/xpath/" target="_blank" rel="noopener noreferrer">>> XPathでスクレイピングする方法</a><br />
<a href="https://ai-inter1.com/beautifulsoup_1/#st-toc-h-26" target="_blank" rel="noopener noreferrer">>> CSSセレクタを用いたBeautifulSoupのselectメソッドの使い方</a><br />
&nbsp;<br />
これら以外にも多くのメソッドがあり、scrapyでは必要に応じてオーバーライド、つまり上書きして処理を記述していきます。<br />
&nbsp;<br />
<span class="ymarker-s">最後に注意点として、これらの予めテンプレートに定義された属性とメソッド(name、allowed_domein, parse, etc.)の名前を変更してはいけません。うまく動作しなくなります。</span><br />
&nbsp;<br />
spiderの作成と、最初に生成されるコードの説明は以上です。一旦、変更したものを保存します。保存は、ショートカットキーCtr + Sになります。</p>
<p>&nbsp;</p>
<h2 id="chrome">Chrome開発者ツールの使い方</h2>
<p>次に、実際にspiderのコーディングに取り掛かる前に、ブラウザChromeを用いて、目的のWebサイトからデータをどのようにして取得するか、検討する方法を説明いたします。<br />
&nbsp;<br />
<span class="ymarker-s">Webスクレイピングでは、対象のWebサイトのHTMLソースコードを確認して、取得したい項目が格納されている箇所を特定し、取得方法を確認する必要があります。</span><br />
&nbsp;<br />
これらの確認にChromeの開発者ツールは用いられ、スクレイピングを行う上で非常に重要なツールとなります。<br />
&nbsp;<br />
ブラウザGoogle Chromeがインストールされていない方は、以下のリンクよりインストールしてください。<br />
<a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer">>> Google Chrome公式ページ</a></p>
<p>&nbsp;</p>
<h3>開発者ツールの表示方法</h3>
<p>ブラウザGoogle Chrome を立ち上げ、Books to Scrapeのサイトに行き、カテゴリからfantasyを選択します。fantasyに属する書籍の一覧が表示されます。<br />
&nbsp;<br />
ここで１つの書籍のタイトルにカーソルを当てて、右クリックのメニューから検証を選択します。すると、右側に該当箇所のHTMLコードがハイライトされて表示されます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/47ac8603dc995e7b43a131a678979474.png" alt="aaa" width="775" height="275" class="aligncenter size-full wp-image-5777" /></p>
<p>&nbsp;<br />
書籍のタイトルやURLは、このh3要素配下のa要素に含まれています。タイトルはtitle属性、もしくは、a要素配下のテキスト、URLはhref属性に格納されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/5ba1537ed055f0bb979232b4d2edae87.png" alt="aaa" width="665" height="317" class="aligncenter size-full wp-image-5779" /><br />
&nbsp;<br />
指定方法をXPathやCSSセレクタで確認していきます。Ctr + Fで検索ウィンドウを表示します。ここでは、XPathやCSSセレクタを入力することで、HTMLコードの中で該当する箇所を確認することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/f17715bfbb9d93fba7cbbb85c0c5f0f3.png" alt="aaa" width="603" height="294" class="aligncenter size-full wp-image-5782" /><br />
最初にXPathで取得方法を検討し、その後にCSSセレクタでも検討します。</p>
<p>&nbsp;</p>
<h3>XPathでの取得方法の検討</h3>
<p><span class="ymarker-s">XPathで途中の階層から要素を指定するには、ダブルスラッシュから始めます。</span>//h3 とh3要素を指定すると、ヒット件数は20件になります。下矢印を押すと、次の書籍のタイトルにハイライトが移動していきます。この２０件は、このページの書籍の件数２０と一致します。余分なものも含まれていないようです。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/eb86cce9c4b5b21286dd01779a983818.png" alt="aaa" width="684" height="203" class="aligncenter size-full wp-image-5784" /></p>
<p>&nbsp;<br />
一方でh3要素を省略し、a要素から取得しようとすると、９５件がヒットし、この中には書籍の情報が格納されているもの以外の要素も含まれてしまっています。従って、//h3/aとa要素の親要素であるh3要素から取得していきます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/e98bc961a0887cf9805a65859e0c5e13.png" alt="aaa" width="692" height="127" class="aligncenter size-full wp-image-5785" /></p>
<p>&nbsp;<br />
書籍のタイトルは、a要素のtitle属性の値を取得する場合は、</p>
<div class="graybox">//h3/a/@title</div>
<p>となります。属性の値は、@に続いて属性名で取得することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/49bf4b2a0b29714896cb628e45151dd8.png" alt="aaa" width="697" height="166" class="aligncenter size-full wp-image-5787" /></p>
<p>&nbsp;<br />
また書籍のタイトルはa要素の配下のテキストにも格納されていますので、</p>
<div class="graybox">//h3/a/text()</div>
<p>でも取得することができます。</p>
<p>&nbsp;<br />
そしてURLは、a要素のhref属性の値に格納されていますので、</p>
<div class="graybox">//h3/a/@href</div>
<p>で取得することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/4355f7e0c6b5e66a1e4894802b3272f7.png" alt="aaa" width="682" height="159" class="aligncenter size-full wp-image-5789" /></p>
<p>&nbsp;</p>
<h3>CSSセレクタでの取得方法の検討</h3>
<p>同じ内容をCSSセレクタでも取得してみます。<br />
&nbsp;<br />
<span class="ymarker-s">CSSセレクタで途中の階層から指定する場合は、そのまま要素名を入力するだけで良いので、h3と入力します。</span>そしてその配下のa要素を指定するには、１つスペースを空けてaと入力します。<span class="ymarker-s">この場合は、h3要素の子孫要素の中からa要素を指定することになります。</span>a要素はh3要素の直接配下にありますので、子要素になります。子要素も子孫要素の一種ですので、このようにスペースで指定することができます。</p>
<div class="graybox">h3 a</div>
<p>&nbsp;<br />
<span class="ymarker-s">また子要素と限定して指定する場合は、大なりの記号で指定することができます。</span>大なりの記号の前後にはスペースを挟みます。</p>
<div class="graybox">h3 > a</div>
<p>いずれの方法でもh3配下のa要素を指定することができます。<br />
&nbsp;<br />
そしてタイトルは、擬似要素と呼ばれる特殊な要素の指定方法を利用して取得することができます。コロン２つに続いてtextと記述します。<span class="rmarker-s">但し、これらの疑似要素は非標準で、開発者ツールでは確認することができず、コーディングの際に追記します。</span></p>
<div class="graybox">h3 a::text</div>
<p>&nbsp;<br />
またtitle属性の値を取得する場合は、こちらも擬似要素を用いてコロン２つに続いてattr(title)と記述します。attr()で属性の値を取得することができ、ここではtitle属性の値を取得しています。</p>
<div class="graybox">h3 a::attr(title)</div>
<p>&nbsp;<br />
そしてURLは、href属性の値ですので、こちらも擬似要素を用いて、:: attr(href)で取得することができます。</p>
<div class="graybox">h3 a::attr(href)</div>
<p>&nbsp;<br />
以上で書籍のタイトルとURLの取得方法について、検討が終わりました。次に、これらの情報を取得すべく、コーディングに入っていきます。</p>
<p>&nbsp;</p>
<h2>Scrapy Shellの使い方</h2>
<p>Shellは、Chromeの開発者ツールで確認したXPathやCSSセレクタで、うまく目的の情報を取得できるか確認するのに利用します。<br />
&nbsp;<br />
<span class="ymarker-s">取得方法に特に懸念点が無い場合、このプロセスを飛ばして、次のspiderへのコーディングに進んで頂いても問題御座いません。</span>慣れてくるとspiderに直接まとめてコーディングして、エラーが出た場合は修正する、という方がやり易いかもしれません。<br />
&nbsp;<br />
Shellの詳細については、以下を参照ください。<br />
<a href="https://ai-inter1.com/python-scrapy-shell/" target="_blank" rel="noopener noreferrer">>> Scrapy Shellの使い方</a></p>
<p>&nbsp;</p>
<h2>Spiderのコーディングと実行</h2>
<p>それでは、いよいよspiderのコーディングに入っていきます。その中で、scrapyの各種設定を行う設定ファイルsettings.pyファイルの編集とspiderのコーディングの方法について、解説いたします。</p>
<p>&nbsp;</p>
<h3>プロジェクトフォルダのオープン</h3>
<p>まずはAnaconda Navigatorのメニューから、作成した仮想環境を選択します。この記事では、scrapy_workspaceになります。そして、VS Codeを起動します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/02f37d91e130c8dc07fdda8c0a305575.png" alt="aaa" width="677" height="292" class="aligncenter size-full wp-image-5794" /></p>
<p>&nbsp;<br />
VS Codeでは、fileメニューからopen folderを選択し、サブWからprojectsフォルダ配下のbooks_toscrapeを選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/d42007332f622635ce7a01ffaf733921.png" alt="aaa" width="283" height="196" class="aligncenter size-full wp-image-5795" /></p>
<p>&nbsp;</p>
<h3>settings.pyの編集</h3>
<p>最初にsettings.pyをオープンします。<span class="rmarker-s">ここでは、パラメーターでscrapyの様々なオプションを指定します。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/7df28cc02759b3f914606a12d1b18ec2.png" alt="aaa" width="590" height="283" class="aligncenter size-full wp-image-5798" /></p>
<p>&nbsp;<br />
<span class="ymarker-s">FEED EXPORT ENCODINGでは、出力ファイルの文字コードを指定します。</span>文字コードには様々なものがありますが、標準的なutf-8を指定します。指定をしないと文字化けすることがあります。</p><pre class="crayon-plain-tag">FEED_EXPORT_ENCODING = 'utf-8'</pre><p>
<p>&nbsp;<br />
DOWNLOAD DELAYのパラメーターのコメントアウトを外します。コメントアウトの解除はショートカットキー、Ctr + K + U　で行うことができます。<span class="ymarker-s">DOWNLOAD DELAYでは、1つのページをダウンロードしてから、次のページをダウンロードすするまでの間隔（単位：秒）で指定します。</span></p><pre class="crayon-plain-tag">DOWNLOAD_DELAY = 3</pre><p>
誤ってサーバーに対して負荷をかけ過ぎないよう、ダウンロード毎の処理の間隔として3秒間隔を開けます。</p>
<p>&nbsp;<br />
また次の<span class="ymarker-s">ROBOTSTEXT_OBEYは、robots.txtがある場合は、それに従うかどうかを指定するパラメーターになります。</span>最初からTrueになっておりますので、ここでは不用意にrobots.txtで禁止されているページにアクセスしないよう、このままTrueにしておきます。</p><pre class="crayon-plain-tag"># Obey robots.txt rules
ROBOTSTXT_OBEY = True</pre><p>
<p>&nbsp;<br />
全ての変更が終わりましたので、変更内容を保存します。ショートカットキーCtr + S で保存します。<br />
&nbsp;<br />
settings.pyの変更は以上になります。<br />
 </p>
<p>&nbsp;</p>
<h3>Spiderのコーディング</h3>
<p>それではいよいよ最後のspiderのコーディングに入っていきます。ここではカテゴリFantasyの最初のページから、書籍のタイトル・URLの一覧を取得していきます。<br />
&nbsp;<br />
先ほど作成したbooks_basicのspiderをオープンします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/b5583ca6d8a23340bec5f770f3c84c93.png" alt="aaa" width="651" height="287" class="aligncenter size-full wp-image-5802" /></p>
<h4>属性の変更</h4>
<p>spiderにはこれらの３つの属性が定義されていました。<br />
・name属性には、spiderの名前が入っています。<br />
&nbsp;<br />
・allowed_domeinsは、spiderがアクセスできるドメインを示します。<br />
<span class="rmarker-s">ドメイン名ですので、books.toscrape.com　と、手前のドメイン部分だけにする必要があります。</span></p><pre class="crayon-plain-tag">allowed_domains = ['books.toscrape.com']</pre><p>
&nbsp;<br />
・start_urlは、spiderがスクレイピングを開始するURLが設定されます。spiderは初期設定では、http://で作成するので、<span class="rmarker-s">https://とsを付ける必要があります。</span></p><pre class="crayon-plain-tag">start_urls = ['https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html']</pre><p>
<p>&nbsp;<br />
&nbsp;</p>
<h4>parseメソッドのコーディング</h4>
<p>またメソッドとしてparseメソッドが記述されています。Scrapyの一連の処理では、まずrequestがstart_urlsのURLに送られます。そして、Webサイトからのresponseをparseメソッドでキャッチするということでした。<span class="ymarker-s">この中にGoogle Chromeで確認したXPathやCSSセレクタを用いて情報の抽出を行っていきます。</span></p>
<p>&nbsp;</p><pre class="crayon-plain-tag">def parse(self, response):
        books = response.xpath('//h3')
        # books = response.css('h3')
        yield {
            'books': books
        }</pre><p>
先ほど確認したXPathを元に、まずはh3要素を取得し、変数booksに格納します。このh3要素の配下の要素には、書籍のタイトルやURLが格納されている要素が含まれています。書籍は２０冊ありますので、２０個のh3要素が格納されています。<br />
&nbsp;<br />
またCSSセレクタの場合は、cssメソッドに変更し、CSSセレクタを渡します。ここではXPathで実行していきますので、このコードはコメントアウトします。CSSセレクタでも実行結果は同じになります。<br />
&nbsp;<br />
ここには最後尾に.get()や.getall()が付いていませんので、Selectorオブジェクトがリストに格納されたかたちで情報が取得されます。ここでは取得したいデータとは関係ありませんが、理解しやすいよう、この変数booksの中身を確認してみましょう。戻り値はyieldを使って辞書で記述し、出力します。<br />
&nbsp;<br />
<span class="rmarker-s">またscrapyのparseメソッドでは、yieldを使って値を返します。何か値をxpathで取得した後、その値をyieldを用いて辞書型で返すことで、その結果が画面やファイルに出力されます。</span><br />
&nbsp;<br />
returnでは、そこで処理が完全にストップしてしまいますが、yieldでは処理を一旦停止させるだけですので、値を返した後に処理は継続していきます。<br />
&nbsp;<br />
まずはこの変数booksの中身を確認するよう、ここで実行してみます。変更内容を保存するよう、ショートカットキーCtr + Sで保存します。</p>
<p>&nbsp;</p>
<h3>Spiderの実行方法</h3>
<p>spiderの実行はターミナルで行います。<br />
&nbsp;<br />
<span class="ymarker-s">spiderの実行にあたっては、scrapy.cfg(コンフィグ)ファイルと同じレベルのディレクトリにいる必要があります。</span>ここではprojects配下のbooks_toscrapeにディレクトリを移動します。<br />
&nbsp;<br />
そして、spiderの実行には、コマンドcrawlを使います。scrapy crawl books_basic　と入力し、エンターキーで実行します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/cebfe9caaee25f497a594ad0c169266b.png" alt="aaa" width="788" height="79" class="aligncenter size-full wp-image-5808" /></p>
<p>&nbsp;<br />
実行すると、このようにSelectorオブジェクトをリストで取得することができました。この変数booksの中には、Selectorオブジェクトのリストが格納されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/fbe53ed5d858ef9d022f35020d3784af.png" alt="aaa" width="700" height="279" class="aligncenter size-full wp-image-5814" /></p>
<p>&nbsp;<br />
<span class="rmarker-s">Selectorオブジェクトには、取得した要素の情報が格納されています。</span>これらは、 XPath または CSS セレクタで指定されたHTMLの特定の部分を「選択(select)」するため、セレクター(selector)と呼ばれています。</p>
<p>&nbsp;<br />
ここではh3要素から配下の要素の情報が１つのSelectorオブジェクトとして、リストで格納されます。書籍１つが１つのリストの要素として、要素数が２０のリストになっています。</p>
<p>&nbsp;<br />
dataには、省略して表示されていますが、h3要素とその配下の要素の情報が格納されています。この１つ１つのSelectorオブジェクトの中から、書籍のタイトルやURLを取得していきます。</p>
<p>&nbsp;</p>
<h3>parseメソッドのコード変更</h3>
<p>parseメソッドで、Selectorオブジェクトの中から、書籍のタイトルやURLを取得したコードは次のようになります。</p><pre class="crayon-plain-tag">def parse(self, response):
        books = response.xpath('//h3')
        # books = response.css('h3')

        for book in books:
            yield {
                'Title': book.xpath('.//a/@title').get(),
                'URL': book.xpath('.//a/@href').get()
                # 'Title': book.css('a::attr(title)').get(),
                # 'URL': book.css('a::attr(href)').get()
            }</pre><p>
<p>&nbsp;<br />
Selectorオブジェクトのリストが格納されている変数booksをfor文でループを回しながら１つ１つ取り出していきます。取り出したものは、単数形の変数bookに格納します。<span class="ymarker-s">つまり変数bookには１つのSelectorオブジェクトが格納されています。</span></p>
<p>ここからさらに書籍のタイトルやURLを取得し出力していきます。yieldで取得した情報を出力します。</p>
<p>&nbsp;</p>
<h4>タイトルの取得(XPath)</h4>
<div class="graybox">                &#8216;Title&#8217;: book.xpath(&#8216;.//a/@title&#8217;).get(),</div>
<p>書籍のタイトルは、キーTitleとして出力します。また書籍のタイトルは、h3要素の配下のa要素のtitle属性に格納されています。<br />
&nbsp;<br />
変数bookに格納されているSelectorオブジェクトには、h3要素とその配下の要素の情報が格納されていますので、その配下にある要素の中からa要素を指定していきます。<br />
&nbsp;<br />
Selectorオブジェクトに対して、XPathを記述する場合、最初に . (ドット)を付ける必要があります。<br />
&nbsp;<br />
<span class="rmarker-s">前はresponseに対してXPathを記述しましたので必要ありませんでしたが、Selectorオブジェクトに対して、XPathを記述する場合は、ドットが必要になりますので、ご注意ください。</span></p>
<p>&nbsp;</p>
<h4>タイトルの取得(CSSセレクタ)</h4>
<div class="graybox">                # &#8216;Title&#8217;: book.css(&#8216;a::attr(title)&#8217;).get(),</div>
<p><span class="ymarker-s">またCSSセレクタで記述する場合は、ドットやその他追加する必要はありません。</span>そのまま先ほど開発者ツールで確認したCSSセレクタを記述してください。::attr(title)は付ける必要があります。</p>
<p>以降はXPathで解説を進めていきますが、CSSセレクタでも同様に、cssメソッドに変更し、Chromeで確認したCSSセレクタを渡してください。</p>
<p>&nbsp;</p>
<h4>URLの取得</h4>
<div class="graybox">                &#8216;URL&#8217;: book.xpath(&#8216;.//a/@href&#8217;).get()</div>
<p>次にa要素のhref属性の値を取得し、出力します。</p>
<p>&nbsp;</p>
<h4>Spiderの実行とファイル出力</h4>
<p>そして、spiderを実行します。ショートカットキーCtr + Sで保存し、ターミナルを開きます。<br />
&nbsp;<br />
scrapy crawl books_basic　と入力し、今度はJSONファイルに出力します。<span class="rmarker-s">ファイル出力は、-o に続き、ファイル名を入力します。</span>ここではbook_fantasy.jsonとしておきます。エンターキーで実行します。</p>
<div class="graybox">scrapy crawl books_basic -o book_fantasy.json</div>
<p>&nbsp;<br />
出力されたJSONファイルを開けると、<br />
&nbsp;<br />
このようにBooks to Scrapeのサイトから取得したfantasyの書籍のタイトルとURLが表示されました。ここでは１ページ目の情報、２０冊分だけが表示されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/33f60bbd7357b309a6eafd882d1a1db1.png" alt="pythonでのクローラーの作成" width="742" height="233" class="aligncenter size-full wp-image-5821" /></p>
<p>&nbsp;</p>
<h2>Scrapyでのページ遷移（リンクのたどり方）</h2>
<p>ここまでで、サイトBooks to Scrapeの最初のページに表示されている書籍のタイトルとURLを取得することができました。ここではさらに、次のページ以降の情報も取得していきます。<br />
&nbsp;<br />
ページの下の方へ行くと、次のページへのリンクがあります。このnextをクリックすると、次のページへ遷移することができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/10/BooksToScrape4.png" alt="pythonでのクローラーの作成" width="928" height="461" class="aligncenter size-full wp-image-5748" /></p>
<p>&nbsp;</p>
<h3>リンクのURLの取得方法の検討</h3>
<p>まずはこの次のページのリンクのURLの取得方法を検討します。<br />
&nbsp;<br />
nextにカーソルを当てて右クリックし、メニューから検証を選択します。右側に該当箇所のHTMLコードが表示されます。このa要素のhref属性に格納されているようです。a要素だけで指定すると多くヒットし、このa要素だけに絞り込めませんので、絞り込みに使えそうな要素を探します。ここでは1つ上のclass属性の値にnextを持つli要素が絞り込みに使えそうです。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/308deabb28018326ac431daffdf178ff.png" alt="pythonでのクローラーの作成" width="770" height="208" class="aligncenter size-full wp-image-5829" /></p>
<p>&nbsp;<br />
Ctr + Fで検索欄を表示し、まずはXPathで取得方法を確認します。</p>
<div class="graybox">//li[@class=&#8221;next&#8221;]/a/@href</div>
<p>と入力すると、1件に絞り込むことができました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/26ac378113fd51b2e6f7bf419fd9db9c.png" alt="pythonでのクローラーの作成" width="655" height="171" class="aligncenter size-full wp-image-5831" /></p>
<p>&nbsp;<br />
また同じものはCSSセレクタでは、</p>
<div class="graybox">li.next a::attr(href)</div>
<p>と記述します。::attr(href)は、非標準の疑似要素になりますので、開発者ツールでは確認することができず、コーディングの際に追記します。</p>
<p>&nbsp;</p>
<h3>Spiderへの複数ページ遷移のコード追記</h3>
<p>先ほど開発者ツールで次ページへのURLの取得方法を確認しましたので、次に、これら確認した次のページへのURLを元に、spiderのコーディングにURLをたどるコードを追記していきます。<br />
&nbsp;<br />
parseメソッドに対して、リンクをたどるコードを追記したコードは、次のとおりです。</p><pre class="crayon-plain-tag">def parse(self, response):
        books = response.xpath('//h3')
        # books = response.css('h3')

        for book in books:
            yield {
                'Title': book.xpath('.//a/@title').get(),
                'URL': book.xpath('.//a/@href').get()
                # 'Title': book.css('a::attr(title)').get(),
                # 'URL': book.css('a::attr(href)').get()
            }

        next_page = response.xpath('//li[@class=&quot;next&quot;]/a/@href').get()
        # next_page = response.css('li.next a::attr(href)').get()
        if next_page:
            yield response.follow(url=next_page, callback=self.parse)</pre><p>
&nbsp;<br />
先ほどの書籍の情報を取得するfor文の後に、次のページへのリンクをたどるプログラムを追記しています。<br />
&nbsp;<br />
次のページへのリンクは、変数next_pageに格納します。response.xpathに続いて、引数に先ほど確認したXPathを渡します。CSSセレクタの場合は、このxpathメソッドをcssメソッドに変更し、Chromeで確認したCSSセレクタを渡します。</p>
<div class="graybox">        next_page = response.xpath(&#8216;//li[@class=&#8221;next&#8221;]/a/@href&#8217;).get()<br />
        # next_page = response.css(&#8216;li.next a::attr(href)&#8217;).get()</div>
<p>&nbsp;<br />
そして次へのボタンが存在し、リンクが取得できる場合のみ、次のページへ遷移します。<br />
&nbsp;<br />
従って、if文でnext_pageに値が格納されていることを確認します。<span class="rmarker-s">最後のページでは、次へのボタンが存在しませんので、変数next_pageはNullになり、処理を実行しません。</span>if文で実行する処理には、response.followを記述します。</p>
<div class="graybox">        if next_page:<br />
&nbsp;&nbsp;&nbsp;&nbsp;　yield response.follow(url=next_page, callback=self.parse)</div>
<p>引数には、urlとコールバックメソッドを指定します。URLは絶対URL／相対URLの両方に対応しています。<span class="rmarker-s">response.follow により、リンクで指定されたURLを元にサーバーに対してリクエストを送信し、レスポンスをコールバックメソッドで受け取ることができます。</span><br />
&nbsp;<br />
<span class="ymarker-s">コールバックメソッドには、このparseメソッドと同じ内容を実行しますので、self.parseを指定します。</span><br />
&nbsp;<br />
つまり、最初のページで書籍の情報、タイトルとURLを取得し、次のページへのリンクをたどって、また次のページで書籍の情報を取得し、そして次のページへ遷移するという一連の処理を、次のページが無くなる最後のページまで繰り返していきます。</p>
<p>&nbsp;<br />
それではspiderを実行してみましょう。ショートカットキーCtr + Sで保存し、ターミナルを開きます。<br />
&nbsp;<br />
scrapy crawl books_basic と入力し、ファイル出力は、-o に続き、ファイル名を入力します。ここではbook_fantasy.jsonとしておきます。エンターキーで実行します。</p>
<div class="graybox">scrapy crawl books_basic -o book_fantasy.json</div>
<p>&nbsp;<br />
出力されたJSONファイルを開けると、このようにBooks to Scrapeのサイトから取得したfantasyの書籍のタイトルとURLが表示されました。ここでは１ページ目の情報だけでなく、２ページ目以降の情報も含めて、カテゴリfantasyに含まれる４８冊分全ての情報が表示されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/ae1f00d308441bef6c96dbedb6dd392f.png" alt="aaa" width="744" height="287" class="aligncenter size-full wp-image-5836" /></p>
<p>&nbsp;<br />
この記事は以上になります。<br />
&nbsp;<br />
<span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！(Scrapy、Selenium編)」(Udemyへのリンク)</a></p>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-scrapy-for-begginer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>初心者でも簡単！VS CodeでPython開発環境の構築</title>
		<link>https://ai-inter1.com/python-vscode/</link>
					<comments>https://ai-inter1.com/python-vscode/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Tue, 02 Nov 2021 08:54:25 +0000</pubDate>
				<category><![CDATA[02. 環境構築]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=5879</guid>

					<description><![CDATA[VS Code(Visual Studio Code)とは、Microsoftが開発しているソースコードエディタです。効率的にプログラミングできるよう、様々な機能を提供しています。Python用の拡張 ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>VS Code(Visual Studio Code)とは、Microsoftが開発しているソースコードエディタです。効率的にプログラミングできるよう、様々な機能を提供しています。<span class="rmarker-s">Python用の拡張機能も用意されており、Pythonのコーディングを行うのに非常に有用です。</span><br />
&nbsp;<br />
この記事では、VS CodeでPythonの開発環境を構築する方法を解説していきます。</p>
<h2>Anacondaのインストール(Windows/Mac編)</h2>
<p><span class="ymarker-s">Anaconda（アナコンダ）とは、データサイエンスに特化したプラットフォームで、データサイエンスに適したライブラリや便利な機能を有しています。</span><br />
&nbsp;<br />
Anacondaの中には、PythonやRなどのデータサイエンスに良く利用される言語のライブラリも含まれています。スクレイピングでデータ取得後にデータを活用していく際にも、非常に便利になります。<br />
&nbsp;<br />
Anacondaは無料で利用することができ、簡単にインストールすることができます。<br />
&nbsp;<br />
本記事では、AnacondaをインストールすることでPythonを利用できる環境を整えていきます。Anacondaのインストールの詳細については、以下を参照ください。<br />
<a href="https://ai-inter1.com/python-install/" target="_blank" rel="noopener noreferrer">>> AnacondaでPython3をインストールする方法(Windows/Mac編)</a></p>
<p>&nbsp;</p>
<h2 id="VirtualEnv">Anacondaでの仮想環境の構築</h2>
<p>次にAnacondaで仮想環境を構築します。仮想環境の利点は、<span class="ymarker-s">それぞれの環境毎に、個別のライブラリをインストールすることができます。</span>例えば、ある環境では、Python3.6を使い、ある環境ではPython3.8を利用したり、またその他のPythonライブラリも異なるバージョンのものを利用することができます。<br />
&nbsp;<br />
基本的には、Pythonのライブラリは不意に頻繁に変更されます。このようなマイナーな変更でコードが動かなくなることがあります。これを避ける為、<span class="rmarker-s">目的に応じて専用の仮想環境を作成すると大変便利です。</span><br />
&nbsp;<br />
Anaconda Navigatorを起動すると、左手のタブにはEnvironmentというメニューがあり、これをクリックします。ここには作成した仮想環境が表示されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/47880cbc1057370c427f141ae6f4055d.png" alt="aaa" width="846" height="437" class="aligncenter size-full wp-image-5842" /><br />
まだ仮想環境を作成されていない場合は、上のbase(root)だけが表示されています。ここでは環境を選択すると、右側にインストールされているライブラリとそのバージョンが表示されています。<br />
&nbsp;<br />
上記の画面で「Create」ボタンを押すと、次のウィンドウが表示されます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/dab8e2f52709d8fa4910863c40db7653.png" alt="aaa" width="462" height="250" class="aligncenter size-full wp-image-5844" /><br />
Name欄には、仮想環境の名前を入力してください。またPackagesには、Pythonにチェックが付いていますので、このままPythonにチェックを付けて、目的に応じて必要なバージョンを選択してください。</p>
<p>&nbsp;<br />
そしてCreateボタンを押すと、環境が作成され、ここに表示されます。ここでは「scrapy_env」という名前の仮想環境を作成しました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/7a34ad50f77ec9892887d857a207ea24.png" alt="aaa" width="412" height="161" class="aligncenter size-full wp-image-5848" /></p>
<p>&nbsp;</p>
<h2>VS Codeのインストール</h2>
<p>この記事では、開発環境としてVS Code（Visual Studio Code）を使いコーディングを行います。以下のリンクからVS Codeのページに行き、「Download now」をクリックします。<br />
<a href="https://azure.microsoft.com/ja-jp/products/visual-studio-code/" target="_blank" rel="noopener noreferrer">>> Visual Studio Codeダウンロードページ</a><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode1.png" alt="aaa" width="539" height="280" class="aligncenter size-full wp-image-5839" /></p>
<p>&nbsp;<br />
ダウンロードページが表示されますので、WindowsやMacなど、使っている環境に合わせて、インストーラーをダウンロードします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode2.png" alt="aaa" width="628" height="283" class="aligncenter size-full wp-image-5888" /></p>
<p>&nbsp;<br />
ダウンロードが終わりましたら、インストーラーをダブルクリックします。次の画面が表示されますので、使用許諾書を確認の上、「同意する」を選択し「次へ」をクリックします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode3.png" alt="aaa" width="470" height="367" class="aligncenter size-full wp-image-5891" /></p>
<p>&nbsp;<br />
「Pathへの追加」にチェックを付け「次へ」をクリックします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode4.png" alt="aaa" width="472" height="368" class="aligncenter size-full wp-image-5892" /></p>
<p>&nbsp;<br />
「インストール」をクリックすると、インストールが始まります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode5.png" alt="aaa" width="473" height="370" class="aligncenter size-full wp-image-5893" /><br />
&nbsp;<br />
またmacOSでは、ダウンロード後に展開された「Visual Studio Code.app」ファイルをアプリケーションフォルダにドラッグ＆ドロップする必要があります。これにより、Launchpadから起動することができます。</p>
<p>&nbsp;</p>
<h2>VS CodeにPathを追加(Macのみ)</h2>
<p>macOSでターミナルからVS Codeを起動できるようにするには、次の作業が必要になります。<br />
&nbsp;<br />
VS Codeを起動しF1キーを押すと、コマンドパレットが表示されます。コマンドパレットに「shell command」と入力し、表示されたものの中から「Install &#8216;code&#8217; command in PATH」を選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/Path.png" alt="VS CodeでPythonのPathを追加" width="642" height="99" class="aligncenter size-full wp-image-5954" /><br />
&nbsp;<br />
追加したPathが有効になるよう、ターミナルを再起動します。そしてターミナルで次のコマンドを入力すると、VS Codeが立ち上がります。</p>
<div class="graybox">code .</div>
<p>&nbsp;</p>
<h2>VS CodeでのPython拡張機能のインストール</h2>
<p>次にPythonの拡張機能をインストールします。<span class="rmarker-s">Pythonの拡張機能では、Pythonのコードを整形したり、問題点を見つけたりと、様々な便利な機能を提供してくれます。</span>VS CodeでPythonのコードを記述する上で、欠かせないものとなります。</p>
<p>メニューからVS Codeを起動し、左側のメニューから「extensions」をクリックします。そして表示された検索欄に「Python」と入力し拡張機能を検索します。表示された中から、一番上の「Python」を選択します。「install」ボタンをクリックして、拡張機能をインストールします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode6.png" alt="VS CodeでPythonの拡張機能を追加" width="687" height="301" class="aligncenter size-full wp-image-5898" /></p>
<p>&nbsp;</p>
<h2 id="PythonPath">VS CodeでPythonのPathを通す(Macのみ)</h2>
<p>次にmacOSでは、Anacondaで作成した仮想環境へのPathを設定する必要があります。Windowsは自動的に設定されています。この設定をしないと、Python実行時に異なる仮想環境が選択されてしまう可能性があります。</p>
<p>最初に、ターミナルに次のコマンドを入力し、仮想環境のPathを確認します。</p>
<div class="graybox">$ conda info -e</div>
<p>&nbsp;<br />
ここでは「scrapy_env」という名前で仮想環境を作成しましたので、そのPath「/Users/&lt;name&gt;/opt/anaconda3/envs/scrapy_env」をコピーします。&lt;name&gt;には、ログインユーザー名が入ります。</p>
<div class="graybox"># conda environments:<br />
#<br />
base &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * &nbsp; /Users/&lt;name&gt;/opt/anaconda3<br />
scrapy_env &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /Users/&lt;name&gt;/opt/anaconda3/envs/scrapy_env</div>
<p>&nbsp;</p>
<p>次に、上のメニューから「code」⇒「preferences」⇒「Settings」を選択します。<br />
（Windowsで設定内容を確認したい場合は「File」⇒「preferences」⇒「Settings」になります。）<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/d82111172fd7eff1f8f16c3f10ff7bd6.png" alt="anaconda vscodeでpythonのpathの設定と確認方法(Mac) settings.jsonの開け方" width="754" height="178" class="aligncenter size-full wp-image-6570" /></p>
<p>&nbsp;<br />
そして表示された入力欄に「python.defaultInterpreterPath」と入力し、そして表示された「Python: Default Interpreter Path」の入力欄に先ほどコピーした仮想環境のPathを貼り付けます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/7b398e447a6f2efae42aee503e16dcbe.png" alt="anaconda vscodeでpythonのpathの設定と確認方法(Mac) settings.jsonでのインタープリタの選択方法" width="982" height="349" class="aligncenter size-full wp-image-6572" /></p>
<p>&nbsp;<br />
以上で、VS CodeでPythonの開発環境の準備が整いました。</p>
<p>&nbsp;</p>
<h2>VS Codeでの日本語拡張機能のインストール</h2>
<p>次にVS Codeのメニューを日本語化するのに必要な日本語拡張機能をインストールします。不要な場合は、インストールしなくても問題ございません。</p>
<p>こちらも左側のメニューから「extensions」をクリックします。そして表示された検索欄に「japanese」と入力し拡張機能を検索します。表示された中から、一番上の「Japanese Language Pack for Visual Studio Code」を選択します。「install」ボタンをクリックして、拡張機能をインストールします。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/VSCode7.png" alt="aaa" width="794" height="261" class="aligncenter size-full wp-image-5899" /></p>
<p>インストールが終わりましたら、VS Codeを再起動します。メニューの表示が日本語になります。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-vscode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>図解！Scrapyで利用できるコマンドを徹底解説！</title>
		<link>https://ai-inter1.com/python-scrapy-command/</link>
					<comments>https://ai-inter1.com/python-scrapy-command/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Fri, 27 Aug 2021 14:51:17 +0000</pubDate>
				<category><![CDATA[05. Scrapy]]></category>
		<category><![CDATA[Webスクレイピング]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=5418</guid>

					<description><![CDATA[この記事では、scrapyで利用できるプログラムの作成や検証、実行などを行う基本的なコマンドを説明いたします。この記事でscrapyの基本的なコマンドを確認し、次の記事からは実際にプログラムの作成に入 ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>この記事では、scrapyで利用できるプログラムの作成や検証、実行などを行う基本的なコマンドを説明いたします。この記事でscrapyの基本的なコマンドを確認し、次の記事からは実際にプログラムの作成に入っていきます。</p>
<p>&nbsp;<br />
<span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！(Scrapy、Selenium編)」(Udemyへのリンク)</a></p>
<h2>scrapyで利用できるコマンド</h2>
<h3>コマンド一覧の表示</h3>
<p>ターミナルを起動して、scrapy と入力しエンターを押すと、scrapyに関する情報が表示されます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/08/scrapy_command_06.png" alt="scrapyで利用できるコマンドの一覧" width="500" height="273" class="aligncenter size-full wp-image-5436" /><br />
バージョン：私の環境は2.4.1です。利用中のプロジェクトがあれば、アクティブなプロジェクトとしてここに表示されます。<br />
&nbsp;<br />
使い方としてコマンドの説明が書かれています。scrapy コマンド　と続いてオプション、引数を入力します。<br />
&nbsp;<br />
そして、scrapyで利用できるコマンドの一覧が表示されます。主なコマンドを紹介します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/11/e6285178ad701fa41e9682bfa35ee0ee.png" alt="scrapyで利用できるコマンドの一覧" width="811" height="446" class="aligncenter size-full wp-image-5823" /></p>
<h3>benchコマンド</h3>
<p>benchコマンドは、簡単なベンチマークテストを実行するのに利用します。</p>
<p>&nbsp;</p>
<h3>startprojectコマンド</h3>
<p>startprojectは、プロジェクトを作成するのに使います。<br />
&nbsp;<br />
scrapyはプロジェクトという単位で１つのまとまりを構成し、その中にspiderというWebサイトから情報をスクレイピングする為のクラスを作成していきます。<br />
&nbsp;<br />
<span class="rmarker-s">１つのプロジェクトの中には、複数のspiderを作ることができます。</span></p>
<p>&nbsp;</p>
<h3>genspiderコマンド</h3>
<p>genspiderは、新しいスパイダーを作成するのに利用します。spiderは、目的に応じて予め用意された、いくつかのテンプレートを元に作成します。</p>
<p>&nbsp;</p>
<h3>runspiderコマンド</h3>
<p>runspiderは、プロジェクトを作成せずに、スパイダーを実行するのに用いられます。<br />
&nbsp;<br />
通常はプロジェクトを作成しますので、めったに利用することはありません。何かを試したいなど、使い捨てのspiderを実行するのに利用します。</p>
<p>&nbsp;</p>
<h3>crawlコマンド</h3>
<p>一方で、作成したプロジェクト内にスパイダーを作成し、そのスパイダーを実行する場合は、crawlコマンドを使います。<br />
&nbsp;<br />
<span class="ymarker-s">従って、通常はプロジェクトを作成しますので、スパイダーの実行には、こちらのcrawlコマンドを使うことになります。</span></p>
<p>&nbsp;</p>
<h3>shellコマンド</h3>
<p>shellコマンドにより、対話型shellを起動します。shellでは、XPathやCSSセレクタでデータの取得などを試すことができます。これら試したXPathやCSSセレクタをspiderに反映していきます。<br />
&nbsp;<br />
XPathやCSSセレクタは、HTMLの多くのコードの中から必要なものを取得するのに利用する簡易言語です。<br />
&nbsp;<br />
XPathやCSSセレクタの詳しい説明は、以下を参照ください。<br />
<a href="https://ai-inter1.com/xpath/" target="_blank" rel="noopener noreferrer">>> XPathでスクレイピングする方法</a><br />
<a href="https://ai-inter1.com/beautifulsoup_1/#st-toc-h-26" target="_blank" rel="noopener noreferrer">>> CSSセレクタを用いたBeautifulSoupのselectメソッドの使い方</a></p>
<p>&nbsp;<br />
これらの簡易言語で、データが思い通りに取得できるかを、shellを用いて確認していき、問題無ければspiderに反映します。shellの詳しい説明は「<a href="https://ai-inter1.com/python-scrapy-shell/" target="_blank" rel="noopener noreferrer">Scrapy Shellの使い方</a>」を参照ください。</p>
<p>&nbsp;</p>
<h3>開発における基本的なコマンドの流れ</h3>
<p>後で実際に実行していきますが、基本的な流れとしては、startprojectコマンドでプロジェクトを作成し、genspiderでプロジェクト内にspiderを作成していきます。<br />
&nbsp;<br />
spiderのコーディングでは、必要に応じてshellでデータ取得方法を確認し、それをspiderに反映します。そしてコーディングが終わりましたら、crawlコマンドでspiderを実行する<br />
&nbsp;<br />
というのが一連の流れになります。これらのコマンドは、以降の記事でscrapyでコーディングを行う際に確認していきます。</p>
<p>&nbsp;</p>
<h2>scrapy benchコマンドの使い方</h2>
<p>ここでは最後に、scrapyのコーディングの際には出てこないbenchコマンドについて、実際に実行してみます。benchコマンドでは、ベンチマークテストをすることができます。</p>
<p>&nbsp;<br />
scrapy benchと入力し、エンターキーを押して実行すると、<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/08/scrapy_command_05.png" alt="scrapy benchコマンドの使い方" width="640" height="218" class="aligncenter size-full wp-image-5434" /><br />
Scrapyが処理を開始し、内部のページに対してクローリングを開始します。</p>
<p>&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/08/scrapy_command_04.png" alt="scrapy benchコマンドの使い方" width="629" height="344" class="aligncenter size-full wp-image-5429" /><br />
ここでは何ページまでクローリングできたかが表示されています。また横には1分間当たりの送信件数も表示されています。<br />
&nbsp;<br />
request_countでは、Requestを送信した件数と、response_countでは、Responseが返ってきた件数がわかります。これらの数値はマシンスペックに依存します。<br />
&nbsp;<br />
scrapyで使える基本的なコマンドは以上になります。<br />
&nbsp;<br />
次の記事では、これらのコマンドを実際に使い、プログラムの作成に入っていきます。<br />
<a href="https://ai-inter1.com/python-scrapy-for-begginer/#startproject" target="_blank" rel="noopener noreferrer">>> 図解！Python Scrapy入門(使い方・サンプルコード付きチュートリアル)</a></p>
<p>&nbsp;<br />
<span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！(Scrapy、Selenium編)」(Udemyへのリンク)</a></p>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-scrapy-command/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>図解！Scrapy Shellの使い方を徹底解説！</title>
		<link>https://ai-inter1.com/python-scrapy-shell/</link>
					<comments>https://ai-inter1.com/python-scrapy-shell/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Fri, 30 Jul 2021 08:48:41 +0000</pubDate>
				<category><![CDATA[05. Scrapy]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=5282</guid>

					<description><![CDATA[Scrapy Shellは、spiderを実行することなく、簡単にXPathやCSSセレクタなどのデータ抽出用コードの検証やデバッグができる対話型シェルです。responseやrequestの内容も確 ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>Scrapy Shellは、spiderを実行することなく、簡単にXPathやCSSセレクタなどのデータ抽出用コードの検証やデバッグができる対話型シェルです。responseやrequestの内容も確認することができます。</p>
<p>&nbsp;<br />
この記事では、Scrapy Shell を用いて、Chromeの開発者ツールで確認したXPathやCSSセレクタで、うまく目的の情報を取得できるか確認する方法を解説いたします。</p>
<p>&nbsp;<br />
取得方法に特に懸念点が無い場合、このプロセスを飛ばして、次のspiderへのコーディングに進んで頂いても問題御座いません。慣れてくるとspiderに直接まとめてコーディングして、エラーが出た場合は修正する、という方がやり易いかもしれません。</p>
<p><span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！(Scrapy、Selenium編)」(Udemyへのリンク)</a></p>
<p>&nbsp;</p>
<h2>確認対象のページ・項目とXPath、CSSセレクタ</h2>
<p>ここではScrapyの練習用サイト<a href="https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html" target="_blank" rel="noopener noreferrer">Book To Scrape</a>のサイトから、カテゴリFantasyの書籍に絞り込み、一覧のページから書籍のタイトルや詳細ページへのURLを取得していきます。</p>
<p>&nbsp;<br />
この記事ではshellの使い方の例として、Chromeで確認した以下のXPathやCSSセレクタで、書籍のタイトルが問題無く取得できることを確認していきます。</p>
<div class="graybox">XPath：　//h3/a/@title<br />
CSSセレクタ：　h3 a::attr(title)</div>
<p>&nbsp;<br />
Chromeでの確認方法の詳細については、以下を参照ください。<br />
<a href="https://ai-inter1.com/python-scrapy-for-begginer/#chrome" target="_blank" rel="noopener noreferrer">>> Chrome開発者ツールの使い方</a><br />
&nbsp;<br />
&nbsp;</p>
<h2>Scrapy Shellの起動方法</h2>
<p>まずは、scrapy shellに必要なipythonをインストールします。もし未だインストールされていないようでしたら、ターミナルより、</p>
<div class="graybox">conda install ipython</div>
<p> もしくは、</p>
<div class="graybox">pip install ipython</div>
<p>でインストールすることができます。</p>
<p>&nbsp;<br />
インストールが終わりましたら、shellを起動します。Shellはターミナルを開いて、次のコマンドで起動することができます。</p>
<div class="graybox">scrapy shell</div>
<div class="yellowbox">In [1]:　</div>
<p>shellが起動し、説明文の後に、In [1]:　と表示され、コマンドが入力できるようになりました。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>URLの指定とResponse/Requestヘッダの確認方法</h2>
<p>また合わせてURLを指定することで、</p>
<div class="graybox">scrapy shell URL</div>
<p>で指定したURLからデータを取得することができます。</p>
<p>&nbsp;<br />
もしくは、次のように後からfetchで指定したURLからデータを取得することもできます。</p>
<div class="graybox">fetch(&#8216;https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html&#8217;)</div>
<div class="yellowbox">INFO: Spider opened<br />
DEBUG: Crawled (200) &lt;GET https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html&gt; (referer: None)</div>
<p>GETは送信したrequestの種類を示します。ここでは、指定したBooks To ScrapeのサイトのURLにrequestを送信しています。</p>
<p>&nbsp;<br />
HTTPで定義されているリクエストのメソッドについては、次のようなものがあります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/07/scrapy_shell_12.png" alt="Scrapy Shellの使い方：Requestのメソッド" width="639" height="209" class="aligncenter size-full wp-image-5330" /><br />
ここでは、サーバから情報を取得したいので、GETを使っています。</p>
<p>&nbsp;<br />
またここに表示されているCrawled (200)の数字は、Scrapyが送信したrequestに対して、Webサイトから返ってくるレスポンスのステータスコードで、200は成功を表します。<br />
&nbsp;<br />
Webサイトから返ってくるレスポンスのステータスコードには、次のようなものがあります。<br />
<span class="rmarker-s">３桁のコードからなり、何番台かによって意味合いが異なってきます。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2021/07/scrapy_shell_03.png" alt="Scrapy Shellの使い方：Responseのstatus code" width="643" height="307" class="aligncenter size-full wp-image-5325" /><br />
400番台と500番台がエラーコードになります。<span class="ymarker-s">ここでは200となっていますので、こちらから送信したリクエストに対して、処理が成功したことを表しています。</span></p>
<p>&nbsp;<br />
URLやステータスコードは、shellで次のコマンドでも確認することができます。response.urlで、レスポンスが返ってきたURLを確認することができます。</p>
<div class="graybox">response.url</div>
<div class="yellowbox">&#8216;https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html&#8217;</div>
<p>&nbsp;<br />
またresponse.statusで、レスポンスのステータスコードを確認することができます。</p>
<div class="graybox">response.status</div>
<div class="yellowbox">200</div>
<p>&nbsp;<br />
またその他のレスポンスのヘッダーの情報は、response.headersで確認することができます。</p>
<div class="graybox">response.headers</div>
<div class="yellowbox">{b&#8217;Server&#8217;: b&#8217;nginx/1.17.7&#8242;,<br />
 b&#8217;Date&#8217;: b&#8217;Fri, 30 Jul 2021 07:36:47 GMT&#8217;,<br />
 b&#8217;Content-Type&#8217;: b&#8217;text/html&#8217;,<br />
 b&#8217;Vary&#8217;: b&#8217;Accept-Encoding&#8217;,<br />
 b&#8217;Last-Modified&#8217;: b&#8217;Thu, 25 Mar 2021 13:59:05 GMT&#8217;,<br />
 b&#8217;Strict-Transport-Security&#8217;: b&#8217;max-age=15724800; includeSubDomains&#8217;}</div>
<p>辞書で各キー毎に値が格納されています。</p>
<p>&nbsp;<br />
response.request.headersで、リクエストとして送信したヘッダーも確認することができます。</p>
<div class="graybox">response.request.headers</div>
<div class="yellowbox">{b&#8217;Accept&#8217;: b&#8217;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&#8242;,<br />
 b&#8217;Accept-Language&#8217;: b&#8217;en&#8217;,<br />
 b&#8217;User-Agent&#8217;: b&#8217;Scrapy/2.4.1 (+https://scrapy.org)&#8217;,<br />
 b&#8217;Accept-Encoding&#8217;: b&#8217;gzip, deflate, br&#8217;}</div>
<p>&nbsp;<br />
User-Agentなど、ヘッダーの辞書の１つの項目だけを取得するには、.getlistで辞書のキーを指定します。ここでは’User-Agent’を指定しています。</p>
<div class="graybox">response.request.headers.getlist(&#8216;User-Agent&#8217;)</div>
<div class="yellowbox">[b&#8217;Scrapy/2.4.1 (+https://scrapy.org)&#8217;]</div>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Scrapy ShellでのXPathやCSSセレクタの確認</h2>
<p>次にChromeブラウザ確認したXPathやCSSセレクタで、目的の情報が取得できることを確認します。</p>
<h3>XPathの確認</h3>
<p>取得した項目を格納する変数を定義します。ここでは、titleとします。そして、XPathで要素を指定するには、response.xpathと入力して、xpathメソッドを呼び出します。xpathメソッドの引数には、Chromeで確認したXPathを入力します。</p>
<div class="graybox">title = response.xpath(&#8216;//h3/a/@title&#8217;)</div>
<p><span class="rmarker-s">ここで注意点ですが、引数として渡すXPathは文字列として渡しますので、XPathの外側をシングルクォーテーション、もしくは、ダブルクォーテーションで囲う必要があります。</span></p>
<p>但し、XPathにダブルクォーテーションが使われている場合、外側にはシングルクォーテーションを使う必要があります。また同様に、XPathにシングルクォーテーションが使われている場合は、外側にはダブルクォーテーションを使う必要があります。<span class="rmarker-s">同じ種類のクォーテーションを使うことはできませんので、ご注意ください。</span></p>
<p>入力が終わりましたら、エンターキーで実行します。</p>
<p>&nbsp;<br />
次に変数titleに格納された値を確認します。 </p>
<div class="graybox">title</div>
<div class="yellowbox"> [&lt;Selector xpath=&#8217;//h3/a/@title&#8217; data=&#8217;Unicorn Tracks&#8217;&gt;,<br />
 &lt;Selector xpath=&#8217;//h3/a/@title&#8217; data=&#8217;Saga, Volume 6 (Saga (Collected Editi&#8230;&#8217;&gt;,<br />
&#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &nbsp;　途中省略　&nbsp; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230;<br />
 &lt;Selector xpath=&#8217;//h3/a/@title&#8217; data=&#8217;A Shard of Ice (The Black Symphony Sa&#8230;&#8217;&gt;,<br />
 &lt;Selector xpath=&#8217;//h3/a/@title&#8217; data=&#8221;King&#8217;s Folly (The Kinsman Chronicles #1)&#8221;&gt;]</div>
<p>Selectorオブジェクトというかたちで取得した内容が表示されました。これらSelectorオブジェクトがリストに格納されています。<span class="rmarker-s">Selectorオブジェクトには、取得した要素の情報が格納されています。</span>これらは、XPath または CSS セレクタで指定されたHTMLの特定の部分を「選択(select)」するため、セレクター(selector)と呼ばれています。<br />
&nbsp;<br />
xpathのプロパティには、先ほど入力したxpathが、また、dataプロパティには取得した要素が格納されています。ここでは書籍のタイトルが格納されています。</p>
<p>&nbsp;<br />
<span class="ymarker-s">これをSelectorオブジェクトではなく、テキストで取得するには、 .getall()を付けます。XPathで取得するデータが１つの場合は、.get()、複数の場合は.getall()でテキストだけを抽出することができます。</span></p>
<div class="graybox">title = response.xpath(&#8216;//h3/a/@title&#8217;).getall()</div>
<p>&nbsp;<br />
titleを確認すると、</p>
<div class="graybox">title</div>
<div class="yellowbox">[&#8216;Unicorn Tracks&#8217;,<br />
 &#8216;Saga, Volume 6 (Saga (Collected Editions) #6)&#8217;,<br />
&#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &nbsp;　途中省略　&nbsp;&#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230;<br />
 &#8216;A Shard of Ice (The Black Symphony Saga #1)&#8217;,<br />
 &#8220;King&#8217;s Folly (The Kinsman Chronicles #1)&#8221;]</div>
<p>このようにして、Webサイトより書籍のタイトルの文字を取得できることが確認できました。 </p>
<p>&nbsp;</p>
<h3>CSSセレクタの確認</h3>
<p>次に同様のことを、CSSセレクタを使って行います。</p>
<p>変数titleを定義し、CSSセレクタを使う場合、response.cssと記述し、引数にCSSセレクタを渡します。</p>
<div class="graybox">title = response.css(&#8216; h3 a::attr(title)&#8217;)</div>
<p>&nbsp;<br />
そして変数の中身を確認します。</p>
<div class="graybox">title</div>
<div class="yellowbox">[&lt;Selector xpath=&#8217;descendant-or-self::h3/descendant-or-self::*/a/@title&#8217; data=&#8217;Unicorn Tracks&#8217;&gt;,<br />
 &lt;Selector xpath=&#8217;descendant-or-self::h3/descendant-or-self::*/a/@title&#8217; data=&#8217;Saga, Volume 6 (Saga (Collected Editi&#8230;&#8217;&gt;,<br />
&#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &nbsp;　途中省略　&nbsp; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230;<br />
 &lt;Selector xpath=&#8217;descendant-or-self::h3/descendant-or-self::*/a/@title&#8217; data=&#8217;A Shard of Ice (The Black Symphony Sa&#8230;&#8217;&gt;,<br />
 &lt;Selector xpath=&#8217;descendant-or-self::h3/descendant-or-self::*/a/@title&#8217; data=&#8221;King&#8217;s Folly (The Kinsman Chronicles #1)&#8221;&gt;]</div>
<p>このように実行した結果、CSSを入力しても、Scrapyの内部的にはXPathに変換されて実行されます。</p>
<p>&nbsp;<br />
後はXPathの時と同様に、.getall()でテキストだけを抽出します。</p>
<div class="graybox">title = response.css(&#8216; h3 a::attr(title)&#8217;).getall()</div>
<div class="graybox">title</div>
<div class="yellowbox">[&#8216;Unicorn Tracks&#8217;,<br />
 &#8216;Saga, Volume 6 (Saga (Collected Editions) #6)&#8217;,<br />
&#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &nbsp;　途中省略　&nbsp;&#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230; &#8230;<br />
 &#8216;A Shard of Ice (The Black Symphony Saga #1)&#8217;,<br />
 &#8220;King&#8217;s Folly (The Kinsman Chronicles #1)&#8221;]</div>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Scrapy Shellの終了方法</h2>
<p>最後に、shellから抜けるコマンドは、exit() になります。</p>
<p>&nbsp;<br />
このようにして、Shellを使って、Chrome開発者ツールで確認したXpathやCSSセレクタで、Webサイトから目的の情報をうまく取得できることが確認できました。ここでは１つの項目だけを確認しましたが、必要に応じて他の項目も確認します。</p>
<p>&nbsp;<br />
最初に申し上げましたように、取得方法に特に懸念点が無い場合、このshellで確認するというプロセスを飛ばして次のspiderへのコーディングに進んで頂いても問題御座いません。慣れてくるとspiderに直接まとめてコーディングして、エラーが出た場合は修正する、という方がやり易いかもしれません。</p>
<p>&nbsp;<br />
この記事は以上になります。<br />
&nbsp;<br />
Scrapyの使い方全般について解説した記事は以下になります。<br />
<a href="https://ai-inter1.com/python-scrapy-for-begginer/" target="_blank" rel="noopener noreferrer">>> 図解！Python Scrapy入門(使い方・サンプルコード付きチュートリアル)</a><br />
&nbsp;<br />
<span class="rmarker-s">Scrapyについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！(Scrapy、Selenium編)」(Udemyへのリンク)</a></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-scrapy-shell/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python 正規表現のmatch関数・オブジェクトの使い方(search関数との違い、if文での判定方法など)</title>
		<link>https://ai-inter1.com/python-regex-match/</link>
					<comments>https://ai-inter1.com/python-regex-match/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Sat, 18 Jul 2020 06:29:16 +0000</pubDate>
				<category><![CDATA[19. 正規表現]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=4990</guid>

					<description><![CDATA[Pythonの正規表現のmatch関数やその戻り値であるmatchオブジェクトを初心者向けに徹底的に解説した記事です。 &#160; match関数やmatchオブジェクトの基本的な使い方、searc ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>Pythonの正規表現のmatch関数やその戻り値であるmatchオブジェクトを初心者向けに徹底的に解説した記事です。</p>
<p>&nbsp;<br />
<span class="rmarker-s">match関数やmatchオブジェクトの基本的な使い方、search関数との違い、if文での判定方法などの押さえておくべきことを、初心者でも理解しやすいように丁寧に解説していきたいと思います。</span></p>
<p>&nbsp;<br />
「match関数」や「matchオブジェクト」以外の、正規表現全般に関する詳しい説明は以下を参照ください。<br />
<a href="https://ai-inter1.com/python-regex/#finditer" target="_blank" rel="noopener noreferrer">>> 図解！Python 正規表現の徹底解説！(文字列の抽出と置換など)</a></p>
<h2>match関数の記述方法</h2>
<p>match関数は、先頭の文字列からパターンに一致するものを検索する際に利用し、次のように記述します。</p>
<div class="graybox">re.match(正規表現のパターン, 検索対象の文字列)</div>
<p>一致するものがあった場合、matchオブジェクトを返します。また一致するものが無かった場合、Noneが返ってきます。<br />
&nbsp;<br />
<span class="rmarker-s">注意点としては、あくまでも先頭の文字列から検索しますので、文字列の途中に一致するものがあっても、一致したとはみなされません。</span></p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>戻り値 matchオブジェクト（groupなど）</h2>
<p>match関数の実行結果は、パターンに一致するものがあればmatchオブジェクトというもので返ってきます。</p>
<p>&nbsp;<br />
matchオブジェクトのメソッドには、次のようなものがあります。</p>
<table>
<tbody>
<tr bgcolor="#7fffd4">
<td align="center" width="60">メソッド</td>
<td align="center" width="240">説明</td>
</tr>
<tr>
<td width="60">group()</td>
<td width="240">マッチした文字列を取得する。</td>
</tr>
<tr>
<td width="60">span()</td>
<td width="240">マッチした文字列の開始、終了位置を取得する。</td>
</tr>
<tr>
<td width="60">start()</td>
<td width="240">マッチした文字列の開始位置を取得する。</td>
</tr>
<tr>
<td width="60">end()</td>
<td width="240">マッチした文字列の終了位置を取得する。</td>
</tr>
</tbody>
</table>
<p>※開始位置は、1文字目は0から始まります。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>match関数の使用例</h2>
<p>まず簡単な正規表現を使って、match関数の例をいくつか確認していきましょう。</p>
<p>&nbsp;<br />
正規表現では、.（ドット）は任意の１文字を示します。ここでは、正規表現のパターンとして”x.y”（xとyの間に任意の１文字がある）が、ある文字列の先頭に含まれているかチェックしてみましょう。</p>
<p>&nbsp;<br />
match関数に対して、正規表現のパターン”x.y”と、文字列”xyz”を引数として渡し、返ってきたmatchオブジェクトの内容をprintで表示します。</p><pre class="crayon-plain-tag">import re
res = re.match(&quot;x.z&quot;,&quot;xyz&quot;)
print(res)</pre><p>
<div class="yellowbox"><_sre.SRE_Match object; span=(0, 3), match='xyz'></div>
<p>一致した結果として、matchオブジェクトの内容が表示されました。spanでは一致した文字列の範囲（開始位置、終了位置）が、matchには一致した文字列が表示されています。</p>
<p>&nbsp;<br />
今度はmatchオブジェクトのgroupメソッドを利用して、一致した文字列を返します。</p><pre class="crayon-plain-tag">print(res.group())</pre><p>
<div class="yellowbox">xyz</div>
<p>一致した文字列&#8221;xyz&#8221;が表示されました。</p>
<p>&nbsp;<br />
&nbsp;<br />
次に、検索対象の文字列として&#8221;vwxyz&#8221;を渡してみましょう。</p><pre class="crayon-plain-tag">res = re.match(&quot;x.z&quot;,&quot;vwxyz&quot;)
print(res)</pre><p>
<div class="yellowbox">None</div>
<p>結果は一致せず、Noneが表示されました。</p>
<p>&nbsp;<br />
<span class="ymarker-s">このようにmatch関数は、あくまでも先頭の文字列から検索しますので、文字列の途中に一致するものがあっても、一致したとはみなされません。</span></p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>matchオブジェクトのifによるTrue/Falseの判定</h2>
<p>またmatchオブジェクトはif文でTrue/Falseの判定にも使うことができます。</p>
<p>&nbsp;<br />
パターンに一致した場合、matchオブジェクトが返ってきますので、その場合はTrueと判定されます。一方で、パターンに一致せずmatchオブジェクトが返ってこなかった場合はFalseと判定されます。</p>
<p>&nbsp;<br />
match関数に対して、正規表現のパターン”x.y”と、文字列”xyz”を引数として渡します。そして戻り値に対してif文でTrueの場合は&#8221;マッチしました。&#8221;と表示し、Falseの場合は&#8221;マッチしませんでした。&#8221;と表示します。</p><pre class="crayon-plain-tag">res = re.match(&quot;x.z&quot;,&quot;xyz&quot;)
if res:
    print(&quot;マッチしました。&quot;)
else:
    print(&quot;マッチしませんでした。&quot;)</pre><p>
<div class="yellowbox">マッチしました。</div>
<p>ここではパターンに一致しますので、matchオブジェクトが返って来ます。そしてif文でtrueと判定され、&#8221;マッチしました。&#8221;と表示されました。</p>
<p>&nbsp;<br />
次に文字列”axyz”を引数として渡してみます。</p><pre class="crayon-plain-tag">res = re.match(&quot;x.z&quot;,&quot;axyz&quot;)
if res:
    print(&quot;マッチしました。&quot;)
else:
    print(&quot;マッチしませんでした。&quot;)</pre><p>
<div class="yellowbox">マッチしませんでした。</div>
<p>この場合はパターンに一致しませんので、matchオブジェクトが返って来ずif文でFalseと判定され、&#8221;マッチしませんでした。&#8221;と表示されました。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>match関数とsearch関数の違い</h2>
<p>search関数は、先頭に限らずパターンに一致するものがあるかを検索します。但し、一致したものが複数あっても、１つ目だけを返します。</p>
<div class="graybox">re.search(正規表現のパターン, 検索対象の文字列)</div>
<p>search関数もmatch関数と同様に、一致するものがあった場合matchオブジェクトを返します。また一致するものが無かった場合、Noneが返ってきます。</p>
<p>&nbsp;<br />
&nbsp;<br />
まずいくつかの例を確認していきましょう。</p>
<p>&nbsp;<br />
search関数に対して、正規表現のパターン”x.y” （xとyの間に任意の１文字がある）と、文字列”vwxyz”を引数として渡し、返ってきたmatchオブジェクトの内容をprintで表示します。</p><pre class="crayon-plain-tag">res = re.search(&quot;x.z&quot;, &quot;vwxyz&quot;)
print(res)</pre><p>
<div class="yellowbox"><_sre.SRE_Match object; span=(2, 5), match='xyz'></div>
<p><span class="rmarker-s">search関数では文字列の途中でも一致するものがあれば一致したとみなされます。</span>一致した結果として、matchオブジェクトの内容が表示されました。</p>
<p>&nbsp;<br />
今度は、文字列&#8221;vwxyz vwxyz&#8221;を渡してみましょう。一致する箇所が２つ含まれているようです。</p><pre class="crayon-plain-tag">res = re.search(&quot;x.z&quot;, &quot;vwxyz vwxyz&quot;)
print(res)</pre><p>
<div class="yellowbox"><_sre.SRE_Match object; span=(2, 5), match='xyz'></div>
<p>一致した結果としてmatchオブジェクトが返ってきました。但し、一致した箇所としてspanには(2,5)と表示されています。</p>
<p>&nbsp;<br />
<span class="ymarker-s">つまり、search関数では、２つ一致するものがあっても、返ってくるのは最初のものだけになります。</span>複数取得する場合、次のfinditer関数を使うことになります。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>複数のmatchオブジェクトの取得</h2>
<p>match関数やsearch関数は１つしかmatchオブジェクトを返しません。複数のmatchオブジェクトを取得したい場合、finditer関数を使います。<br />
&nbsp;<br />
finditer関数は、パターンに一致するものを全てmatchオブジェクトで取得することができます。</p>
<p>&nbsp;<br />
finditer関数の詳しい説明は「<a href="https://ai-inter1.com/python-regex/#finditer" target="_blank" rel="noopener noreferrer">図解！Python 正規表現の徹底解説！(文字列の抽出と置換など)</a>」を参照ください。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>正規表現のパターンをコンパイルする方法</h2>
<p><span class="rmarker-s">正規表現ではパターンをコンパイルすることによって、同じパターンを効率的に繰り返し利用することができます。</span></p>
<p>&nbsp;<br />
コンパイルにはcompile()を使い、以下のように記述します。</p>
<div class="graybox">pattern = re.compile(正規表現のパターン)<br />
res = pattern.match(検索対象の文字列)</div>
<p>パターンをコンパイルした結果を、変数patternに格納しています。そして、変数patternを元に、match()で検索対象の文字列に対して、パターンに一致するか否かを判定しています。<span class="ymarker-s">ここでは関数にmatch()を使いましたが、別の関数でも同様です。</span></p>
<p>&nbsp;<br />
一度パターンをコンパイルすることで、次のコードの検索対象の文字列や関数を変更しながら、同じパターンを使いまわすことができます。</p>
<div class="graybox">res = pattern.match(検索対象の文字列)</div>
<p>&nbsp;<br />
&nbsp;<br />
compile()に対して、正規表現のパターン”xy+”を引数として渡し、返ってきた値を変数patternに格納します。 変数patternを元に、match()に対して、文字列”xyyyyyy”を引数として渡し、返ってきたmatchオブジェクトの内容をprintで表示します。</p><pre class="crayon-plain-tag">pattern = re.compile(&quot;xy+&quot;)
res = pattern.match(&quot;xyyyyyy&quot;)
print(res)</pre><p>
<div class="yellowbox"><_sre.SRE_Match object; span=(0, 7), match='xyyyyyy'> </div>
<p>&nbsp;<br />
次回、同じパターンで別の文字列を検索する場合、次のように記述します。</p><pre class="crayon-plain-tag">res = pattern.search(&quot;abcxyyx&quot;)
print(res)</pre><p>
<div class="yellowbox"><_sre.SRE_Match object; span=(3, 6), match='xyy'></div>
<p>ここでは、一度コンパイルした結果を格納した変数pattはそのまま利用しています。そして検索対象の文字列や関数を変更して、同じパターンで検索しています。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>特殊文字をエスケープする記号(\)</h2>
<p>&#8220;*&#8221;や&#8221;?&#8221;のような特殊な文字を検索する場合、\(バックスラッシュ)を付ける必要があります。</p>
<p>&nbsp;<br />
例として、&#8221;?&#8221;を検索してみましょう。<br />
match関数に対して、正規表現のパターン&#8221;\?&#8221;と、文字列&#8221;?xy&#8221;を引数として渡し、返ってきたmatchオブジェクトの内容をprintで表示します。</p><pre class="crayon-plain-tag">res = re.match(&quot;\?&quot;, &quot;?xy&quot;)
print(res)</pre><p>
<div class="yellowbox"><_sre.SRE_Match object; span=(0, 1), match='?'></div>
<p>&#8220;\?&#8221;はバックスラッシュが付いており、&#8221;?&#8221;と見なされマッチしました。</p>
<p>&nbsp;<br />
一方で正規表現のパターンから\(バックスラッシュ)を除くと</p><pre class="crayon-plain-tag">res = re.match(&quot;?&quot;, &quot;?xy&quot;)
print(res)</pre><p>
<div class="yellowbox"> … … …　<br />
error: nothing to repeat at position 0</div>
<p>&#8220;?&#8221;と見なされずエラーが表示されました。</p>
<p>&nbsp;<br />
&nbsp; </p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-regex-match/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>図解！XPathでスクレイピングを極めろ！(Python、containsでの属性・テキストの取得など)</title>
		<link>https://ai-inter1.com/xpath/</link>
					<comments>https://ai-inter1.com/xpath/#comments</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Sun, 16 Feb 2020 13:14:10 +0000</pubDate>
				<category><![CDATA[Webスクレイピング]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=4242</guid>

					<description><![CDATA[スクレイピングにおけるXPathの使い方を初心者向けに解説した記事です。 &#160; XPathとは、基本的な書き方、id・classなど様々な属性やテキストの取得方法、contains関数の使い方 ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p>スクレイピングにおけるXPathの使い方を初心者向けに解説した記事です。<br />
&nbsp;<br />
XPathとは、基本的な書き方、id・classなど様々な属性やテキストの取得方法、contains関数の使い方など要点を全て解説しています。</p>
<h2>XPathとは</h2>
<p>XPathとは、XML形式の文書から<span class="rmarker-s">特定の部分を指定して取得するための簡易言語です。</span>HTMLにも使うことができます。</p>
<p>&nbsp;<br />
XPathはスクレイピングにおいて、HTMLの中から特定の情報を指定し取得するのに利用されます。</p>
<p>&nbsp;<br />
HTMLは次のようにタグと言う記号で構成されており、開始タグ、終了タグで囲まれたものを要素といいます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath01-e1581989520116.png" alt="XPathとは、XML形式の文書から特定の部分を指定して取得するための簡易言語です。" width="400" height="207" class="aligncenter size-full wp-image-4390" /></p>
<p>&nbsp;<br />
上記の要素はtitleタグに囲まれていますので、titile要素と言います。</p>
<p>&nbsp;<br />
またHTMLは、１つのタグが別のタグで囲われ、というように入れ子の状態で記述されます。これらは階層構造とみなすことができます。<br />
&nbsp;<br />
例えば次のHTMLについては、<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath02.png" alt="XPathとは、XML形式の文書から特定の部分を指定して取得するための簡易言語です。" width="346" height="415" class="aligncenter size-full wp-image-4391" /></p>
<p>&nbsp;<br />
このような階層構造で表すことができます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath03.png" alt="「XPathとは」の解説" width="510" height="240" class="aligncenter size-full wp-image-4396" /></p>
<p>&nbsp;<br />
またHTMLのタグの中には、いくつかの属性が含まれることがあります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath04-e1581835411918.png" alt="「XPathとは」の解説" width="480" height="123" class="aligncenter size-full wp-image-4400" /></p>
<p>&nbsp;<br />
これらは属性と属性値からなり、上記のclass属性の属性値は&#8221;book&#8221;になります。またその横のid=&#8221;link1&#8243;も属性と属性値です。</p>
<p>&nbsp;<br />
属性にはid属性のように、HTMLの中で必ず重複しない属性値を持つものと、そうでないものとがあります。</p>
<p>&nbsp;<br />
これらの属性も組合せながら、XPathでは要素を指定します。<br />
&nbsp;<br />
<span class="rmarker-s">XPathを利用したPythonでのスクレイピングについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-scrapy-link" target="_blank" rel="noopener noreferrer">>> 「PythonでWebスクレイピング・クローリングを極めよう！(Scrapy、Selenium編)(Udemyへのリンク)</a></p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>XPathの基本的な書き方</h2>
<p>ここではまずXPathの基本的な書き方を説明していきます。</p>
<p>&nbsp;<br />
この基本的な書き方を理解した上で、後から説明する属性の指定方法や階層の前後をたどって要素を指定する方法などの応用的なトピックに進んでいってください。</p>
<p>&nbsp;<br />
XPathにおいて、各要素はノードテストと呼ばれます。また各ノードテストを”/”（スラッシュ）で区切り、指定したい要素までの道のりを示したものをロケーションパスと言います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath05-e1581836009128.png" alt="XPathの書き方" width="500" height="125" class="aligncenter size-full wp-image-4404" /></p>
<p>&nbsp;</p>
<h3>ロケーションパスの書き方</h3>
<p>HTMLのルート(html要素)からXPathを書く場合は、/ スラッシュを使って記述します。</p>
<p>&nbsp;<br />
例えば、html – head – titleとたどってtitle要素を指定する場合、<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath06-e1581836570291.png" alt="XPathの書き方" width="500" height="69" class="aligncenter size-full wp-image-4409" /></p>
<p>次のように書きます。</p><pre class="crayon-plain-tag">/html/head/title</pre><p>
<div class="yellowbox">&lt;title&gt; 清水義孝の著書 &lt;/title&gt;</div>
<p>&nbsp;</p>
<h3>テキストノードの表示: text()</h3>
<p>要素に含まれるテキスト（テキストノードと呼びます）を表示したい場合はtext()を使います。ここではtitleのテキストを表示しています。</p><pre class="crayon-plain-tag">/html/head/title/text()</pre><p>
<div class="yellowbox">清水義孝の著書</div>
<p>&nbsp;</p>
<h3>ノードパスを省略: //（ダブルスラッシュ）</h3>
<p>パスを短縮して記述する場合は、//（ダブルスラッシュ）で途中のパスを省略して記述することができます。</p>
<p>&nbsp;<br />
ここでは、/html/head/ を省略してtitleから記述をしています。</p><pre class="crayon-plain-tag">//title/text()</pre><p>
<div class="yellowbox">清水義孝の著書</div>
<p>ここでは、例のHTMLにtitle１つしか含まれませんでしたので、表示された結果は、/html/head/title/text()と同じです。</p>
<p>&nbsp;<br />
但し、HTMLの中にtitle要素がいくつか存在する場合に省略して記述すると、該当する要素が複数になります。その場合は複数の要素が表示されます。</p>
<p>&nbsp;<br />
1つに絞り込みたい場合、１つに絞り込める親の要素までを短縮して指定してそこから子要素を指定するか、属性と合わせて指定するなどが必要になります。</p>
<p>&nbsp;<br />
以降の章では、これらの基本的な書き方を元に、様々な属性の指定の方法や、HTMLの階層構造をたどって要素を指定する方法などの応用的なトピックに進んでいきます。</p>
<p>&nbsp;<br />
これらの応用的なトピックを理解するにあたっては、実際にXPathを入力し、実行結果を確認しながら進めていくことが重要です。</p>
<p>&nbsp;<br />
XPathの実行を試すことができるサイトをご紹介します。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>XPathを試せる検証・テストツール(XPath Tester)</h2>
<h3>XPath Playground</h3>
<p><a href="https://scrapinghub.github.io/xpath-playground/" target="_blank" rel="noopener noreferrer">XPath Playground</a>のサイトでは、実際にXPathを記述し、実行結果を確認することができます。</p>
<p>&nbsp;<br />
XPathの練習にお勧めのサイトです。この記事を確認しながら、ブラウザでサイトも開けて、ぜひ実行結果を確認しながら読み進めていってください。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath07-e1581837053703.png" alt="XPathを試せる検証・テストツールを提供するサイト(XPath Tester)" width="600" height="426" class="aligncenter size-full wp-image-4412" /></p>
<p>&nbsp;<br />
XPath Playgroundの画面にいくと、３つの入力欄があります。</p>
<ul style="list-style-type: decimal;">
<li>HTMLの入力欄では、XPathの検証に利用するHTMLを入力します。ここに入力されたHTMLを元に、XPathを実行し結果を表示します。</li>
<li>XPathの入力欄では、実行を試したいXPathを入力してください。ここの入力内容を随時変更し、正しい結果が取得できているかを確認しながら進めていくことになります。</li>
<li>結果表示欄には、XPathにより取得された要素が表示されます。</li>
</ul>
<p>&nbsp;<br />
&nbsp;</p>
<h3>サンプルHTMLコード</h3>
<p>この記事で利用したHTMLを記載しておきます。XPath PlaygroundでHTML入力欄に張り付けてください。</p>
<pre class="crayon-plain-tag">&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;清水義孝の著書&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;p class=&quot;title&quot;&gt;
            &lt;b&gt;清水義孝の最新の著書には、次の本があります。&lt;/b&gt;
        &lt;/p&gt;
        &lt;p class=&quot;recent books&quot;&gt;
            &lt;a class=&quot;book&quot; href=&quot;https://www.amazon.co.jp/dp/B07TN4D3HG&quot; id=&quot;link1&quot;&gt;
                Python3によるビジネスに役立つデータ分析入門
            &lt;/a&gt;
            &lt;a class=&quot;book&quot; href=&quot;http://www.amazon.co.jp/dp/B07SRLRS4M&quot; id=&quot;link2&quot;&gt;
                よくわかるPython3入門2.NumPy・Matplotlib編
            &lt;/a&gt;
            &lt;a class=&quot;book&quot; href=&quot;http://www.amazon.co.jp/dp/B07T9SZ96B&quot; id=&quot;link3&quot;&gt;
                よくわかるPython3入門4.Pandasでデータ分析編
            &lt;/a&gt;
        &lt;/p&gt;
        &lt;p class=&quot;end&quot;&gt;
            &lt;b&gt;そして、これらの本は好評発売中です。&lt;/b&gt;
        &lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>&nbsp;<br />
上記のHTMLは、実際にブラウザで表示すると次のようになります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath08-e1581837564781.png" alt="XPathを試せる検証・テストツールを提供するサイト(XPath Tester)" width="500" height="259" class="aligncenter size-full wp-image-4417" /></p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>XPathの述語による属性の取得方法</h2>
<h3>属性の取得: [](スクエアブラケット)と @(アットマーク)</h3>
<p>属性は[]と@で指定し、条件に一致した要素を取得ます。</p>
<div class="graybox">要素[@属性 = 属性値]</div>
<p>&nbsp;<br />
このように取得する要素を、属性などの条件でさらに絞り込むものを述語と呼びます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath09-e1581837812847.png" alt="XPathでの属性の取得方法" width="500" height="92" class="aligncenter size-full wp-image-4419" /> </p>
<p>&nbsp;<br />
ロケーションパス上の任意のノードテストの直後に付けることができます。</p>
<p>&nbsp;<br />
属性idが”link1”を持つa要素を指定してみます。</p><pre class="crayon-plain-tag">//a[@id=&quot;link1&quot;]</pre><p>
<div class="yellowbox">
&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;</div>
<p>&nbsp;<br />
先ほどの例のケースでは、属性を指定しなければ、該当するものが複数存在します。属性を指定することにより、１つに絞り込まれたことがわかります。</p><pre class="crayon-plain-tag">//a</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;</div>
<p>&nbsp; </p>
<h3>任意の属性を取得（ワイルドカード）：＊(アスタリスク)</h3>
<p>特定の属性ではなく任意の属性を指定する場合、アスタリスクを使って指定します。</p><pre class="crayon-plain-tag">//a[@*=&quot;link1&quot;]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;</div>
<p>&nbsp; </p>
<h3>属性値を表示: @(アットマーク)</h3>
<p>属性値を表示したい場合は@(アットマーク)を使います。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/a/@href</pre><p>
<div class="yellowbox"><font color="yellow">.</font>https://www.amazon.co.jp/dp/B07TN4D3HG<br />
<font color="yellow">.</font>http://www.amazon.co.jp/dp/B07SRLRS4M<br />
<font color="yellow">.</font>http://www.amazon.co.jp/dp/B07T9SZ96B</div>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 論理演算子: and（かつ）、or（または）、not（～以外）</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
XPathでは論理演算子も利用することができます。</p>
<p>&nbsp;  </p>
<h3>複数属性の条件指定: and（かつ）</h3>
<p>and（かつ）を使って、class属性に”book”を含み、かつ、href属性に” B07SRLRS4M”を含むa要素を取得してみます。<br />
&nbsp;<br />
属性値にある特定の値が含まれているかを確認するには、contains()を使います。</p>
<div class="graybox">contains(属性, 属性値)</div>
<p>&nbsp;<br />
これらのandとcontains()を組み合わせて、次のように記述します。</p><pre class="crayon-plain-tag">//a[contains(@class,&quot;book&quot;) and contains(@href,&quot;B07SRLRS4M&quot;)]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;</div>
<p>&nbsp;  </p>
<h3>複数属性の条件指定: or （または）</h3>
<p>or （または）でclass属性に”book”を含む、または、href属性に” B07SRLRS4M”を含むa要素のテキストを取得しています。</p><pre class="crayon-plain-tag">//a[contains(@class,&quot;book&quot;) or contains(@href,&quot;B07SRLRS4M&quot;)]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;</div>
<p>&nbsp;  </p>
<h3>特定の属性を含まない要素の指定: not （～以外）</h3>
<p>not （～以外）でhref属性に” B07SRLRS4M”を含まないa要素のテキストを取得しています。</p><pre class="crayon-plain-tag">//a[not(contains(@href,&quot;B07SRLRS4M&quot;))]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;</div>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 属性値やテキストに含まれる文字列の検索方法</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
属性値やテキストに含まれる文字列を検索する方法はいくつかあります。</p>
<p>&nbsp; </p>
<h3>属性値に含まれる文字列を前方一致で検索: starts-with</h3>
<p>前方一致でhref属性にhttp://www.amazon.co.jp/を含むa要素を取得しています。</p><pre class="crayon-plain-tag">//a[starts-with(@href,&quot;http://www.amazon.co.jp/&quot;)]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;</div>
<p>&nbsp; </p>
<h3>属性値に含まれる文字列を後方一致で検索: ends-with</h3>
<p>後方一致で検索する場合はends-withを使います。</p><pre class="crayon-plain-tag">//a[ends-with(@href,&quot;96B&quot;)]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;</div>
<p><span class="rmarker-s">但し、この関数はXPath version2.0のみ対応しており、chromeなど多くのブラウザではサポートされていません。</span>参考までに掲載しています。</p>
<p>&nbsp;</p>
<h3>属性値に含まれる文字列をあいまい検索: contains</h3>
<p>ある属性に特定の文字列が含まれているかの確認は、先ほど出てきましたcontainsを使います。containsは完全一致ではなく、部分一致でもOKです。</p><pre class="crayon-plain-tag">//a[contains(@href,&quot;amazon&quot;)]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;</div>
<p>ここではhref属性に”amazon”を含むa要素を取得しています。</p>
<p>&nbsp; </p>
<h3>テキストに含まれる文字列の検索: contains(text(), 検索文字列)</h3>
<p>containsは、テキストに含まれる文字列も検索可能です。但し、大文字・小文字を区別するので注意が必要です。</p><pre class="crayon-plain-tag">//a[contains(text(),&quot;NumPy&quot;)]</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;</div>
<p>&nbsp;<br />
“NumPy”を”numpy”と全て小文字にすると、該当するものが無く、結果には何も表示されません。</p><pre class="crayon-plain-tag">//a[contains(text(),&quot;numpy&quot;)]</pre><p>
<div class="yellowbox">
</div>
<p>&nbsp;<br />
&nbsp; </p>
<h2>リストの取得方法</h2>
<p>ここからはリストの要素の取得方法を確認していきましょう。サンプルのHTMLは以下になります。</p>
<h3>サンプルHTMLコード</h3>
<pre class="crayon-plain-tag">&lt;ul class=&quot;book&quot;&gt;
  &lt;li&gt;Python3によるビジネスに役立つデータ分析入門&lt;/li&gt;
  &lt;li&gt;よくわかるPython3入門1.基礎編&lt;/li&gt;
  &lt;li&gt;よくわかるPython3入門2.NumPy・Matplotlib編&lt;/li&gt;
  &lt;li&gt;よくわかるPython3入門4.Pandasでデータ分析編&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>&nbsp;</p>
<h3>全ての要素を取得</h3>
<p>要素liを指定すると、全てのリストを取得できます。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li</pre><p>
<div class="yellowbox">&lt;li&gt;Python3によるビジネスに役立つデータ分析入門&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門1.基礎編&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門2.NumPy・Matplotlib編&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門4.Pandasでデータ分析編&lt;/li&gt;</div>
<p>&nbsp;</p>
<h3>n番目の要素の取得: [] (スクウェアブラケット)で数値を囲む</h3>
<p> [] (スクウェアブラケット)で数値を囲むと、その順番の要素を取得できます。<br />
例えば、２番目の要素を取得したい場合、li[2]と記述します。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[2]</pre><p>
<div class="yellowbox">&lt;li&gt;よくわかるPython3入門1.基礎編&lt;/li&gt;</div>
<p>&nbsp;</p>
<h3>n番目の要素の取得: position</h3>
<p>positionでもn番目の要素を指定することができます。<br />
タグ[position()=何番目]
例えば２番目の要素を取得する場合は次のように書きます。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[position()=2]</pre><p>
<div class="yellowbox">&lt;li&gt;よくわかるPython3入門1.基礎編&lt;/li&gt;</div>
<p>&nbsp; </p>
<h3>複数の要素の取得: position &#038; or</h3>
<p>１つ目と４つ目を取得したい場合、[]に対してorを使ってもうまくいきません。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[1 or 4]</pre><p>
<div class="yellowbox">&lt;li&gt;Python3によるビジネスに役立つデータ分析入門&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門1.基礎編&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門2.NumPy・Matplotlib編&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門4.Pandasでデータ分析編&lt;/li&gt;</div>
<p>１から４番目までの全ての要素が表示されてしまいます。</p>
<p>&nbsp;<br />
次のようにposition()とorを使えば1番目と4番目の要素を取得できます。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[position()=1 or position()=4]</pre><p>
<div class="yellowbox">&lt;li&gt;Python3によるビジネスに役立つデータ分析入門&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門4.Pandasでデータ分析編&lt;/li&gt;</div>
<p>&nbsp; </p>
<h3>最後の要素を取得: last</h3>
<p>最後の要素を取得したい場合、last()を使います。要素の数が変わる可能性があるけれども、必ず最後の要素を取得したいという時に使うと便利です。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[position()=last()]</pre><p>
<div class="yellowbox">&lt;li&gt;よくわかるPython3入門4.Pandasでデータ分析編&lt;/li&gt;</div>
<p>&nbsp;</p>
<h3>最初の要素を取得: position()=1</h3>
<p>最初の要素はposition()=1で取得できます。</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[position()=1]</pre><p>
<div class="yellowbox">&lt;li&gt;Python3によるビジネスに役立つデータ分析入門&lt;/li&gt;</div>
<p>&nbsp;</p>
<h3>n番目以降・以前の要素を取得: 不等号</h3>
<p>position()では>、<、>=、<=などの数学的オペレーションが使えます。
特定の順番以降の要素の取得に使います。
例えば、1番目の要素にはブランクが入っており、でも２番目以降に必要な情報が入っているなどの場合、2番目以降の要素を取得する必要があります。
</p><pre class="crayon-plain-tag">//ul[@class=&quot;book&quot;]/li[position()&gt;1]</pre><p>


<div class="yellowbox">&lt;li&gt;よくわかるPython3入門1.基礎編&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門2.NumPy・Matplotlib編&lt;/li&gt;<br />
&lt;li&gt;よくわかるPython3入門4.Pandasでデータ分析編&lt;/li&gt;</div>
<p>&nbsp;<br />
&nbsp;</p>
<h2>軸を用いた親・先祖・兄弟・子・子孫要素の指定</h2>
<h3>軸の使い方</h3>
<p>今までの説明では、ルートもしくは途中のパスからから階層を降りて目的の要素を指定していました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath10-e1581988830150.png" alt="XPathの書き方" width="500" height="93" class="aligncenter size-full wp-image-4469" /><br />
例えば、html – head – titleとたどってtitle要素を指定する場合、次のように書きます。</p><pre class="crayon-plain-tag">/html/head/title</pre><p>
<p>&nbsp;<br />
但し、時にはある要素の親の要素やそのさらに親の要素（先祖要素）、子の要素とその子の要素（子孫要素）、同じ親を持つ子要素同士（兄弟要素）などを指定する必要があります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath11-e1581988935789.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="500" height="270" class="aligncenter size-full wp-image-4470" /></p>
<p>&nbsp;<br />
これらはXPathでは軸を使って指定します。XPathでは軸はノードテストの前に「軸::」を付加して指定します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath12-e1581988981150.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="600" height="104" class="aligncenter size-full wp-image-4471" /><br />
<span class="ymarker-s">軸はロケーションパス上の任意のノードテストの前に付けることができます。</span></p>
<p>&nbsp;<br />
軸には次のようなものがあります。</p>
<table>
<tbody>
<tr bgcolor="#7fffd4">
<td align="center" width="100">軸</td>
<td align="center" width="200">説明</td>
</tr>
<tr>
<td width="100">parent</td>
<td width="200">親の要素</td>
</tr>
<tr>
<td width="100">ancestor</td>
<td width="200">先祖要素</td>
</tr>
<tr>
<td width="100">ancestor-or-self</td>
<td width="200">自分自身も含めた先祖要素</td>
</tr>
<tr>
<td width="100">preceding</td>
<td width="200">先祖を除く全ての前の要素</td>
</tr>
<tr>
<td width="100">preceding-sibling</td>
<td width="200">前にある全ての兄弟要素</td>
</tr>
<tr>
<td width="100">child</td>
<td width="200">子要素</td>
</tr>
<tr>
<td width="100">following</td>
<td width="200">後ろの全ての要素</td>
</tr>
<tr>
<td width="100">following-sibling</td>
<td width="200">後ろにある兄弟要素</td>
</tr>
<tr>
<td width="100">descendant</td>
<td width="200">後ろの子孫要素</td>
</tr>
<tr>
<td width="100">descendant-or-self</td>
<td width="200">自分自身を含む後ろの子孫要素</td>
</tr>
<tr>
<td width="100">self</td>
<td width="200">自分自身の要素</td>
</tr>
<tr>
<td width="100">attribute</td>
<td width="200">自分自身の属性</td>
</tr>
</tbody>
</table>
<p>&nbsp;<br />
ここではこれらの軸の指定方法を確認していきます。</p>
<p>&nbsp;</p>
<h3>HTMLの階層構造</h3>
<p>XPathでの軸の指定方法を確認する前に、兄弟要素や先祖要素などの言葉の定義を確認しましょう。</p>
<p>&nbsp;</p>
<h4>親・子・兄弟要素</h4>
<p><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath13-e1581990167308.png" alt="XPathでの親要素の取得と子要素、兄弟要素(following-sibling, preceding-sibling)の取得" width="540" height="253" class="aligncenter size-full wp-image-4477" /><br />
ここでは、自分自身の要素を赤色のp要素とします。そこから１階層上に上がったbody要素（オレンジ色）が親要素になります。<br />
&nbsp;<br />
また１つ階層を下に降りたa要素（黄色）が子要素になります。また同じ親要素の子である緑色のp要素は兄弟要素と呼ばれます。</p>
<p>&nbsp;</p>
<h4>先祖・子孫要素</h4>
<p><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath14-e1581990260224.png" alt="XPathでの先祖要素、子孫要素の取得" width="540" height="257" class="aligncenter size-full wp-image-4478" /><br />
また同様に自分自身の要素を赤色のp要素とします。そこから１階層上に上がったbody要素とさらに階層を上がったその親要素htmlが先祖要素（オレンジ色）になります。<br />
&nbsp;<br />
そして、階層を下に順に下がっていった要素は子孫要素（黄色）と言います。</p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 前にある要素の取得</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
まずは自分自身の要素の前にある要素の取得方法を確認していきます。ここでのHTMLは元のサンプルを使って説明します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath15-e1581990775200.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="540" height="371" class="aligncenter size-full wp-image-4482" /></p>
<p>&nbsp;<br />
自分自身をid属性が”link2”のa要素（赤色）とすると、前にある要素とは黄色の要素になります。これらの取得方法を１つ１つ確認していきます。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h3>親要素の取得: parent</h3>
<p>親の要素（黄色）を取得するには、軸にparent::と入力します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath16-e1581994058522.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="360" height="216" class="aligncenter size-full wp-image-4485" /><br />
次のように記述します。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/parent::p</pre><p>
<div class="yellowbox">&lt;p class=&#8221;recent books&#8221;&gt; 清水義孝の最新の著書には、次の本があります。 …　…　（省略）…　… &lt;/p&gt;</div>
<p>&nbsp;<br />
ここでは、親の要素がpとわかっておりparent::pとしましたが、わからない場合は、node()を使います。結果は同じです。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/parent::node()</pre><p>
<div class="yellowbox">&lt;p class=&#8221;recent books&#8221;&gt; 清水義孝の最新の著書には、次の本があります。 …　…　（省略）…　… &lt;/p&gt;</div>
<p>&nbsp;</p>
<h3>先祖要素の取得: ancestor</h3>
<p>先祖要素（黄色）の取得にはancestorを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath17-e1581994172579.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="550" height="380" class="aligncenter size-full wp-image-4488" /><br />
親要素だけでなく、その親とノードをたどっていき、各要素を取得します。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/ancestor::node()</pre><p>
<div class="yellowbox">&lt;html&gt; &lt;head&gt; &lt;title&gt; 清水義孝の著書…　…　（省略）…　…  &lt;/body&gt; &lt;/html&gt;<br />
&lt;body&gt; &lt;p class=&#8221;title&#8221;&gt;  …　…　（省略）…　…  &lt;/p&gt; &lt;/body&gt;<br />
&lt;p class=&#8221;recent books&#8221;&gt;…　…　（省略）…　… &lt;/p&gt;</div>
<p>ここではid属性が”link2”のa要素の先祖要素であるhtml、body、pが表示されました。</p>
<p>&nbsp; </p>
<h3>自身も含めた先祖要素の取得: ancestor-or-self</h3>
<p>先ほどのancestorには自分自身は含まれません。自身も含めた先祖要素の取得にはancestor-or-selfを使います。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/ancestor-or-self::node()</pre><p>
<div class="yellowbox">&lt;html&gt; &lt;head&gt; &lt;title&gt; 清水義孝の著書…　…　（省略）…　…  &lt;/body&gt; &lt;/html&gt;<br />
&lt;body&gt; &lt;p class=&#8221;title&#8221;&gt;  …　…　（省略）…　…  &lt;/p&gt; &lt;/body&gt;<br />
&lt;p class=&#8221;recent books&#8221;&gt;…　…　（省略）…　… &lt;/p&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;</div>
<p>すると自身（a要素）も含めて取得できます。</p>
<p>&nbsp; </p>
<h3>先祖を除く全ての前の要素を取得: preceding</h3>
<p>自身の要素の前にある、先祖要素を除いた全ての要素の取得にはprecedingを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath18-e1581994295134.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="550" height="256" class="aligncenter size-full wp-image-4490" /><br />
次のように記述します。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/preceding::node()</pre><p>
<div class="yellowbox">&lt;head&gt; &lt;title&gt; 清水義孝の著書 &lt;/title&gt; &lt;/head&gt;</p>
<p>&lt;title&gt; 清水義孝の著書 &lt;/title&gt;<br />
清水義孝の著書 </p>
<p>&lt;p class=&#8221;title&#8221;&gt; &lt;b&gt; 清水義孝の最新の著書には、次の本があります。 &lt;/b&gt; &lt;/p&gt;</p>
<p>&lt;b&gt; 清水義孝の最新の著書には、次の本があります。 &lt;/b&gt;<br />
清水義孝の最新の著書には、次の本があります。 </p>
<p>&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
Python3によるビジネスに役立つデータ分析入門</p></div>
<p>実行すると、テキストも含めた全ての前の要素を取得することができました。<span class="rmarker-s">但し、先祖要素のhtml、body、p(class属性が&#8221;recent books&#8221;)は除かれています。</span></p>
<p>&nbsp;</p>
<h3>前にある全ての兄弟要素の取得: preceding-sibling</h3>
<p>自身より前にある全ての兄弟要素（黄色）の取得にはpreceding-siblingを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath19-e1581994365186.png" alt="前にある全ての兄弟要素の取得: preceding-sibling" width="500" height="220" class="aligncenter size-full wp-image-4491" /><br />
このように書きます。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/preceding-sibling::node()</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;</div>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 後ろにある要素の取得</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
 次に自分自身の要素の後ろにある要素の取得方法を確認していきます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath20-e1581995757163.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="550" height="379" class="aligncenter size-full wp-image-4499" /><br />
自分自身をclass属性が”recent books”のp要素（赤色）とすると、後ろにある要素とは黄色の要素になります。これらの取得方法も１つ１つ確認していきます。</p>
<p>&nbsp;</p>
<h3>子要素の取得: child</h3>
<p>子要素（黄色）の取得はchildを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath21-e1581996026983.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="350" height="284" class="aligncenter size-full wp-image-4501" /><br />
こちらも子要素の要素がわかっている場合、その要素を記述します。ここではa要素を記述しています。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/child::a</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt; </div>
<p>&nbsp;<br />
子要素がわからない場合、child::node()と記述します。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/child::node()</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt; </div>
<p>&nbsp;</p>
<h3>後ろの全ての要素を取得: following</h3>
<p>ある要素の後続にある全ての要素（黄色）を取得するにはfollowingを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath22-e1581996091190.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="450" height="320" class="aligncenter size-full wp-image-4503" /><br />
以下のように記述します。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/following::node()</pre><p>
<div class="yellowbox">&lt;p class=&#8221;end&#8221;&gt; &lt;b&gt; そして、これらの本は好評発売中です。 &lt;/b&gt; &lt;/p&gt;</p>
<p>&lt;b&gt; そして、これらの本は好評発売中です。 &lt;/b&gt;<br />
そして、これらの本は好評発売中です。</p></div>
<p>テキストも含めた全ての後ろの要素を取得することができました。</p>
<p>&nbsp;</p>
<h3>後ろにある兄弟要素を取得: following-sibling</h3>
<p>ある要素（ここでは赤色）を起点にして、後ろにある兄弟要素（黄色）を取得するにはfollow-siblingを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath23-e1581996302768.png" alt="後ろにある兄弟要素を取得: following-sibling" width="440" height="322" class="aligncenter size-full wp-image-4505" /><br />
次のようになります。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/following-sibling::node()</pre><p>
<div class="yellowbox">&lt;p class=&#8221;end&#8221;&gt; &lt;b&gt; そして、これらの本は好評発売中です。 &lt;/b&gt; &lt;/p&gt;</div>
<p>ここではbodyの子要素の内、対象の要素以降の兄弟要素を取得しています。</p>
<p>&nbsp; </p>
<h3>後ろの子孫要素を取得: descendant</h3>
<p>ある要素（ここでは赤色）の後続にある全ての子孫要素（黄色）を取得するにはdescendantを使います。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/02/xpath24-e1581996358145.png" alt="XPathでの親要素の取得と子要素、先祖要素、子孫要素、兄弟要素の取得" width="450" height="330" class="aligncenter size-full wp-image-4506" /><br />
以下のようになります。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/descendant::node()</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
Python3によるビジネスに役立つデータ分析入門 </p>
<p>&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
よくわかるPython3入門2.NumPy・Matplotlib編 </p>
<p>&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;<br />
よくわかるPython3入門4.Pandasでデータ分析編</p></div>
<p>&nbsp;</p>
<h3>自身を含む後ろの子孫要素を取得: descendant-or-self</h3>
<p>先ほどのdescendantには自分自身は含まれません。自身も含めた子孫要素の取得にはdescendant-or-selfを使います。</p><pre class="crayon-plain-tag">//p[@class=&quot;recent books&quot;]/descendant-or-self::node()</pre><p>
<div class="yellowbox">&lt;p class=&#8221;recent books&#8221;&gt; &lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt; &lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt; &lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt; &lt;/p&gt;</p>
<p>&lt;a class=&#8221;book&#8221; id=&#8221;link1&#8243; href=&#8221;https://www.amazon.co.jp/dp/B07TN4D3HG&#8221;&gt; Python3によるビジネスに役立つデータ分析入門 &lt;/a&gt;<br />
Python3によるビジネスに役立つデータ分析入門 </p>
<p>&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;<br />
よくわかるPython3入門2.NumPy・Matplotlib編 </p>
<p>&lt;a class=&#8221;book&#8221; id=&#8221;link3&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07T9SZ96B&#8221;&gt; よくわかるPython3入門4.Pandasでデータ分析編 &lt;/a&gt;<br />
よくわかるPython3入門4.Pandasでデータ分析編</p></div>
<p>出力結果の最初に自分自身（class属性が&#8221;recent books&#8221;のp要素）が表示されているのがわかります。</p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 自分自身の要素の取得</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
 今度は自分自身の要素やその情報の取得方法を確認します。</p>
<p>&nbsp; </p>
<h3>自身の要素を取得: self</h3>
<p>自分自身の要素を取得するにはselfを使います。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/self::node()</pre><p>
<div class="yellowbox">&lt;a class=&#8221;book&#8221; id=&#8221;link2&#8243; href=&#8221;http://www.amazon.co.jp/dp/B07SRLRS4M&#8221;&gt; よくわかるPython3入門2.NumPy・Matplotlib編 &lt;/a&gt;</div>
<p>通常は、これらは省略されて//a[@id=&#8221;link2&#8243;]と記述されます。</p>
<p>&nbsp;</p>
<h3>属性の取得: attribute</h3>
<p>自分自身の要素の属性を取得するにはattributeを使います。</p><pre class="crayon-plain-tag">//a[@id=&quot;link2&quot;]/attribute::node()</pre><p> </p>
<div class="yellowbox">http://www.amazon.co.jp/dp/B07SRLRS4M<br />
link2<br />
book</div>
<p>&nbsp;<br />
&nbsp;</p>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/xpath/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Pythonのスキルが劇的に向上した！Udemyのおすすめ講座５選！</title>
		<link>https://ai-inter1.com/python-udemy/</link>
					<comments>https://ai-inter1.com/python-udemy/#respond</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Thu, 16 Jan 2020 15:00:37 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=4009</guid>

					<description><![CDATA[※この記事にはプロモーションが含まれています。 Python初心者「Pythonのスキルを上げる良い方法はないかなぁ？」、「Udemyというオンラインサービスが良いと聞いたけれども、実際はどうだろうか ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<p class="pr-text" style="font-size:12px">※この記事にはプロモーションが含まれています。</p>
<p><img decoding="async" class="alignleft size-full wp-image-4034" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_100_2nbg.png" alt="UdemyでPythonの学習を真剣に検討しており、おすすめの講座を推薦してもらいたいプログラミング初心者のイメージ(パンダの画像)" width="129" height="105" /><span style="font-size: 108%;"><strong>Python初心者</strong>「Pythonのスキルを上げる良い方法はないかなぁ？」、「Udemyというオンラインサービスが良いと聞いたけれども、実際はどうだろうか？本当に役に立つのだろうか？」</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">この記事では、このような疑問にお答えします。</span></p>
<p>&nbsp;</p>
<div class="st-mybox  has-title " style="background:#ffffff;border-color:#FFD54F;border-width:2px;border-radius:5px;margin: 25px 0;"><p class="st-mybox-title" style="color:#FFD54F;font-weight:bold;background: #ffffff;"><i class="st-fa fa-check-circle st-css-no" aria-hidden="true"></i>本記事の内容</p><div class="st-in-mybox">
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;"><a href="#why_udemy">Udemyの紹介となぜUdemyの講座がお勧めなのか</a></span></li>
<li><span style="font-size: 108%;"><a href="#python5">Udemyの中でPythonのスキル向上に役立つ講座５選</a></span></li>
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;"><a href="#python3">初心者へおすすめのPython3入門講座</a></span></li>
<li><span style="font-size: 108%;"><a href="#web_scraping">データ収集(Webスクレイピング)のおすすめ講座</a></span></li>
<li><span style="font-size: 108%;"><a href="#datascience">データサイエンスのおすすめ講座</a></span></li>
<li><span style="font-size: 108%;"><a href="#ai">人工知能と機械学習のおすすめ講座</a></span></li>
<li><span style="font-size: 108%;"><a href="#data_analysis">データ分析のおすすめ講座</a></span></li>
</ul>
<li><span style="font-size: 108%;"><a href="#how_to_buy">Udemyの講座の購入方法</a></span></li>
</ul>
</div></div>
<p>&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> この記事を書いた人</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<p><img decoding="async" class="alignleft size-full wp-image-4055" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_170_1bg.png" alt="データサイエンス・データ分析の専門家であるデータサイエンティストのイメージ" width="128" height="129" /><span style="font-size: 108%;"><strong>清水 義孝</strong>「この記事を書いている私（清水 義孝）は、現在、グローバル企業でデータサイエンティストとして働いております。」</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">元々はJavaやWeb系システムのプログラマーやシステムエンジニアをやっておりましたが、近年のAI・データサイエンスのブームもあり、転職後はデータ収集・分析にPythonをメインで使っています。</span></p>
<p>&nbsp;<br />
&nbsp;<br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> おすすめの理由</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<p><span style="font-size: 108%;">Pythonの習得やスキル向上には、かなり苦労しましたが、<strong>いろいろな教材を試した中で<a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2F" rel="nofollow noopener noreferrer" target="_blank">Udemy</a>は良かったので、おすすめの講座をご紹介したいと思います。</strong></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;"><span class="rmarker-s">UdemyのおかげでPythonのスキルが大幅に向上し、データサイエンティストの職にもつけたと言っても過言ではありません。</span></span></p>
<p>&nbsp;</p>
<p><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_115_0bg.png" alt="データサイエンスの専門家である職場の同僚や友人のイメージ" width="129" height="128" class="alignleft size-full wp-image-4087" /><span style="font-size: 108%;">また同じデータサイエンティストとして働いている職場の同僚や新人、フリーランスで働いている友人に聞いても、Udemyの評判は良かったです。</span><br />
&nbsp;</p>
<p><span style="font-size: 108%;">今回は、彼らの意見も踏まえて、講座を選んでいます。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">実際、おすすめするコースはたくさんありますが、あまりいくつも挙げても迷うだけなので、その中でも厳選しベストなものを５つご紹介したいと思います。</span><br />
&nbsp;<br />
&nbsp;<br />
<span style="font-size: 108%;">このページに来られた方の中には、何となくUdemyという名前を聞いたことがあるけれども、よく知らないという方もいらっしゃると思います。</span></p>
<p><span style="font-size: 108%;">まずはUdemyについて、ご紹介します。ご存じの方は、スキップしてくださいね。</span></p>
<p><span style="font-size: 108%;"><a href="#python5">>> 「おすすめのPython講座５選」へ移動</a></span></p>
<p>&nbsp;</p>
<h2 id="why_udemy">Udemyとは？評判は？なぜUdemyの講座がおすすめか</h2>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> Udemyって何？</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_traffic_33_0bg.png" alt="Udemyは評判が良く、初心者にも推薦できる大企業であることを示すイメージ図" width="129" height="128" class="alignleft size-full wp-image-4082" /><span style="font-size: 108%;">Udemyは世界最大級のオンライン学習プラットフォームで、日本ではベネッセが事業パートナーとして協業をしています。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">オンライン学習プラットフォームの会社の中では最大手の１つなので安心ですね。</span></p>
<p>&nbsp;<br />
&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 提供している講座</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">講座のカテゴリーは幅広く、データサイエンス、マネージメント、マーケティング、デザイン、アート、語学などです。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">その中でも特に最近ではAI・データサイエンスなど先端ITの講座が人気だそうです。</span></p>
<p>&nbsp;</p>
<p><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/OnDemandVideo.png" alt="UdemyのPythonの講座はオンデマンドのビデオで、スマホのアプリからも受講できることを示すイメージ図" width="246" height="175" class="alignleft size-full wp-image-4100" /><span style="font-size: 108%;">講座はオンデマンドのビデオになっており、視聴はパソコンからだけでなく、スマホのアプリもあるので、通勤時にも学習を進めることができます。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">またコースの中にはたくさんのレクチャーがあるのですが、それぞれが５分前後のビデオになっているので、スキマ時間を有効活用して学習を進めることができます。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">毎日を忙しく過ごされている方も多く、なかなかPythonの学習に時間を割くことができない方も多いかと思います。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">それでも通勤時の電車やバスの中、またはランチ休憩の途中、人との待ち合わせの待ち時間、在宅勤務の合間など、細切れの利用できる時間はまだまだあると思います。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;"><span class="rmarker-s">これらの細切れの時間をUdemyの講座の受講に使うことで、有効的にスキル向上に繋げていくことができます。</span></span></p>
<p>&nbsp;<br />
&nbsp;<br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> Udemyの実績</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">Udemyによると利用者の実績は、</span></p>
<div class="graybox">
<div class="su-quote su-quote-style-default su-quote-has-cite"><div class="su-quote-inner su-u-clearfix su-u-trim"><span style="font-size: 108%;">受講者数：約4,400万人<br />
講師数：約65,000人<br />
講座数：約18万　<br />
※2021年11月現在　すべて世界全体での数<span class="su-quote-cite">Udemy公式サイト</span></div></div></div>
<p><span style="font-size: 108%;">だそうです。結構な数ですね。</span></p>
<p>&nbsp;<br />
&nbsp;<br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 価格は？</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">例えば、プログラミングスクールに通うと４０万円くらいかかります。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;"><span class="rmarker-s">でもUdemyなら値段もお手頃です。１講座あたり数千～２万円程度で販売されていますので、コスパが最高です。</span>また講座は一度購入すればいつまでも受講できます。<br />
</span></p>
<p>&nbsp;<br />
&nbsp;<br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 保証は？</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<img decoding="async" class="alignleft size-full wp-image-4034" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_100_2nbg.png" alt="UdemyでPythonの学習を真剣に検討しており、おすすめの講座を推薦してもらいたいプログラミング初心者のイメージ(パンダの画像)" width="129" height="105" /><span style="font-size: 108%;"><strong>Python初心者</strong>「買ったのはいいけれど、満足する内容じゃなかったらどうしよう？」</span></p>
<p>&nbsp;<br />
&nbsp;</p>
<p><img decoding="async" class="alignleft size-full wp-image-4055" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_170_1bg.png" alt="データサイエンス・データ分析の専門家であるデータサイエンティストのイメージ" width="128" height="129" /><span style="font-size: 108%;"><strong>清水 義孝</strong>「満足しない場合は30日返金保証があるので安心だよ。返金保証の依頼も簡単です。」</span></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<div class="graybox"><div class="su-quote su-quote-style-default su-quote-has-cite"><div class="su-quote-inner su-u-clearfix su-u-trim"><span style="font-size: 108%;">Udemyでは、納得のいく受講体験をお届けするために、購入したすべてのコースを30日以内に返金できるようにしています。コースに満足できなかった場合は、理由を問わず返金を申請できます。</span><span class="su-quote-cite">https://support.udemy.com/hc/ja/articles/229604248-コースの返金</span></div></div></div>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">参考までに、私も１度だけ返金保証のお世話になりましたが、ちゃんと返ってきました。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;" id="python5"></span><br />
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> おすすめのPython講座５選</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">それでは、本題の講座の紹介にはいっていきましょう。Python入門、データ収集、人工知能・機械学習、データサイエンス、データ分析と５つの分野別にもっともお勧めものを紹介しますね。</span></p>
<p>&nbsp;</p>
<h2 id="python3">初心者へおすすめのPython3入門講座</h2>
<p><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F" rel="nofollow noopener noreferrer" target="_blank"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/bda46c33c77aace7d27710d08e70040b.png" alt="Udemyの「現役シリコンバレーエンジニア(酒井さん)が教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」講座の画面" width="876" height="480" class="aligncenter size-full wp-image-5969" /></a><br />
<span style="font-size: 108%;">Python3の入門に関する講座で最も良かったのは「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」という講座です。</p>
<p><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F" rel="nofollow noopener noreferrer" target="_blank">>> Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学ぶオンライン講座</a><br />
</span><br />
&nbsp;</p>
<div class="freebox has-title " style=""><p class="p-free" style="font-weight:bold;"><span class="p-entry-f" style="font-weight:bold;">特徴</span></p><div class="free-inbox">
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;">７万人以上の受講者</span></li>
<li><span style="font-size: 108%;">Udemyの中でも数少ないベストセラー講座</span></li>
<li><span style="font-size: 108%;">受講者からの評価も５段階で4.4と非常に高い</span></li>
<li><span style="font-size: 108%;">プロのコードスタイルを学べる</span></li>
<li><span style="font-size: 108%;">28.5時間ものオンデマンドのビデオ講義</span></li>
</ul>
</div></div>
<p>&nbsp; </p>
<p><span style="font-size: 108%;">講師の酒井さんは現役シリコンバレーエンジニアだそうです。<span class="rmarker-s">ハイレベルなプロのコードスタイルやその考え方を学べる教材は少なく、他には無いたいへん貴重な講座です。</span></span></p>
<p>&nbsp; </p>
<p><span style="font-size: 108%;">28.5時間もの盛りだくさんの講義でPythonの基礎を幅広く理解することができます。基本的なトピックを網羅的に学習できるのはありがたいですね。</span></p>
<p>&nbsp; </p>
<p><span style="font-size: 108%;">講義内容も、Pythonの環境設定やPythonの入門的なトピック、応用としてコードスタイル、オブジェクトやクラス、データ解析など多岐にわたっています。</span></p>
<p>&nbsp;</p>
<p><img decoding="async" class="alignleft size-full wp-image-4034" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_100_2nbg.png" alt="UdemyでPythonの学習を真剣に検討しており、おすすめの講座を推薦してもらいたいプログラミング初心者のイメージ(パンダの画像)" width="129" height="105" /><span style="font-size: 108%;">Pythonのいろいろなライブラリを理解できるのは良いですね。</span></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<p><span style="font-size: 108%;">講義のボリュームは多いですが、トピック毎に5分程度のレクチャーに分割されているので、サクサク進んでいく感じです。隙間時間にも受講できるのがありがたいですね。解説が丁寧で、ビデオ講座なので途中経過も説明があり理解しやすいです。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;"><span class="rmarker-s">この講座からの知識をベースにデータサイエンスや人工知能・機械学習、データ収集などの応用的なトピックに進んでいくのがおすすめです。</span></span></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<h2 id="web_scraping">データ収集(Webスクレイピング)のおすすめ講座</h2>
<p><a href="https://ai-inter1.com/udemy-webscraping-link" rel="nofollow noopener noreferrer" target="_blank"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/be0df8585a1a8d571f5a10c21748ec03.png" alt="Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）講座の画面" width="798" height="262" class="aligncenter size-full wp-image-6006" /></a></p>
<p><span style="font-size: 108%;"><span class="ymarker-s">データサイエンスやデータ分析、機械学習を行うには、データ収集が欠かせません。</span>データがあって初めて、分析したり機械学習のモデルを作成したりすることができます。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">データ収集のおすすめ講座は「Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）」です。<span class="rmarker-s">Pythonを用いて世界中のWebサイトから自動的にデータ収集する方法を、基礎からていねいに学ぶことができます。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">スクレイピング初心者にもわかりやすいよう、基本的なトピックから順を追って、丁寧に解説しています。またPythonを初めて学ばれた方も、最初に取り組みやすい内容になっています。</span></p>
<p><a href="https://ai-inter1.com/udemy-webscraping-link" rel="nofollow noopener noreferrer" target="_blank">>> Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）</a><br />
</span></p>
<p>&nbsp;</p>
<div class="freebox has-title " style=""><p class="p-free" style="font-weight:bold;"><span class="p-entry-f" style="font-weight:bold;">特徴</span></p><div class="free-inbox">
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;">受講者からの評価も５段階で4.5と非常に高い</span></li>
<li><span style="font-size: 108%;">9.5時間ものオンデマンドビデオ講義</span></li>
<li><span style="font-size: 108%;">Webスクレイピングに必須のライブラリの解説</span></li>
<li><span style="font-size: 108%;">実践形式のレクチャー</span></li>
</ul>
</div></div>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">コースを提供しているのは、私、清水ですので、割引クーポンをお渡しすることができます。以下のリンクをクリックすると８７％割引が自動的に適用されます。<span class="rmarker-s">期間限定になりますのでお早めに。</span></span><br />
<a href="https://ai-inter1.com/udemy-webscraping-link" rel="nofollow noopener noreferrer" target="_blank">Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）</a></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">またこの講座以外にも、データ収集スキルをさらに向上させることを目的とした講座を提供しています。</span><br />
<a href="https://ai-inter1.com/udemy-scrapy-link" rel="nofollow noopener noreferrer" target="_blank"><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/dedd56e9631102ebf990d06b78cdfe2a.png" alt="【3日で学べる】PythonでWebスクレイピング・クローリングを極めよう！（Scrapy、Selenium編）" width="747" height="278" class="aligncenter size-full wp-image-5975" /><br />
</a><br />
<span style="font-size: 108%;"><span class="ymarker-s">Udemyでも数少ないベストセラーのコースになっています。</span></span><br />
&nbsp;<br />
<span style="font-size: 108%;">こちらのコースも割引クーポンのリンクを掲載しておきます。期間限定になりますのでお早めに。</span><br />
<a href="https://ai-inter1.com/udemy-scrapy-link" rel="nofollow noopener noreferrer" target="_blank">【3日で学べる】PythonでWebスクレイピング・クローリングを極めよう！（Scrapy、Selenium編）</a></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<h2 id="datascience">データサイエンスのおすすめ講座</h2>
<p><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fdatascience365%2F" rel="nofollow noopener noreferrer" target="_blank"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/693eae83f8d86072236f248e852c7fa1.png" alt="Udemyの実践 Python データサイエンス講座(numpy、pandas、matplotlib、seabornを含む)の画面" width="876" height="480" class="aligncenter size-full wp-image-5966" /></a><br />
<span style="font-size: 108%;">データサイエンスのおすすめ講座は「【世界で37万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜」です。</span><br />
&nbsp;<br />
<a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fdatascience365%2F" rel="nofollow noopener noreferrer" target="_blank">>> 【世界で37万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜</a><br />
&nbsp;</p>
<div class="freebox has-title " style=""><p class="p-free" style="font-weight:bold;"><span class="p-entry-f" style="font-weight:bold;">特徴</span></p><div class="free-inbox">
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;">約２万人の受講者</span></li>
<li><span style="font-size: 108%;">受講者からの評価も５段階で4.3と非常に高い</span></li>
<li><span style="font-size: 108%;">26時間ものオンデマンドビデオ講義</span></li>
<li><span style="font-size: 108%;">データサイエンスに必須のライブラリの解説</span></li>
<li><span style="font-size: 108%;">実践形式のレクチャー</span></li>
</ul>
</div></div>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">numpy、pandas、ScikitLearn、TensorFlowなどデータサイエンスに欠かせないライブラリについて、深く学習することができます。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">データサイエンスの分野は、理論だけを学んでも学んだ知識を実業務でどのように活かしていけば良いかわからないことが多いです。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;"><span class="huto">でもこの講座には、ケーススタディとして、ビジネス上の課題を解決すべく、実践形式のデータ分析のレクチャーが用意されています。</span></span></p>
<p>&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_object_115_0bg.png" alt="プログラミング初心者であり、Pandasなどのライブラリを使ったデータ分析に興味を持っている職場の新人のイメージ" width="129" height="128" class="alignleft size-full wp-image-4087" /><span style="font-size: 108%;"><span class="huto">新人君</span>「具体的に実践の場で、どのようにデータ分析を進めていけば良いかがわかるのは、スキル向上にたいへん役立ちました。」</p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<h2 id="ai">人工知能と機械学習のおすすめ講座</h2>
<p><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkikagaku_blackbox_1%2F" rel="nofollow noopener noreferrer" target="_blank"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/53c864d0bb793d42fa99d1523f425caa.png" alt="【キカガク流】人工知能(AI)・機械学習 脱ブラックボックス講座の画面" width="717" height="250" class="aligncenter size-full wp-image-5971" /></a><br />
<span style="font-size: 108%;">人工知能と機械学習のおすすめ講座は「【キカガク流】人工知能・機械学習 脱ブラックボックス講座 &#8211; 初級編 -」です。<br />
&nbsp;<br />
<a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkikagaku_blackbox_1%2F" rel="nofollow noopener noreferrer" target="_blank">>> 人工知能・機械学習 脱ブラックボックス講座 &#8211; 初級編 &#8211;</a><br />
</span></p>
<p><span style="font-size: 108%;"><span class="rmarker-s">特に全く知識のない状態から機械学習や人工知能について学ぶのに最適な講座です。</span></span><br />
&nbsp;</p>
<div class="freebox has-title " style=""><p class="p-free" style="font-weight:bold;"><span class="p-entry-f" style="font-weight:bold;">特徴</span></p><div class="free-inbox">
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;">４万人以上の受講者</span></li>
<li><span style="font-size: 108%;">受講者からの評価も５段階で4.4と非常に高い</span></li>
<li><span style="font-size: 108%;">こちらもUdemyでも数少ない最高評価のコース</span></li>
</ul>
</div></div>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">コースを提供しているのは、株式会社 キカガクというAI教育のベンチャー企業です。オンライン/オフライン研修で延べ１３，０００人を超える受講実績があるそうです。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">この講座以外にも中級編などの講座を提供されているので、このコースを終えた後にさらなるレベルアップをはかることができます。</span><br />
<a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkikagaku_blackbox_2%2F" rel="nofollow noopener noreferrer" target="_blank">【キカガク流】人工知能・機械学習 脱ブラックボックス講座 &#8211; 中級編 &#8211;</a></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<h2 id="data_analysis">データ分析のおすすめ講座</h2>
<p><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Foptworks_1%2F" rel="nofollow noopener noreferrer" target="_blank"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/627a9503442da7a49b5a0c4b89447887.png" alt="【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門講座の画面" width="746" height="241" class="aligncenter size-full wp-image-5979" /></a><br />
<span style="font-size: 108%;">データ分析のおすすめ講座は「【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門」です。<br />
&nbsp;<br />
<a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Foptworks_1%2F" rel="nofollow noopener noreferrer" target="_blank">【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門</a><br />
</span></p>
<div class="freebox has-title " style=""><p class="p-free" style="font-weight:bold;"><span class="p-entry-f" style="font-weight:bold;">特徴</span></p><div class="free-inbox">
<ul style="list-style-type: disc;">
<li><span style="font-size: 108%;">約２万人の受講者</span></li>
<li><span style="font-size: 108%;">受講者からの評価も５段階で4.4と非常に高い</span></li>
<li><span style="font-size: 108%;">こちらもUdemyでも数少ないベストセラーのコース</span></li>
</ul>
</div></div>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">実際のデータに基づいて基礎分析、可視化から前処理、機械学習の実装までデータ分析の一連の流れを学ぶことができます。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">「ゼロから始める」というタイトルにふさわしく、データ分析の基礎からていねいに解説しています。</span></p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<h2 id="how_to_buy">講座の申し込み方法</h2>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> ユーザー登録</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">Udemyのサイトにいくと画面右上にログイン・新規登録のボタンがあります。既にユーザー登録されている方はログインボタンを押して、ログインしてください。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">ユーザー登録がまだの方は新規登録ボタンを押してください。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/Udemy-Login01.png" alt="Udemyでユーザー登録(アカウント作成)用の新規登録ボタンを押している画面" width="501" height="368" class="aligncenter size-full wp-image-4132" /></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">新規登録には、以下の名前・メールアドレス・パスワードを入力し、新規登録ボタンを押せば登録が終わりです。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/Udemy-Login02.png" alt="ユーザー新規登録(アカウント作成)画面で名前・メールアドレス・パスワードを入力する" width="321" height="440" class="aligncenter size-full wp-image-4133" /></p>
<p>&nbsp;<br />
&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 講座の画面への移動</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">新規登録が終わりましたら、次は購入する講座を探しましょう。</span><br />
&nbsp;<br />
<span style="font-size: 108%;"><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2F" rel="nofollow noopener noreferrer" target="_blank">Udemyで講座を探す</a><br />
</span></p>
<p>&nbsp;<br />
&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 講座購入</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">講座の画面にいきましたら、右側に表示されている「今すぐ購入」ボタンを押しましょう。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/Udemy-Purchase01.png" alt="Udemyの「現役シリコンバレーエンジニア(酒井さん)が教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」講座の画面で「今すぐ購入」ボタンを押している" width="630" height="276" class="aligncenter size-full wp-image-4135" /></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">次に「レジに進む」画面にいきますので、ここで必要な情報を順に入力してください。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/Udemy-Purchase02.png" alt="Udemyの「レジに進む」画面でクレジットカードなどの支払い方法・決済情報を入力し、価格を確認した後に「支払いを完了する」ボタンを押している" width="628" height="285" class="aligncenter size-full wp-image-4136" /></p>
<ul style="list-style-type: decimal;">
<li><span style="font-size: 108%;">は支払い方法の選択で、クレジット／デビッドカード、もしくは、PayPalを選んでください。</span></li>
<li><span style="font-size: 108%;">選んだ支払い方法に応じて、必要な情報を入力していきます。ここではクレジッット／デビッドカードを選んでいますので、カードの情報を入力します。</span></li>
<li><span style="font-size: 108%;">「今後もこのカードを使う」にチェックを入れていれば、次回から入力の手間が省けて便利です。</span></li>
<li><span style="font-size: 108%;">入力が終わりましたら、「支払いを完了する」ボタンを押せば、購入が終わりです。</span></li>
</ul>
<p>&nbsp;</p>
<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-check" style="font-size:32px;color:#67c8f3"></i> 講座の受講方法</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px"></div></div>
<span style="font-size: 108%;">購入後はコースの右側のボタンが「コースへ移動」に変わっています。このボタンを押してください。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/Udemy-Lecture01.png" alt="Udemyの「現役シリコンバレーエンジニア(酒井さん)が教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」講座の画面で「コースへ移動」ボタンを押す" width="523" height="367" class="aligncenter size-full wp-image-4137" /></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">するとコースの画面にいきますので、受講したいレクチャーを右側の「コースの内容」から選んでください。</span><br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/Udemy-Lecture02.png" alt="Udemyの「現役シリコンバレーエンジニア(酒井さん)が教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」講座の画面にレクチャーが表示されている" width="627" height="267" class="aligncenter size-full wp-image-4138" /></p>
<p>&nbsp;</p>
<p><span style="font-size: 108%;">レクチャーをクリックすると、左側の画面にビデオが表示されます。<span class="hutoaka">後は、Enjoy Udemy！</span><span class="hutoaka"></span></p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Udemyの講座を試してPythonのスキル向上を実感して下さい。</h2>
<p><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/s128_f_traffic_39_0bg.png" alt="富士山のイメージ(スキルアップを果たすイメージ)" width="129" height="128" class="alignleft size-full wp-image-4140" /><span style="font-size: 108%;">今回ご紹介したUdemyの５講座はオンデマンドなので、購入後に直ぐに始めることができます。次の講義の日程を確認する必要もありません。</span><br />
&nbsp;</p>
<p><span style="font-size: 108%;">またそれぞれの講座もトピック毎に細分化されていますので、受講したトピックから直ぐに効果を実感することができます。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">これらの講座は、既に数千～７万人以上の方が購入済みです。また満足度を示した受講者からの評価も５段階で4.3以上と非常に高いです。</span></p>
<p>&nbsp;<br />
<span style="font-size: 120%;"><span class="hutoaka">さらに今ならUdemyでは期間限定セール中で、対象コースがかなり安くなっているそうです。でも間もなく終了するので、ご興味のある方はお早めに。</span></span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">もしコースに満足できなくても、返金保障で３０日以内なら理由を問わず返金を申請できるので安心です。</span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">参考までにリンクを再度掲載しておきます。もし宜しければどうぞ。</span><br />
<span style="font-size: 108%;"> <a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F" rel="nofollow noopener noreferrer" target="_blank">>> Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学ぶオンライン講座</a></span></p>
<p><span style="font-size: 108%;"> <a href="https://ai-inter1.com/udemy-webscraping-link" rel="nofollow noopener noreferrer" target="_blank">>> Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）</a></span></p>
<p><span style="font-size: 108%;"><a href="https://ai-inter1.com/udemy-scrapy-link" rel="nofollow noopener noreferrer" target="_blank">【3日で学べる】PythonでWebスクレイピング・クローリングを極めよう！（Scrapy、Selenium編）</a></span></p>
<p><span style="font-size: 108%;"><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fdatascience365%2F" rel="nofollow noopener noreferrer" target="_blank">>> 【世界で37万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜</a><br />
</span></p>
<p><span style="font-size: 108%;"><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkikagaku_blackbox_1%2F" rel="nofollow noopener noreferrer" target="_blank">>> 人工知能・機械学習 脱ブラックボックス講座 &#8211; 初級編 &#8211;</a><br />
</span></p>
<p><span style="font-size: 108%;"><a href="https://click.linksynergy.com/deeplink?id=AbLQY9v*irw&#038;mid=47984&#038;murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Foptworks_1%2F" rel="nofollow noopener noreferrer" target="_blank">>> 【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門</a><br />
</span><br />
&nbsp;</p>
<p><span style="font-size: 108%;">最後に&#8230;</span><br />
&nbsp;<br />
<span style="font-size: 108%;"><span class="rmarker-s">Pythonの学習は、上達する上達しないの前に大事なことが有ります。</span></span><br />
&nbsp;<br />
<span style="font-size: 108%;"><span class="rmarker-s">それは、まず「始める」ことです。</span></span><br />
&nbsp;<br />
<span style="font-size: 108%;">ここで戻るのは簡単ですが、一歩踏み込んで、まずはひとつでも二つでもUdemyの講座に触れてみる、試してみる、この最初の一歩を踏み出せない人が多すぎます。</span><br />
&nbsp;<br />
<span style="font-size: 108%;"><span class="rmarker-s">あなたは、踏み出す人・踏み出さない人、どちらでしょうか？？</span></span></p>
<p>&nbsp;<br />
<span style="font-size: 108%;">というわけで、今回は以上です。Happy Python! </span></p>
<p>&nbsp;</p>
<p>&nbsp;<br />
&nbsp;</p>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-udemy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>図解！PythonでSeleniumを使ったスクレイピングを徹底解説！(インストール・使い方・Chrome)</title>
		<link>https://ai-inter1.com/python-selenium/</link>
					<comments>https://ai-inter1.com/python-selenium/#comments</comments>
		
		<dc:creator><![CDATA[ai-inter]]></dc:creator>
		<pubDate>Sun, 05 Jan 2020 04:55:21 +0000</pubDate>
				<category><![CDATA[04. Selenium]]></category>
		<category><![CDATA[Webスクレイピング]]></category>
		<guid isPermaLink="false">https://ai-inter1.com/?p=3920</guid>

					<description><![CDATA[Seleniumとは Seleniumとは、ブラウザを自動的に操作するライブラリです。主にWEBアプリケーションのテストやWEBスクレイピングに利用されます。 &#160; 主にWEBスクレイピングで ... <p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></description>
										<content:encoded><![CDATA[<h2>Seleniumとは</h2>
<p>Seleniumとは、ブラウザを自動的に操作するライブラリです。主にWEBアプリケーションのテストやWEBスクレイピングに利用されます。</p>
<p>&nbsp;<br />
主にWEBスクレイピングでは、JavaScriptが使われているサイトからのデータの取得や、サイトへのログインなどに使われています。</p>
<p>&nbsp;<br />
ここではまずスクレイピングの流れを確認し、その中でSeleniumがどのように使われるかを説明します。</p>
<p>&nbsp;</p>
<h3>スクレイピングの流れ</h3>
<p>スクレイピングは、大まかに３つのステップに分けることができます。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2019/12/Requests13.png" alt="スクレイピングのステップの説明" width="550" height="250" class="aligncenter size-full wp-image-3912" /><br />
&nbsp;<br />
１つ目はWEBサイトのHTMLなどのデータ取得です。ただし、HTMLには必要な文章のデータだけでなく、タグなどのデータも混じっているので、必要なものだけを抽出する作業が必要になります。</p>
<p>&nbsp;<br />
そこで２つ目のデータの抽出が欠かせません。ここでは、複雑な構造のHTMLデータを解析し、必要な情報だけを抽出します。データの抽出にはBeautiful Soupなどのライブラリを使います。</p>
<p>&nbsp;<br />
そして最後に抽出した情報をデータベースやファイルなどに保存します。</p>
<p>&nbsp;</p>
<h3>スクレイピングでの使い方</h3>
<p><span class="ymarker-s">このWEBスクレイピングの３ステップの中で、Seleniumは１つ目のHTMLデータの取得にrequestsと共によく用いられます。</span></p>
<p>&nbsp;<br />
Pythonではrequestsライブラリを利用して、簡単にWEBサイトからデータを自動的に取得することができます。</p>
<p>&nbsp;<br />
しかし、近年いくつかのWEBサイトではJavaScriptを用いて、ユーザーが画面のボタンをクリックや、画面をスクロールした時に次の画面を読み込む処理を組み込んでいるサイトがあります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium02.png" alt="スクロール時にJavaScriptで画面を読み込むサイトの例" width="463" height="312" class="aligncenter size-full wp-image-3935" /></p>
<p>&nbsp;<br />
また最初にログインを求められるサイトもあります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium03.png" alt="ログイン認証が必要なサイトの例" width="354" height="385" class="aligncenter size-full wp-image-3936" /></p>
<p>&nbsp;<br />
このようなサイトに対しては、機械的にrequestsライブラリだけでデータを取得することができません。</p>
<p>&nbsp;<br />
その際に利用するのがSeleniumになります。Seleniumでは、ドライバを経由してブラウザを操作することができます。</p>
<p>&nbsp;<br />
<span class="rmarker-s">つまり、Seleniumでは人間がブラウザを経由して操作しているのと同じ動きを実現することができます。そしてブラウザを操作して、次の画面を読み込んでからrequestsライブラリを使って、画面のデータを取得します。</span></p>
<p>&nbsp;<br />
<span class="ymarker-s">またSeleniumは、先ほどのWEBスクレイピングの３ステップの中で、２つ目のデータの抽出も行うことができます。</span></p>
<p>&nbsp;<br />
但し、Seleniumはブラウザを操作してデータを取得しますので、動作が遅いことが難点です。従って、できるだけ必要最低限の箇所でSeleniumを使うことをお勧めします。</p>
<p>&nbsp;<br />
この記事では、Seleniumというライブラリの基本となる使い方を確認していきます。</p>
<p>&nbsp;<br />
requestsの詳しい説明は、以下のリンクを参照ください。<br />
<a href="https://ai-inter1.com/python-requests/" target="_blank" rel="noopener noreferrer">>> 図解！PythonのRequestsを徹底解説！</a><br />
&nbsp;<br />
またデータ抽出に使うBeautiful Soupの詳しい説明は、次のリンクを参照ください。<br />
<a href="https://ai-inter1.com/beautifulsoup_1/" target="_blank" rel="noopener noreferrer">>> 図解！Beautiful SoupでWEBスクレイピング徹底解説！</a><br />
&nbsp;<br />
<span class="rmarker-s">またSelenium、BeautifulSoup、Requestsについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。</span>クリックすると自動的に適用されます。期間限定になりますのでお早めに。<br />
<a href="https://ai-inter1.com/udemy-webscraping-link" target="_blank" rel="noopener noreferrer">>> 「Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）(Udemyへのリンク)</a></p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Seleniumのインストール</h2>
<p>Seleniumは、標準ではインストールされていませんので、pipやcondaを利用して別途インストールする必要があります。<br />
&nbsp;<br />
Seleniumは2021/10にSelenium 4が正式にリリースされていますが、この記事ではSelenium 3で解説を進めていきます。スクレイピングの機能向上の観点からはバージョンによる違いはほとんどありませんが、バージョンが異なると一部動作しないコードがありますのでご注意ください。</p>
<p>&nbsp;<br />
pipを利用してインストールする場合は、以下のコマンドを入力してください。</p>
<div class="graybox">pip install selenium==3.141.0</div>
<p>pipの詳しい説明は「<a href="https://ai-inter1.com/python-module_package_library/#pip" target="_blank" rel="noopener noreferrer">Pythonでの外部ライブラリの追加インストール方法</a>」を参照ください。</p>
<p>&nbsp;<br />
またcondaを利用してインストールする場合は、次のコマンドを入力してください。</p>
<div class="graybox">conda install selenium=3.141.0</div>
<p>condaの詳しい説明は「<a href="https://ai-inter1.com/python-module_package_library/#conda" target="_blank" rel="noopener noreferrer">Anacondaでの外部ライブラリの追加インストール方法</a>」を参照ください。</p>
<p>&nbsp;<br />
Seleniumからwebdriverをインポートします。また合わせてtimeからsleepもインポートしておきます。</p><pre class="crayon-plain-tag">from selenium import webdriver
from time import sleep</pre><p>
sleepは、Seleniumでブラウザを操作した際に一定時間待つのに使います。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>WebDriver(ChromeDriver)のインストール</h2>
<p>Seleniumでは、WebDriverを仲介してブラウザを操作します。つまりSeleniumを使うにはWebDriverのインストールが不可欠です。</p>
<p>&nbsp;<br />
ブラウザの種類はメジャーなものでもいくつかありますが、WebDriverは各ブラウザの固有のものを用意する必要があります。この記事では使いやすさの観点からChromeDriverを元に解説を進めていきます。</p>
<p>&nbsp;<br />
もしお使いのパソコンにブラウザChromeがインストールされていない場合、以下のリンクからChromeをダウンロードして、インストールしてください。<br />
<a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer">>> Google Chrome公式サイト</a></p>
<p>&nbsp;<br />
ChromeDriverのインストールについては、以下のリンクからDriverをダウンロードしてください。<br />
<a href="https://sites.google.com/a/chromium.org/chromedriver/downloads" target="_blank" rel="noopener noreferrer">>> Chrome Driver公式サイト</a></p>
<p>&nbsp;<br />
ダウンロードした後、ZIPファイルを解凍し、chromedriver.exeを適当な場所に置いてください。そして次のようにしてChromeDriverを読み込みます。</p>
<div class="graybox">driver = webdriver.Chrome(&#8216;ChromeDriverのディレクトリ + chromedriver&#8217;)</div>
<p>&nbsp;<br />
例えば、私はディレクトリ「C:\Test_Folder\chromedriver_win32」の下にDriverを置きましたので、次のように記述します。</p><pre class="crayon-plain-tag">driver = webdriver.Chrome('C:\Test_Folder\chromedriver_win32\chromedriver')</pre><p>
<p>&nbsp;<br />
以上で、Seleniumを使うための準備は終わりです。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Seleniumの基本的な使い方(Googleでの検索結果の取得と保存)</h2>
<p>これからSeleniumの基本となる使い方を紹介していきます。ここはでは、<a href="https://www.google.co.jp/" target="_blank" rel="noopener noreferrer">Google（https://www.google.co.jp/）</a> に検索条件「python」を入力し、検索結果を取得してみます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium09.png" alt="Googleでの検索結果の表示" width="654" height="474" class="aligncenter size-full wp-image-3952" /></p>
<p>&nbsp;</p>
<h3>サイトの表示</h3>
<p>まずは先ほど読み込みましたdriverのメソッドget()を利用して、WEBサイトを開きます。get()は次のように書きます。</p>
<div class="graybox">driver.get(&#8216;URL&#8217;)</div>
<p>&nbsp;<br />
&nbsp;<br />
それではGoogleのサイトをオープンしてみましょう。</p><pre class="crayon-plain-tag">driver.get('https://www.google.co.jp')</pre><p>
<p>&nbsp;<br />
するとGoogleの画面が開きました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium04.png" alt="SeleniumによってChromeが起動しGoogleの画面が表示された" width="759" height="392" class="aligncenter size-full wp-image-3939" /><br />
またSeleniumによって開かれた為、画面の左上には「Chromeは自動テスト ソフトウェアによって制御されています。」とメッセージが表示されています。</p>
<p>&nbsp;</p>
<h3>テキストボックスの要素の取得(find_element)</h3>
<p>次に検索条件「python」を入力して検索します。<br />
&nbsp;<br />
最初に検索条件を入力する欄を検索し、その後に検索した入力欄に対して検索条件を渡します。入力欄を検索するメソッドはいくつかありますが、ここではname属性で指定するfind_element_by_name()を利用してみましょう。<br />
&nbsp;<br />
find_element_by_nameの記述方法は以下です。</p>
<div class="graybox">driver. find_element_by_name (name)</div>
<p>１つ目の引数には、name属性の値を渡します。</p>
<p>&nbsp;<br />
Seleniumで使う主な検索メソッドは次のものになります。</p>
<table>
<tbody>
<tr bgcolor="#7fffd4">
<td align="center" width="100">メソッド</td>
<td align="center" width="200">説明</td>
</tr>
<tr>
<td width="100">find_element_by_id(id)</td>
<td width="2000">id属性で要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_name(name)</td>
<td width="2000">name属性で要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_class_name(name)</td>
<td width="2000">class属性で要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_tag_name(name)</td>
<td width="2000">タグ名で要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_xpath(xpath)</td>
<td width="2000">XPathで要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_css_selector(css_selector)</td>
<td width="2000">CSSセレクタで要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_link_text(link_text)</td>
<td width="2000">リンクテキストで要素を検索する</td>
</tr>
<tr>
<td width="100">find_element_by_partial_link_text(link_text)</td>
<td width="2000">リンクテキストの部分一致で要素を検索する</td>
</tr>
</tbody>
</table>
<p>&nbsp;<br />
Google ChromeでGoogleのページを開きます。検索条件の入力欄にマウスのカーソルを当て、右クリックします。するとメニューが表示されますので、その中から「検証」を選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium05.png" alt="ChromeでGoogleの検索画面を検証する" width="543" height="445" class="aligncenter size-full wp-image-3941" /></p>
<p>&nbsp;<br />
すると、右側にウィンドウが現れ、HTMLが表示されます。先ほどの検索条件の入力欄にカーソルが当たった状態で、背景色が灰色になっている箇所（赤色で囲った箇所）が入力欄に該当する箇所のコードになります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium06.png" alt="検証によるHTMLコードの表示" width="632" height="398" class="aligncenter size-full wp-image-3942" /><br />
この中からname属性の値「q」（緑色で囲った箇所）を取得します。</p>
<p>&nbsp;<br />
そしてfind_element_by_name()の引数として渡し、返ってきた値を変数search_barに格納します。</p>
<p>&nbsp;</p>
<h3>テキストボックスへの文字入力と検索</h3>
<p>次に指定された要素にテキストを送るメソッドsend_keys()に文字列”python”を渡し、実行してみます。</p><pre class="crayon-plain-tag">search_bar = driver.find_element_by_name(&quot;q&quot;)
search_bar.send_keys(&quot;python&quot;)</pre><p>
<p>&nbsp;<br />
するとGoogleの検索条件の入力欄に「python」という文字が入力されているのがわかります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium07.png" alt="Seleniumにより検索条件の自動入力" width="577" height="406" class="aligncenter size-full wp-image-3943" /></p>
<p>&nbsp;<br />
この状態で検索ボタンを押し、検索結果を表示してみましょう。メソッドsubmit()を実行します。</p><pre class="crayon-plain-tag">search_bar.submit()</pre><p>
<p>&nbsp;<br />
実行すると、検索結果が表示されました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium08.png" alt="SeleniumによりGoogle検索の結果を表示" width="788" height="476" class="aligncenter size-full wp-image-3944" /></p>
<p>&nbsp;<br />
&nbsp;</p>
<h3>XPathによる検索結果一覧の取得(タイトルとURL)</h3>
<p>次に先ほど取得したGoogleの検索結果で表示されているサイトのタイトルとURLを一覧で取得してみましょう。</p>
<p>&nbsp;<br />
まずはサイトのタイトルの取得方法を検討します。検索結果の最初のタイトルにマウスのカーソルを当て、右クリックします。<br />
&nbsp;<br />
するとメニューが表示されますので、その中から「検証」を選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium10.png" alt="Chromeでタイトルのhtmlを検証で確認" width="541" height="427" class="aligncenter size-full wp-image-3967" /></p>
<p>&nbsp;<br />
また右側にコードが表示されます。タイトルに該当する箇所（赤色で囲った箇所）が灰色になっています。ここでは、h3タグでタイトルが定義されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium11.png" alt="h3タグで表示されているタイトル" width="450" height="285" class="aligncenter size-full wp-image-3969" /><br />
このh3タグを元にタイトルは取得できそうです。</p>
<p>&nbsp;<br />
今度はURLの取得方法も検討します。先ほどのコードを見ると、h3タグの上にaタグがあり、href属性でリンク先のURLが指定されています。HTMLは階層構造になっております。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium12.png" alt="aタグのhref属性に格納されているリンク先のURL" width="494" height="331" class="aligncenter size-full wp-image-3970" /></p>
<p>&nbsp;<br />
これらの情報を元に検索結果のサイトのタイトルとURLを一覧で表示するコードは次のようになります。</p><pre class="crayon-plain-tag">for elem_h3 in driver.find_elements_by_xpath('//a/h3'):
    elem_a = elem_h3.find_element_by_xpath('..')  
    print(elem_h3.text)
    print(elem_a.get_attribute('href'))</pre><p>
<div class="yellowbox"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium13.png" alt="Seleniumで取得したGoogleでの検索結果" width="477" height="347" class="aligncenter size-full wp-image-3971" /></div>
<p>タイトルとURLが一覧で表示されました。</p>
<p>&nbsp;<br />
&nbsp;<br />
それではコードを詳しく解説していきます。<br />
&nbsp;<br />
先ほど確認した結果から、タイトルはaタグの配下のh3タグに書かれていました。<br />
&nbsp;<br />
但し、テキストボックスの要素を取得したようにh3タグにはname属性はありませんので、別の方法を考える必要があります。<br />
&nbsp;<br />
そこで利用できるのがXPathになります。XPathはXMLやHTMLの文章に含まれる要素、属性値などを指定するための言語です。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium14.png" alt="XPathで示したHTMLのツリー構造" width="663" height="353" class="aligncenter size-full wp-image-3972" /></p>
<p>&nbsp;<br />
XPathでは、htmlは上記のようなツリー構造として取り扱います。今回はh3タグに取得したいタイトルが含まれており、検索結果に表示されているサイトの数に応じて、繰り返し出現しています。</p>
<p>&nbsp;<br />
上記のツリー構造からh3までをXPathで記述すると、</p>
<div class="graybox">/html/body/…/div/a/h3</div>
<p>このように各要素の間を&#8221; / &#8220;(スラッシュ)で区切って記述します。</p>
<p>&nbsp;<br />
また&#8221; // &#8220;(ダブルスラッシュ)で途中の要素を省略して記述することもできます。<br />
ここでa-h3の要素を指定するには、</p>
<div class="graybox">//a/h3</div>
<p>と記述します。</p>
<p>&nbsp;<br />
XPathの詳しい説明は、「<a href="https://ai-inter1.com/xpath/" target="_blank" rel="noopener noreferrer">図解！XPathでスクレイピングを極めろ！</a>」を参照ください。</p>
<p>&nbsp;<br />
下記のコードではfor文で順に、XPathでa-h3の要素を指定し、取得した内容を変数elem_h3に格納しています。for文の詳しい説明は、「<a href="https://ai-inter1.com/python-for/" target="_blank" rel="noopener noreferrer">図解！Python for ループ文の徹底解説</a>」を参照ください。</p>
<div class="graybox">for elem_h3 in driver.find_elements_by_xpath(&#8216;//a/h3&#8217;):</div>
<p>&nbsp;<br />
次にこのコードではh3タグの親を検索し取得しています。ここではaタグになります。</p>
<div class="graybox">elem_a = elem_h3.find_element_by_xpath(&#8216;..&#8217;)</div>
<p>&nbsp;<br />
ここでは取得したh3タグのテキスト（サイトのタイトル）を表示しています。</p>
<div class="graybox">print(elem_h3.text)</div>
<p>&nbsp;<br />
そしてaタグのhref属性（サイトのURL）を表示しています。</p>
<div class="graybox">print(elem_a.get_attribute(&#8216;href&#8217;))</div>
<p>&nbsp;<br />
これらの実行結果から、検索結果に表示されているサイトのタイトルとＵＲＬを一覧で表示することができました。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium13.png" alt="Seleniumで取得したGoogleでの検索結果" width="477" height="347" class="aligncenter size-full wp-image-3971" /></p>
<p>&nbsp;<br />
&nbsp;</p>
<h3>ヘッドレスモードで実行する方法</h3>
<p>今まではブラウザで画面を表示させていましたが、<span class="rmarker-s">画面を表示させずにブラウザを起動し、プログラムだけを実行させるヘッドレスモードもあります。</span></p>
<p>&nbsp;<br />
画面を表示しないので途中の経過を画面では確認できなくなりますが、その分速く実行できるというのがメリットです。</p>
<p>&nbsp;<br />
先ほどのコードをヘッドレスモードで実行する場合のコードは、次のようになります。変わった箇所の背景色を変えています。</p><pre class="crayon-plain-tag">from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome('C:\Test_Folder\chromedriver_win32\chromedriver',options=options)
driver.get('https://www.google.co.jp')

search_bar = driver.find_element_by_name(&quot;q&quot;)
search_bar.send_keys(&quot;python&quot;)
search_bar.submit()

for elem_h3 in driver.find_elements_by_xpath('//a/h3'):
    elem_a = elem_h3.find_element_by_xpath('..')  
    print(elem_h3.text)
    print(elem_a.get_attribute('href'))</pre><p>
<p>&nbsp;<br />
プログラムを実行すると、今度はブラウザの画面が表示されません。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium13.png" alt="Seleniumで取得したGoogleでの検索結果" width="477" height="347" class="aligncenter size-full wp-image-3971" /><br />
しかし、ヘッドレスモードで実行しても結果には変わりなく、タイトルとURLが一覧で表示されます。</p>
<p>&nbsp;<br />
前の章のコードからの追加・変更箇所を抜粋します。以下のコードを追加・変更することにより、ヘッドレスモードで実行することができました。</p>
<div class="graybox">from selenium.webdriver.chrome.options import Options<br />
options = Options()<br />
options.add_argument(&#8216;&#8211;headless&#8217;)<br />
driver = webdriver.Chrome(&#8216;C:\Test_Folder\chromedriver_win32\chromedriver&#8217;,options=options)</div>
<p>&nbsp;<br />
ヘッドレスモードを無効にする場合、次の箇所をコメントアウトすると無効になります。</p>
<div class="graybox">#options.add_argument(&#8216;&#8211;headless&#8217;)</div>
<p>&nbsp;<br />
コードはヘッドレスモードで実行できるように記述しておき、上記の箇所をコメントアウトする・しないでヘッドレスモードの無効・有効を切り替えれば良いでしょう。</p>
<p>&nbsp;</p>
<h3>次のページへ遷移（「次へ」のリンクをクリック）</h3>
<p>先ほどは、Googleで検索した結果の１ページ目の情報を取得しましたが、今度は、２ページ目以降の情報も取得してみましょう。</p>
<p>&nbsp;<br />
まずはいつものように情報の取得方法の確認を行います。</p>
<p>&nbsp;<br />
Chromeブラウザで「次へ」のリンクにカーソルを当て、右クリックのメニューから「検証」を選択しましょう。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium28.png" alt="Chromeブラウザで「次へ」のリンクにカーソルを当てている" width="500" height="200" class="aligncenter size-full wp-image-4174" /></p>
<p>&nbsp;<br />
すると次のようなHTMLが表示されました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium29.png" alt="aタグのhref属性に次のページのURLが存在する" width="493" height="240" class="aligncenter size-full wp-image-4176" /></p>
<p>&nbsp;<br />
ここでは、aタグのhref属性に次のページのURLの一部が埋め込まれているようです。これを取得するには、id = “pnnext”が使えそうです。</p>
<p>&nbsp;<br />
これらの確認した情報を元に、２ページ目以降の検索結果の情報を一覧で表示するコードは次のようになります。</p><pre class="crayon-plain-tag">i = 0
while True:
    i = i + 1
    sleep(1)
    for elem_h3 in driver.find_elements_by_xpath('//a/h3'):
        elem_a = elem_h3.find_element_by_xpath('..') 
        print(elem_h3.text)
        print(elem_a.get_attribute('href'))
    next_link = driver.find_element_by_id('pnnext')
    driver.get(next_link.get_attribute('href'))
    if i &gt; 4:
        break</pre><p>
<div class="yellowbox"><img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium30.png" alt="次ページの情報も含めたGoogleでの検索結果の表示" width="595" height="337" class="aligncenter size-full wp-image-4178" /></div>
<p>２ページ目以降もタイトルとURLが一覧で表示されました。※ここでは簡略の為、５ページまでの情報を取得しております。</p>
<p>&nbsp;<br />
&nbsp;<br />
それではコードを詳しく解説していきます。</p>
<p>&nbsp;<br />
全体の構成として、While True:で無限ループの繰り返し処理となっています。While Trueの詳しい説明は、「<a href="https://ai-inter1.com/python-while-true/" target="_blank" rel="noopener noreferrer">図解！Python while True 無限ループの抜け方と使い方を解説！</a>」を参照ください。</p>
<p>&nbsp;<br />
１ページ毎に繰り返し処理を行い、変数iのカウントを増やしていき、５ページまでの処理が終わった時点でif文の中のbreakで繰り返し処理を抜けています。</p>
<div class="graybox">i = 0<br />
while True:<br />
&nbsp;&nbsp;&nbsp;&nbsp; i = i + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp; (…省略…)<br />
&nbsp;&nbsp;&nbsp;&nbsp; if i > 4:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break</div>
<p>※「i > 4」の数値を変えると、ページ数を変更することができます。</p>
<p>&nbsp;<br />
先ほど省略した処理の中で前半のfor文の箇所は、前の章で説明したとおりサイトのタイトルとURLを一覧で取得して表示しています。</p>
<p>&nbsp;<br />
そして次の箇所で、先ほど確認した次ページのURLを取得し、そのURLでブラウザをオープンしています。</p>
<div class="graybox">next_link = driver.find_element_by_id(&#8216;pnnext&#8217;)<br />
driver.get(next_link.get_attribute(&#8216;href&#8217;))</div>
<p>&nbsp;<br />
このようにして、ページの上限に達するまで、処理が繰り返されていきます。</p>
<p>&nbsp;</p>
<h3>データのCSVファイルへのダウンロード・保存</h3>
<p>前回は画面に表示していた検索結果のサイトのタイトルとURLを、今度はCSVファイルに保存しましょう。ファイルに出力することにより、取得した情報が保存され、後から見直すことも可能になります。</p>
<p>&nbsp;<br />
PythonでCSVファイルの読み書きを行うには、Pythonの標準ライブラリの中にCSVという便利なモジュールがあります。まずはCSVモジュールをインポートします。</p><pre class="crayon-plain-tag">import csv</pre><p>
<p>&nbsp;<br />
またCSVファイルのファイル名には、後から見た時にいつの記事かがわかりやすいよう、記事を取得した日付を付けたいと思いますので、合わせて日付の取得に必要なライブラリdatetimeもインポートします。</p><pre class="crayon-plain-tag">import datetime</pre><p>
<p>&nbsp;<br />
CSVのファイル名に付ける日付は、datetime.datetime.today()で当日の日付を取得し、strftime()で文字列に変換します。</p>
<p>&nbsp;<br />
その際に書式として、西暦４桁「%Y」、月「%m」、日「%d」の形式で表示されるよう”%Y%m%d”を渡します。このようにして取得した日付を変数csv_dateに格納しています。</p><pre class="crayon-plain-tag">csv_date = datetime.datetime.today().strftime(&quot;%Y%m%d&quot;)</pre><p>
<p>&nbsp;<br />
先ほど作成した変数csv_dateと合わせて、CSVファイル名を保存する変数csv_file_nameを作成します。<br />
&nbsp;<br />
日付の前にはGoogleから検索条件「python」で取得したデータとわかるように、「google_python_」を付けています。またファイルの末尾には、csvファイルとなるように「.csv」を付けています。</p><pre class="crayon-plain-tag">csv_file_name = 'google_python_' + csv_date + '.csv'</pre><p>
<p>&nbsp;<br />
次にCSVファイルへの書き込みの処理を記述していきます。何かを書き込む前に、open()を利用して、空のCSVファイルをオープンすることが必要になります。</p>
<p>&nbsp;<br />
open()の記述方法は次のようになります。</p>
<div class="graybox">open(ディレクトリ+ファイル名, mode = &#8216;w&#8217;, encoding=&#8217;cp932&#8242;, errors=&#8217;ignore&#8217;)</div>
<p>&nbsp;<br />
引数として、最初にファイルの保存先ディレクトリとファイル名を指定します。ここでは、先ほどの変数csv_file_nameを指定します。ここでは、ディレクトリは指定せず、プログラムを実行するディレクトリにファイルを出力してみます。<br />
&nbsp;<br />
引数modeでは、ファイルを読み込むモードを指定します。&#8217;w&#8217;を指定すると、書き込み用に開きます。<br />
&nbsp;<br />
引数encodingでは、CSVファイルの文字コードを指定します。ここでは、コンピュータ上で日本語を含む文字列を表現するために用いられる文字コードの一つであるShift_JIS（シフトジス）を指定します。Shift_JISを指定するには、引数に’cp932’(Shift_JIS)を渡します。</p>
<p>&nbsp;<br />
ここでは次のように記述します。</p><pre class="crayon-plain-tag">f = open(csv_file_name, 'w', encoding='cp932', errors='ignore')</pre><p>
<p>&nbsp;<br />
CSVファイルのオープンが終わりましたら、次にヘッダを書き込んでみましょう。CSVファイルへの書き込みには、csv.writer()を利用します。</p>
<div class="graybox">csv.writer(ファイルオブジェクト, lineterminator=&#8217;\n&#8217;)</div>
<p>&nbsp;<br />
csv.writer()の最初の引数には、open()で開いたファイルオブジェクトを指定します。ここでは、open()から返されたオブジェクトを変数fに代入していますので、fを指定します。<br />
&nbsp;<br />
引数lineterminatorでは、改行方法を指定します。ここでは改行時に通常用いる&#8217;\n&#8217;を指定しています。</p>
<p>&nbsp;<br />
そして、CSVファイルに１行を書き込むには、writerow()を使います。</p>
<div class="graybox">writer.writerow(リスト)</div>
<p>&nbsp;<br />
writerow()には、CSVファイルに書き込みたい内容をリスト型で渡します。</p><pre class="crayon-plain-tag">writer = csv.writer(f, lineterminator='\n') 
csv_header = [&quot;検索順位&quot;,&quot;URL&quot;,&quot;サマリー&quot;]
writer.writerow(csv_header)</pre><p>
<p>&nbsp;<br />
ヘッダの書き込みが終わりましたので、前章で作成したGoogleの検索結果を取得して表示しているプログラムに、CSVファイルへの書き込みを追加してみましょう。</p>
<p>&nbsp;<br />
CSVファイルへ書き込みするプログラムは次のようになります。</p><pre class="crayon-plain-tag">i = 0
item = 1
while True:
    i = i + 1
    sleep(1)
    for elem_h3 in driver.find_elements_by_xpath('//a/h3'):
        elem_a = elem_h3.find_element_by_xpath('..')  
        csvlist = []
        csvlist.append(str(item))
        csvlist.append(elem_h3.text)
        csvlist.append(elem_a.get_attribute('href'))
        writer.writerow(csvlist)
        item = item + 1
    next_link = driver.find_element_by_id('pnnext')
    driver.get(next_link.get_attribute('href'))
    if i &gt; 4:
        break
f.close()</pre><p>
<p>&nbsp;<br />
基本的な流れは前のプログラムと同じになりますので、今回はCSVファイルへの書き込みの箇所に絞って解説します。</p>
<p>&nbsp;<br />
１つずつ順に解説しますと、csvlist = [] では、空のリストを変数csvlistに渡し、初期化しています。これからcsvlistには、ファイル出力する１行の情報を格納し、writerow()に渡して１行ずつ書き込んでいくことになります。</p>
<p>&nbsp;<br />
次に、１つのサイトタイトルとURLの取得が終わりましたら、リスト型の変数csvlistに対して、ファイル出力する１行の情報を格納していきます。</p>
<p>&nbsp;<br />
csvlist.append(str(item))で検索順位を、csvlist.append(elem_h3.text)でサイトタイトルを、csvlist.append(elem_a.get_attribute(&#8216;href&#8217;))でURLを順にcsvlistに対して格納しています。</p>
<p>&nbsp;<br />
そして最後に、writerow()に対してcsvlistを渡して、１行の情報をCSVファイルに書き込んでいます。<br />
またfor文が終わりましたら、f.close()でopen()で開いたファイルオブジェクトを閉じます。</p>
<p>&nbsp;<br />
実行後に出力されたCSVファイルを開けると、<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium31.png" alt="CSVファイルに保存された検索結果の情報" width="975" height="398" class="aligncenter size-full wp-image-4182" /><br />
Googleで検索したサイト毎に、検索順位、タイトル、URLと出力されています。</p>
<p>&nbsp;<br />
このようにして、スクレイピングで取得した情報を後から確認できるよう、CSVファイルの形式で出力し、データを保存することができました。</p>
<p>&nbsp;</p>
<h3>ブラウザを閉じる</h3>
<p>一連の処理が終わりましたら、最後にブラウザを閉じましょう。driver.close()で閉じることができます。</p><pre class="crayon-plain-tag">driver.close()</pre><p>
<p>&nbsp;<br />
このようにして、Seleniumではブラウザを操作して、WEBサイトから必要な情報を取得していきます。</p>
<p>&nbsp;</p>
<h3>全コード掲載</h3>
<p>これまでの「Googleでの検索結果の取得と保存」について、全てのコードを以下に置いておきます。必要に応じて開いてご確認ください。ご参考になれば幸いです。<br />
<div class="su-accordion su-u-trim"></div><div class="su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-spoiler-title" tabindex="0" role="button"><span class="su-spoiler-icon"></span>全コードを表示！</div><div class="su-spoiler-content su-u-clearfix su-u-trim">
</p><pre class="crayon-plain-tag">from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
import csv
import datetime

options = Options()
#以下のコメントアウトを解除すると、ヘッドレスモードが有効になります。
#options.add_argument(&quot;--headless&quot;)
driver = webdriver.Chrome(&quot;C:\Test_Folder\chromedriver_win32\chromedriver&quot;,options=options)
driver.get(&quot;https://www.google.co.jp&quot;)

search_bar = driver.find_element_by_name(&quot;q&quot;)
search_bar.send_keys(&quot;python&quot;)
search_bar.submit()

csv_date = datetime.datetime.today().strftime(&quot;%Y%m%d&quot;)
csv_file_name = &quot;google_python_&quot; + csv_date + &quot;.csv&quot;
f = open(csv_file_name, &quot;w&quot;, encoding=&quot;CP932&quot;, errors=&quot;ignore&quot;)

writer = csv.writer(f, lineterminator=&quot;\n&quot;) 
csv_header = [&quot;検索順位&quot;,&quot;タイトル&quot;,&quot;URL&quot;]
writer.writerow(csv_header)

i = 0
item = 1
while True:
    i = i + 1
    sleep(1)
    for elem_h3 in driver.find_elements_by_xpath(&quot;//a/h3&quot;):
        elem_a = elem_h3.find_element_by_xpath(&quot;..&quot;) 
        print(elem_h3.text)
        print(elem_a.get_attribute(&quot;href&quot;))
        csvlist = []
        csvlist.append(str(item))
        csvlist.append(elem_h3.text)
        csvlist.append(elem_a.get_attribute(&quot;href&quot;))
        writer.writerow(csvlist)
        item = item + 1
    next_link = driver.find_element_by_id(&quot;pnnext&quot;)
    driver.get(next_link.get_attribute(&quot;href&quot;))
    if i &gt; 4:
        break
f.close()</pre><p>
&nbsp;<br />
</div></div>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Seleniumでログインする方法(インスタグラムへのログイン)</h2>
<p>次にSeleniumでパスワード入力を求められるサイトでのログイン方法を確認していきましょう。ここはでは、<a href="https://www.instagram.com" target="_blank" rel="noopener noreferrer">インスタグラム(https://www.instagram.com)</a> にログインします。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium15.png" alt="インスタグラムのログイン画面" width="764" height="594" class="aligncenter size-full wp-image-3979" /></p>
<p>&nbsp;<br />
&nbsp;<br />
インスタグラムの最初の画面では「アカウントをお持ちですか？」と下にメッセージが表示されます。そこで「ログインする」のリンクをクリックします。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium16.png" alt="「ログインする」のリンクをクリックしている" width="616" height="480" class="aligncenter size-full wp-image-3980" /></p>
<p>&nbsp;<br />
&nbsp;<br />
そして次の画面で「電話番号、ユーザーネーム、メールアドレス」と「パスワード」を入力しログインボタンを押します。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium17.png" alt="ログイン画面でパスワードを入力しログインボタンを押す" width="373" height="407" class="aligncenter size-full wp-image-3981" /></p>
<p>&nbsp;<br />
&nbsp;<br />
ログインしたら、最初に以下のような「お知らせをオンにする」を確認するメッセージが表示されるので、「後で」をクリックします。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium18.png" alt="ログイン後に表示されたポップアップ画面を操作し閉じる" width="637" height="445" class="aligncenter size-full wp-image-3982" /></p>
<p>&nbsp;<br />
&nbsp;<br />
するとメイン画面が表示されます。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium19.png" alt="次のページへ遷移しメイン画面が表示された" width="970" height="508" class="aligncenter size-full wp-image-3983" /></p>
<p>&nbsp;<br />
このログインに必要な一連の操作を、Seleniumを使って自動的にしてみましょう。</p>
<p>&nbsp;<br />
ログインに必要なインスタグラムのアカウントをお持ちでない場合は、最初の画面からユーザー登録を事前に行ってください。</p>
<p>&nbsp;<br />
以下の赤で囲った箇所に必要な情報を入力の上、「登録する」ボタンを押すと、ユーザー登録できます。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium20.png" alt="ログインに必要なユーザー登録画面で「登録する」ボタンを押す" width="596" height="516" class="aligncenter size-full wp-image-3984" /></p>
<p>&nbsp;</p>
<h3>ログイン用リンクのクリック</h3>
<p>最初のステップとして、インスタグラムのサイトを表示し、リンク「ログインする」をクリックしましょう。</p>
<p>&nbsp;<br />
コードは次のようになります。</p><pre class="crayon-plain-tag">from selenium import webdriver
from time import sleep
USERNAME = 'インスタグラムのユーザー名'
PASSWORD = 'インスタグラムのパスワード'
driver = webdriver.Chrome('ChromeDriverのディレクトリ + chromedriver')
error_flg = False
target_url = 'https://www.instagram.com'
driver.get(target_url)  
sleep(3)
try:
    login_button = driver.find_element_by_link_text('ログインする')
    login_button.click()
    sleep(3)
except Exception:
    error_flg = True
    print('ログインボタン押下時にエラーが発生しました。')</pre><p>
<p>&nbsp;<br />
プログラムを実行すると、<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium21.png" alt="リンクがクリックされてログイン画面が表示された" width="618" height="336" class="aligncenter size-full wp-image-3986" /><br />
インスタグラムの画面が表示された後「ログインする」のリンクがクリックされ、ログイン画面が表示されました。</p>
<p>&nbsp;<br />
それではコードを詳しく解説していきましょう。<br />
&nbsp;<br />
次の変数USERNAME、PASSWORDには、お持ちのインスタグラムのアカウント情報を入力下さい。この情報を元にログインします。</p>
<div class="graybox">USERNAME = &#8216;インスタグラムのユーザー名&#8217;<br />
PASSWORD = &#8216;インスタグラムのパスワード&#8217;</div>
<p>&nbsp;<br />
また「WebDriverのインストール」の章で説明したように、ChromeDriverを格納したディレクトリとファイル名「chromedriver」を入力してください。</p>
<div class="graybox">driver = webdriver.Chrome(&#8216;ChromeDriverのディレクトリ + chromedriver&#8217;)</div>
<p>&nbsp;<br />
そして読み込んだdriverのメソッドget()を利用して、インスタグラムのサイトを開きます。</p>
<div class="graybox">error_flg = False<br />
target_url = &#8216;https://www.instagram.com&#8217;<br />
driver.get(target_url) </div>
<p>変数error_flgはエラーの判定に使うフラグです。最初はFalseを設定しておきます。<br />
&nbsp;<br />
そして途中でエラーが発生した場合はTrueを設定して、以降の処理をスキップする判定に使います。</p>
<p>&nbsp;<br />
次に「ログインする」のリンクをクリックしています。</p>
<div class="graybox">login_button = driver.find_element_by_link_text(&#8216;ログインする&#8217;)<br />
login_button.click()</div>
<p>リンクはfind_element_by_link_text(‘リンク名’)で該当のリンクを検索し、click()でクリックすることができます。</p>
<p>&nbsp;</p>
<h3>例外処理</h3>
<p>先ほどのコードでは処理全体をtry～exceptで囲っており、try以下の処理でエラーが発生した場合は、except以下の例外処理に移るようにしています。</p>
<div class="graybox">try:<br />
～<br />
except Exception:<br />
&nbsp;&nbsp;&nbsp;&nbsp; error_flg = True<br />
&nbsp;&nbsp;&nbsp;&nbsp; print(&#8216;ログインボタン押下時にエラーが発生しました。&#8217;)</div>
<p>&nbsp;<br />
exceptでの処理は、変数error_flgにTrueを設定し、エラーメッセージをprint()で表示しています。</p>
<p>&nbsp;<br />
また以降の処理では、最初に「if error_flg is False:」と記述し、error_flgがFalseの時（エラーが発生しなかった時）のみ、処理を実行するようにしています。</p>
<p>&nbsp;</p>
<h3>ログイン画面でのユーザーネーム・パスワードの入力</h3>
<p>次に、ログイン画面でユーザーネームとパスワードを入力し、インスタグラムにログインしましょう。</p>
<p>&nbsp;<br />
まずはログイン画面でユーザーネームとパスワードの入力欄の検索方法を確認します。それぞれの入力欄にカーソルが当たっている状態で右クリックし、メニューから「検証」を選択します。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium22.png" alt="ログイン画面でユーザーネームとパスワードの入力欄の要素の取得方法の確認" width="665" height="391" class="aligncenter size-full wp-image-3990" /></p>
<p>&nbsp;<br />
&nbsp;<br />
すると、ユーザーネームとパスワードで次のコードが表示されました。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium23.png" alt="ユーザーネームとパスワードの要素が表示されている" width="454" height="340" class="aligncenter size-full wp-image-3991" /></p>
<p>ここではinputタグの属性aria-labelで検索することができそうです。</p>
<p>&nbsp;<br />
XPathである特定のタグの属性を指定する方法は、次になります。</p>
<div class="graybox">タグ名[@属性=”属性の値”]</div>
<p>&nbsp;<br />
例えば、inputタグの属性aria-labelがパスワードのものを検索するには、</p>
<div class="graybox">input[@aria-label=&#8221;パスワード&#8221;]</div>
<p>と記述します。</p>
<p>&nbsp;<br />
&nbsp;<br />
これらの情報を元に記述したコードは次のようになります。</p><pre class="crayon-plain-tag">if error_flg is False:
    try:
        username_input = driver.find_element_by_xpath('//input[@aria-label=&quot;電話番号、ユーザーネーム、メールアドレス&quot;]')
        username_input.send_keys(USERNAME)
        sleep(1)

        password_input = driver.find_element_by_xpath('//input[@aria-label=&quot;パスワード&quot;]')
        password_input.send_keys(PASSWORD)
        sleep(1)

        username_input.submit()
        sleep(1)
        
    except Exception:
        print('ユーザー名、パスワード入力時にエラーが発生しました。')
        error_flg = True</pre><p>
<p>&nbsp;<br />
プログラムを実行すると、<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium24.png" alt="ログインに成功し次の画面に遷移したがポップアップ画面が表示されている" width="731" height="374" class="aligncenter size-full wp-image-3992" /></p>
<p>&nbsp;<br />
インスタグラムにログインできましたが、ポップアップ画面で「お知らせをオンにする」かの確認メッセージが表示されています。</p>
<p>&nbsp;</p>
<h3>ポップアップ画面を操作し閉じる方法</h3>
<p>次にポップアップ画面で「後で」を選択し、インスタグラムのメイン画面を表示させましょう。</p>
<p>&nbsp;<br />
ここでもまず、「後で」の検索方法を確認します。「後で」にカーソルを当てた状態で右クリックし、メニューから「検証」を選択します。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium25.png" alt="ポップアップ画面を閉じる為に必要な要素の取得方法の確認" width="545" height="365" class="aligncenter size-full wp-image-3994" /></p>
<p>&nbsp;<br />
&nbsp;<br />
すると次のコードが表示されました。<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium26.png" alt="ポップアップ画面を閉じる為に必要な要素の存在が確認できた" width="554" height="112" class="aligncenter size-full wp-image-3995" /></p>
<p>&nbsp;<br />
&nbsp;<br />
buttonタグのテキスト「後で」で検索してみましょう。</p>
<div class="graybox">//button[text()=&#8221;後で&#8221;]</div>
<p>XPathでは、テキストに含まれている文字で検索する場合、text()を使います。</p>
<p>&nbsp;<br />
&nbsp;<br />
最終的にコードは次のようになります。</p><pre class="crayon-plain-tag">if error_flg is False:
    try:
        sleep(1)
        notnow_button = driver.find_element_by_xpath('//button[text()=&quot;後で&quot;]')
        
        sleep(1)
        notnow_button.click()
        sleep(1)
    except Exception:
        pass</pre><p>
<p>&nbsp;<br />
プログラムを実行すると、<br />
&nbsp;<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium27.png" alt="ポップアップ画面が閉じられ、メイン画面が表示された" width="932" height="441" class="aligncenter size-full wp-image-3996" /></p>
<p>&nbsp;<br />
&nbsp;<br />
インスタグラムのメイン画面が表示されました。</p>
<p>&nbsp;<br />
このようにしてパスワードの入力を求められるサイトでも、Seleniumを使って自動的にログインすることができます。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>Seleniumで画面スクロールする方法(インスタグラムで全ての画像を表示)</h2>
<p>インスタグラムでは最初にいくつかの投稿された画像が表示され、画面をスクロールさせるにつれて、次のいくつかの画像が表示されます。</p>
<p>&nbsp;</p>
<p>このようにして、全ての画像を確認するには、何度と画面をスクロールさせる必要があります。この章ではSeleniumで画面をスクロールさせる方法を確認していきましょう。</p>
<p>&nbsp;</p>
<p>ここでは、インスタグラムにログインした後、有名な写真家であるポール・ニックレンさんのページを表示します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium32.png" alt="" width="640" height="390" class="aligncenter size-full wp-image-4209" /><br />
ポール・ニックレンさんは、極圏を中心に野生動物を撮影する写真家です。彼の写真は「ナショナル ジオグラフィック」誌にも掲載され、また数多くの賞も受賞されています。</p>
<p>&nbsp;</p>
<p>ポール・ニックレンさんのページが表示されたら、投稿件数を確認します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium33.png" alt="" width="775" height="294" class="aligncenter size-full wp-image-4210" /></p>
<p>&nbsp;</p>
<p>インスタグラムでは、１行に画像が３つ並んでおり、４行分の12画像が表示されたら、次の画像を読み込んでいるようです。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium34.png" alt="" width="775" height="401" class="aligncenter size-full wp-image-4211" /></p>
<p>&nbsp;</p>
<p>先ほど取得した投稿件数を元に、必要な画面スクロールの回数を計算します。そしてSeleniumで画面をスクロールさせながら、全ての画像を表示させてみましょう。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium35.png" alt="" width="775" height="340" class="aligncenter size-full wp-image-4212" /></p>
<p>&nbsp;</p>
<h3>対象のページを表示</h3>
<p>まずはインスタグラムの検索欄に「paulnicklen」と入力し、ポール・ニックレンさんのページを表示しましょう。</p>
<p>&nbsp;<br />
まずはポール・ニックレンさんのページを表示する方法を確認します。</p>
<p>&nbsp;<br />
検索欄に「paulnicklen」と入力し、表示された検索候補を確認すると、一番上が対象のページのようです。ここを右クリックし、メニューの中から「検証」を選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium36.png" alt="" width="654" height="496" class="aligncenter size-full wp-image-4214" /></p>
<p>&nbsp;</p>
<p>表示されたHTMLの中で、赤色で囲った箇所が対象ページのURLが格納されているようです。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium37.png" alt="" width="770" height="366" class="aligncenter size-full wp-image-4215" /></p>
<p>&nbsp;</p>
<p>また検索欄で表示された検索候補を選択すると、ポール・ニックレンさんのページが表示され、URLは「https://www.instagram.com/paulnicklen/」と表示されています。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium38.png" alt="" width="775" height="476" class="aligncenter size-full wp-image-4217" /></p>
<p>&nbsp;</p>
<p>ということで、対象のページを取得するには、インスタグラムのＵＲＬ「https://www.instagram.com/」に対して、ユーザーＩＤ「paulnicklen/」を付け、「https://www.instagram.com/paulnicklen/」で検索すれば良いようです。</p>
<p>&nbsp;<br />
対象ページを検索するコードは、次のようになります。</p><pre class="crayon-plain-tag">target_username = &quot;paulnicklen&quot;
if error_flg is False:
    try:
        target_profile_url = target_url + '/' + target_username + '/'
        driver.get(target_profile_url)
        sleep(3)

    except Exception:
        print('検索時にエラーが発生しました。')
        error_flg = True</pre><p>
<p>&nbsp;<br />
実行するとポール・ニックレンさんのページが表示されました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium39.png" alt="" width="775" height="409" class="aligncenter size-full wp-image-4218" /></p>
<p>&nbsp;</p>
<h3>投稿件数を取得</h3>
<p>次にポール・ニックレンさんのページで投稿件数を取得し、画面スクロールに必要な回数を計算し、画面スクロールしていきます。</p>
<p>&nbsp;<br />
まずは投稿件数を取得する方法を確認します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium40.png" alt="" width="775" height="294" class="aligncenter size-full wp-image-4222" /></p>
<p>&nbsp;</p>
<p>投稿件数が表示されている箇所にカーソルを当て、右クリックしてメニューを表示します。そして「検証」を選択します。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium41.png" alt="" width="742" height="477" class="aligncenter size-full wp-image-4223" /></p>
<p>&nbsp;</p>
<p>表示されたHTMLから、テキスト「投稿」、もしくは、「件」を元にその間に挿入されている件数「2,033」を取得できそうです。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium42.png" alt="" width="775" height="348" class="aligncenter size-full wp-image-4225" /></p>
<p>&nbsp;<br />
ここではspanタグのテキスト「投稿」で検索します。</p>
<div class="graybox">//span[text()=&#8221;投稿&#8221;]</div>
<p>前出のとおり、XPathではテキストに含まれている文字で検索する場合、text()を使います。</p>
<p>&nbsp;<br />
投稿件数を取得し画面に表示するコードは、次のようになります。</p><pre class="crayon-plain-tag">if error_flg is False:
    try:
        post_count = driver.find_element_by_xpath('//span[text()=&quot;投稿&quot;]').text
        post_count = post_count.replace('件', '').replace('投稿', '').replace(',', '')
        print(&quot;投稿数： &quot; + post_count)
    except Exception:
        print('投稿数が取得できませんでした。')
        error_flg = True</pre><p>
<p>&nbsp;</p>
<p>コードを詳しく解説していきます。</p>
<p>&nbsp;<br />
投稿件数が格納されているテキストの内容を取得し、変数post_countに格納しています。</p>
<div class="graybox">post_count = driver.find_element_by_xpath(&#8216;//span[text()=&#8221;投稿&#8221;]&#8217;).text</div>
<p>&nbsp;<br />
この変数の中には、「投稿2,033件」というテキストが格納されています。この中から数値「2033」だけを抽出しましょう。</p>
<p>&nbsp;<br />
投稿件数の数値以外で含まれている「投稿」・「,」・「件」を取り除くにはreplaceを使います。</p>
<div class="graybox">元の文字列.replace(置き換え対象の文字, 置き換え後の文字)</div>
<p>&nbsp;<br />
ここで置き換え後の文字に&#8221;&#8221;を指定すれば、置き換え対象の文字は元の文字列から消えてなくなります。</p>
<p>&nbsp;<br />
以下が「投稿2,033件」から数値だけを抽出するコードになります。</p>
<div class="graybox">post_count = post_count.replace(&#8216;件&#8217;, &#8221;).replace(&#8216;投稿&#8217;, &#8221;).replace(&#8216;,&#8217;, &#8221;)</div>
<p>このようにreplaceは連続して繋げて記述することもできます。</p>
<p>&nbsp;<br />
最後に取得した投稿件数の数値をprintで画面に表示しています。</p>
<div class="graybox">print(&#8220;投稿数： &#8221; + post_count)</div>
<p>&nbsp;<br />
実行結果は次のようになります。</p>
<div class="yellowbox">投稿件数： 2033</div>
<p>投稿件数2033が表示されました。</p>
<p>&nbsp;</p>
<h3>画面スクロールし全てのページを表示</h3>
<p>次に先ほど取得した投稿件数を元に画面スクロールに必要な回数を計算し、画面スクロールしていきます。</p>
<p>&nbsp;<br />
投稿件数を取得するコードに対して、画面スクロールするコードを追加したものは、次のようになります。</p><pre class="crayon-plain-tag">if error_flg is False:
    try:
        post_count = driver.find_element_by_xpath('//span[text()=&quot;投稿&quot;]').text
        post_count = post_count.replace('件', '').replace('投稿', '').replace(',', '')        
        print(&quot;投稿件数： &quot; + post_count)
        post_count = int(post_count)
        if post_count &gt; 12:
            scroll_count = int(post_count/12) + 1
            try:
                for i in range(scroll_count):
                    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
                    sleep(2)
            except Exception as e:
                error_flg = True
                print(e)
                print('画面スクロール中にエラーが発生しました。')
        sleep(10)
    except Exception:
        print('投稿数が取得できませんでした。')
        error_flg = True</pre><p>
<p>&nbsp;</p>
<p>コードを詳しく解説していきます。</p>
<p>&nbsp;<br />
先ほど取得した投稿件数は変数post_countに格納されていました。これをまずは整数型に変換します。</p>
<div class="graybox">post_count = int(post_count)</div>
<p>&nbsp;<br />
インスタグラムでは１行に画像が３つ並んでおり、４行分の12画像が表示されたら次の画像を読み込んでいます。従って、投稿件数が12を超えたらスクロール回数を計算します。</p>
<div class="graybox">if post_count > 12:</div>
<p>&nbsp;<br />
投稿数を12で割り1を加えて算出したスクロール回数は、変数scroll_countに格納しています。</p>
<div class="graybox">&nbsp;&nbsp;&nbsp;&nbsp; scroll_count = int(post_count/12) + 1</div>
<p>&nbsp;<br />
スクロール回数だけ繰り返し処理を行います。この中で画面スクロールを行います。</p>
<div class="graybox">for i in range(scroll_count):</div>
<p>&nbsp;<br />
Seleniumでは、画面のスクロールはdriver.execute_script()でJavaScript APIを呼び出して実現します。</p>
<div class="graybox">&nbsp;&nbsp;&nbsp;&nbsp; driver.execute_script(&#8216;window.scrollTo(0, document.body.scrollHeight);&#8217;)</div>
<p>&nbsp;</p>
<p>コードを実行すると、画面が次々にスクロールされていくのがわかります。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium43.png" alt="" width="775" height="278" class="aligncenter size-full wp-image-4227" /></p>
<p>&nbsp;</p>
<p>このようにして、取得した投稿件数を元に画面スクロールに必要な回数を計算し、画面スクロールさせることができました。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2 id="bs4">Requests、Beautiful Soupと連携し画像ファイルをダウンロード・保存する方法</h2>
<p>先ほどの章では、Seleniumで有名な写真家ポール・ニックレンさんのインスタグラムのページを表示し、画面をスクロールさせながら、全ての画像を表示しました。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium44.png" alt="" width="769" height="744" class="aligncenter size-full wp-image-4232" /></p>
<p>&nbsp;</p>
<p>この章ではSeleniumと他のスクレイピング用ライブラリRequests、Beautiful Soupを組合せて、これらの表示された画像をパソコンに保存する方法を確認していきましょう。<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium45.png" alt="" width="927" height="428" class="aligncenter size-full wp-image-4233" /></p>
<p>&nbsp;</p>
<h3>Beautiful Soupを使って画像ファイルのリンクを取得</h3>
<p>今まではSeleniumだけを使ってスクレイピングを進めてきました。しかし最初にSeleniumのスクレイピングでの使い方で説明したとおり、Seleniumはブラウザを経由して処理を行うので、処理速度が遅いのが難点です。</p>
<p>&nbsp;<br />
ということで、SeleniumはJava Scriptを利用したページの読み込みやログインなど、Seleniumを使わなければいけないケースのみで利用し、後は別のライブラリを利用する方が望ましいです。</p>
<p>&nbsp;<br />
ここでは画像のリンクの取得について、Beautiful Soupと一緒に利用する方法も確認していきましょう。Beautiful Soupの詳しい説明は、「<a href="https://ai-inter1.com/beautifulsoup_1/" target="_blank" rel="noopener noreferrer">図解！Beautiful SoupでWEBスクレイピング徹底解説！</a>」を参照ください。</p>
<p>&nbsp;<br />
ポール・ニックレンさんのページで表示された画像について、それぞれのリンクを取得していきます。</p>
<p>&nbsp;<br />
前の章で記述しました画面スクロールするコードに対して、Beautiful Soupで画像のリンクを取得するコードを追加したものは、次のようになります。<br />
&nbsp;<br />
追加・変更された箇所の背景色を変えています。</p><pre class="crayon-plain-tag">from bs4 import BeautifulSoup
if error_flg is False:
    try:
        post_count = driver.find_element_by_xpath('//span[text()=&quot;投稿&quot;]').text
        post_count = post_count.replace('件', '').replace('投稿', '').replace(',', '')        
        print(&quot;投稿件数： &quot; + post_count)
        post_count = int(post_count)

        if post_count &gt; 12:
            scroll_count = int(post_count/12) + 1
            try:
                all_images = []
                for i in range(scroll_count):
                    #画像リンクの取得
                    soup = BeautifulSoup(driver.page_source, 'html.parser')
                    for image in soup.find_all('img'):
                        all_images.append(image)
                    #画面スクロール
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
                    sleep(2)

                #取得した画像リンクの確認
                all_images = list(set(all_images))
                for index, image in enumerate(all_images):
                    print(&quot;画像番号: &quot; + str(index))
                    print(&quot;image['src'] = &quot; + image['src'], end = &quot;\n\n&quot;)

            except Exception as e:
                error_flg = True
                print(e)
                print('画面スクロール中にエラーが発生しました。')
        sleep(10)
    except Exception:
        error_flg = True
        print('投稿数が取得できませんでした。')</pre><p>
<p>&nbsp;</p>
<p>コードを詳しく解説していきます。</p>
<p>&nbsp;<br />
まずはBeautifulSoupをインポートします。</p>
<div class="graybox">from bs4 import BeautifulSoup</div>
<p>&nbsp;<br />
空のリストを作成し、変数all_imagesに格納しています。</p>
<div class="graybox">all_images = []</div>
<p>今後、取得した画像のリンクは、この中に格納していきます。</p>
<p>&nbsp;<br />
そして次のコードで画面をスクロールさせながら、画像リンクの取得を行っています。</p>
<div class="graybox">for i in range(scroll_count):<br />
&nbsp;&nbsp;&nbsp;&nbsp; #画像リンクの取得<br />
&nbsp;&nbsp;&nbsp;&nbsp; soup = BeautifulSoup(driver.page_source, &#8216;html.parser&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp; for image in soup.find_all(&#8216;img&#8217;):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all_images.append(image)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #画面スクロール<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driver.execute_script(&#8216;window.scrollTo(0, document.body.scrollHeight);&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(2)</div>
<p>&nbsp;</p>
<p>画像リンクの取得に関するコードについて、さらに詳しく見ていきます。</p>
<p>&nbsp;<br />
page_sourceでは、現在表示しているページのコードをダウンロードすることができます。</p>
<div class="graybox">driver.page_source</div>
<p>&nbsp;<br />
このダウンロードしたコードをBeautifulSoup()を用いて解析します。BeautifulSoup()の記述方法は以下です。</p>
<div class="graybox">BeautifulSoup(解析対象のHTML/XML, 利用するパーサー)</div>
<p>&nbsp;<br />
１つ目の引数には、解析対象のHTML/XMLを渡します。<br />
２つ目の引数として解析に利用するパーサー（解析器）を指定します。</p>
<table>
<tbody>
<tr bgcolor="#7fffd4">
<td align="center" width="20">パーサー</td>
<td align="center" width="20">引数での指定方法</td>
<td align="center" width="60">特徴</td>
</tr>
<tr>
<td width="20">Python’s html.parser</td>
<td width="20">“html.parser”</td>
<td width="60">追加ライブラリが不要</td>
</tr>
<tr>
<td width="20">lxml’s HTML parser</td>
<td width="20">“lxml”</td>
<td width="60">高速に処理可</td>
</tr>
<tr>
<td width="20">lxml’s XML parser</td>
<td width="20">“xml”</td>
<td width="60">XMLに対応し、高速に処理可</td>
</tr>
<tr>
<td width="20">html5lib</td>
<td width="20">“html5lib”</td>
<td width="60">正しくHTML5を処理可</td>
</tr>
</tbody>
</table>
<p>この中でも、今回はPythonの標準ライブラリに入っており、追加でライブラリのインストールが不要なPython’s html.parserを利用します。<br />
&nbsp;</p>
<p>BeautifulSoup()に先ほど取得した現在のページの情報とパーサー&#8221;html.parser&#8221;を渡してあげます。</p>
<div class="graybox">soup = BeautifulSoup(driver.page_source, &#8216;html.parser&#8217;)</div>
<p>&nbsp;<br />
これらの情報を用いてBeautiful SoupではHTMLを解析していきますが、必要な箇所を解析するために、該当箇所を指定、検索する方法がいくつかあります。</p>
<p>&nbsp;<br />
その中の１つがfind_allメソッドになります。</p>
<div class="graybox">find_all(検索するHTMLタグ)</div>
<p>find_all()では、引数に一致する 全ての 要素を取得します。</p>
<p>&nbsp;<br />
HTMLでは画像へのリンクはimgタグに格納されます。ここではfind_all()への引数として’img’を渡し、全てのimgタグの情報を取得しています。</p>
<div class="graybox">for image in soup.find_all(&#8216;img&#8217;):<br />
&nbsp;&nbsp;&nbsp;&nbsp; all_images.append(image)</div>
<p>そして取得した１つ１つのimgタグの情報を、先ほどの変数all_imagesにappend()で格納しています。</p>
<p>&nbsp;<br />
最後にこれらの取得したimgタグの情報を画面に表示しています。</p>
<div class="graybox">#取得した画像リンクの確認<br />
all_images = list(set(all_images))<br />
for index, image in enumerate(all_images):<br />
&nbsp;&nbsp;&nbsp;&nbsp; print(&#8220;画像番号: &#8221; + str(index))<br />
&nbsp;&nbsp;&nbsp;&nbsp; print(&#8220;image[&#8216;src&#8217;] = &#8221; + image[&#8216;src&#8217;], end = &#8220;\n\n&#8221;)</div>
<p>表示する画像ファイルはsrc属性に格納されていますので、この属性の内容を表示しています。</p>
<p>&nbsp;</p>
<p>これらのコードを実行結果は次のようになります。</p>
<div class="yellowbox">投稿件数： 2034<br />
画像番号: 0<br />
image[&#8216;src&#8217;] = https://scontent-nrt1-1.cdninstagram.com/v/t51.12442-15/e15/c78.267.1001.1001a/s150x150/28763943_1983888588605962_9076461727012356096_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram.com&#038;_nc_cat=110&#038;_nc_ohc=FfOntf-v-AAAX8yWzWb&#038;oh=eda4656e99230611435d472b7e022dca&#038;oe=5E2F255A</p>
<p>画像番号: 1<br />
image[&#8216;src&#8217;] = https://scontent-nrt1-1.cdninstagram.com/v/t51.2885-15/e35/c0.248.639.639a/81981387_167465077808057_7132941963051318183_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram.com&#038;_nc_cat=1&#038;_nc_ohc=FBNuWmzPOSwAX9kp3ly&#038;oh=ca38765907c2d4f67bfefa435ae303a1&#038;oe=5E2EF61F</p>
<p>…<br />
…（以下、省略）</p></div>
<p>画像のリンクが順番に表示されています。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h3>Requestsを使って画像ファイルをダウンロード・保存</h3>
<p>先ほどはBeautiful Soupも使い画像のリンクを取得しました。ここでは画像のリンクを元にRequestsを使って画像をダウンロードし、パソコンに保存しましょう。<br />
&nbsp;<br />
Requestsの詳しい説明は、「<a href="https://ai-inter1.com/python-requests/" target="_blank" rel="noopener noreferrer">図解！PythonのRequestsを徹底解説！</a>」を参照ください。</p>
<p>&nbsp;<br />
取得した画像リンクを元に、画像をダウンロード・保存するコードは、次のようになります。</p><pre class="crayon-plain-tag">import requests
import re 
import os
import shutil

path = r&quot;C:\Users\Yoshi\Instagram\photo&quot;

if error_flg is False:
    all_images = list(set(all_images))
    for index, image in enumerate(all_images):
        filename = 'image_' + str(index) + '.jpg'
        image_path = os.path.join(path, filename)
        image_link = image['src']

        #URLのチェック
        URL_PTN = re.compile(r&quot;^(http|https)://&quot;)
        res = URL_PTN.match(image_link)
        if res:
            #画像のダウンロード
            response = requests.get(image_link, stream=True)
            try:
                #画像の保存
                with open(image_path, 'wb') as file:
                    shutil.copyfileobj(response.raw, file)
            except Exception as e:
                print(e)
                print(str(index) + '番目の画像が見つかりませんでした。 ')
                print('画像へのリンク： ' + image_link)</pre><p>
<p>&nbsp;</p>
<p>コードを詳しく解説していきます。</p>
<p>&nbsp;<br />
まずは必要なライブラリをインポートします。</p>
<div class="graybox">import requests<br />
import re<br />
import os<br />
import shutil</div>
<p>それぞれのライブラリについては、後でそのライブラリを使うコードと合わせて解説します。</p>
<p>&nbsp;<br />
画像ファイルの保存するフォルダを指定しています。ご自身のパソコンで好きなフォルダを指定してください。</p>
<div class="graybox">path = r&#8221;C:\Users\Yoshi\Instagram\photo&#8221;</div>
<p>&nbsp;<br />
前の章で取得したimgタグの情報は全て変数all_imagesに格納されています。そして、この内容を順次取り出してfor文で繰り返し処理を行います。</p>
<div class="graybox">all_images = list(set(all_images))<br />
for index, image in enumerate(all_images):</div>
<p>変数indexには画像の順番が、imageにはimageタグの内容が格納されています。</p>
<p>&nbsp;</p>
<p>そしてfor文の繰り返し処理の中では、まず次の処理を行っています。</p>
<p>&nbsp;<br />
最初に事前準備として、以下の情報をそれぞれの変数に格納します。<br />
image_path：パソコンへ保存する際のフルパス（保存先のフォルダへのパス＋ファイル名）<br />
image_link：データを取得する画像のリンク（URL）</p>
<p>&nbsp;<br />
まず変数filenameには画像のファイル名を格納します。</p>
<div class="graybox">filename = &#8216;image_&#8217; + str(index) + &#8216;.jpg&#8217;</div>
<p>&nbsp;<br />
次に画像ファイルの保存するフォルダへのパスとファイル名を合わせたフルパスを、変数image_pathに格納します。</p>
<div class="graybox">image_path = os.path.join(path, filename)</div>
<p>&nbsp;<br />
またimgタグの中からsrc属性の情報を取得し、変数image_linkに格納します。</p>
<div class="graybox">image_link = image[&#8216;src&#8217;]</div>
<p>&nbsp;<br />
さらに取得した画像のリンクが正しいURLの形式になっているかチェックします。<br />
&nbsp;<br />
チェックには正規表現のreモジュールを使い、変数image_linkに格納された文字列の最初の文字が、http://、もしくは https://から始まっているかどうかをチェックしています。</p>
<div class="graybox">#URLのチェック<br />
URL_PTN = re.compile(r&#8221;^(http|https)://&#8221;)<br />
res = URL_PTN.match(image_link)</div>
<p>&nbsp;<br />
そして正しいURLの形式になっている場合のみ、以降の画像のダウンロード処理へと続けていきます。</p>
<div class="graybox">if res:<br />
&nbsp;&nbsp;&nbsp;&nbsp; #画像のダウンロード</div>
<p>&nbsp;<br />
正規表現の詳しい説明は、「<a href="https://ai-inter1.com/python-regex/" target="_blank" rel="noopener noreferrer">図解！Python 正規表現の徹底解説！</a>」を参照ください。</p>
<p>&nbsp;<br />
&nbsp;<br />
これで事前準備は終わりました。次にこれらの情報を元に画像を取得します。</p>
<p>&nbsp;<br />
画像のダウンロードのコードは次になります。</p>
<div class="graybox">#画像のダウンロード<br />
response = requests.get(image_link, stream=True)</div>
<p>&nbsp;<br />
画像のダウンロードにはライブラリRequestsを使います。事前にインストールも必要になりますので、Requestsの記事をご確認ください。<br />
<a href="https://ai-inter1.com/python-requests/" target="_blank" rel="noopener noreferrer">>> 図解！PythonのRequestsを徹底解説！</a></p>
<p>&nbsp;<br />
requestsにはいくつかメソッドがありますが、ここではサーバから情報を取得するのに使用するget()を使います。</p>
<p>&nbsp;<br />
requests.get()の記述方法は次のとおりです。</p>
<div class="graybox">response = requests.get(URL, その他任意の引数)</div>
<p>引数として取得元のURL、その他の任意の引数を渡します。ここでは任意の引数の１つstreamにTrueを渡し、イテレータで結果を取得しています。<br />
&nbsp;<br />
サーバから返ってきたレスポンスは、responseオブジェクトの属性で確認することができます。</p>
<p>&nbsp;<br />
画像のダウンロードが終わりましたら、画像を指定したフォルダに保存します。</p>
<div class="graybox">#画像の保存<br />
with open(image_path, &#8216;wb&#8217;) as file:<br />
&nbsp;&nbsp;&nbsp;&nbsp; shutil.copyfileobj(response.raw, file)</div>
<p>&nbsp;<br />
書き込み用のバイナリモードでファイルをオープンします。ファイルが無ければ新規作成されます。</p>
<div class="graybox">with open(image_path, &#8216;wb&#8217;) as file:</div>
<p>書き込み先は変数image_pathで指定した場所になります。</p>
<p>&nbsp;<br />
response.rawには、先ほどrequests.get()で取得した画像データが入っています。そしてshutil.copyfileobj()でresponse.rawの内容をオープンしたファイルへコピーし格納します。</p>
<div class="graybox">shutil.copyfileobj(response.raw, file)</div>
<p>&nbsp;</p>
<p>上記のコードを実行すると、<br />
<img decoding="async" src="https://ai-inter1.com/wp-content/uploads/2020/01/python-selenium46.png" alt="" width="926" height="428" class="aligncenter size-full wp-image-4238" /><br />
画像が指定されたフォルダに格納されているのがわかります。</p>
<p>&nbsp;</p>
<p>このようにして、インスタグラムから取得した画像ファイルをパソコンのフォルダに格納することができました。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><span class="sankou"><span style="font-size:150%">関連記事です。</span></span><br />
Pythonを使ったスクレイピングについての詳細は、こちらをご覧ください。<br />
<div class="linkcard"><div class="lkc-internal-wrap"><a class="lkc-link no_icon" href="https://ai-inter1.com/python-webscraping" target="_blank"><div class="lkc-card"><div class="lkc-info"><img decoding="async" class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=ai-inter1.com" alt="" width="16" height="16" /><div class="lkc-domain">ビジPy</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img decoding="async" class="lkc-thumbnail-img" src="//ai-inter1.com/wp-content/uploads/2020/02/twitter-292994_960_720-150x150.jpg" width="100px" height="108px" alt="" /></figure><div class="lkc-title">図解！PythonでWEB スクレイピングを始めよう！(サンプルコード付きチュートリアル)</div><div class="lkc-url" title="https://ai-inter1.com/python-webscraping">https://ai-inter1.com/python-webscraping</div><div class="lkc-excerpt">Python3におけるWEBスクレイピングのやり方について初心者向けに解説した記事です。&nbsp;Requests、Beautiful Soup、Selenium、Pandas、newspaper3kなどの基本的なライブラリの使い方を、サンプルコード付きのチュートリアル形式で、具体的な例を用いて解説していきます。&nbsp;またこれらのライブラリについて、もし動画教材で体系的に学ばれたい方は、以下の割引クーポンをご利用いただければと思います。クリックすると自動的に適用されます。期間限定になりますのでお早めに。&gt;&gt; 「Pythonによるビジネスに役立つWebスクレイ...</div></div><div class="clear">
							</div>
						</div></a></div></div>
<p>&nbsp;<br />
&nbsp;</p>
<p>Copyright &copy; 2026 <a href="https://ai-inter1.com">ビジPy</a> All Rights Reserved.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ai-inter1.com/python-selenium/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
