<?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>Python | きいちログ</title>
	<atom:link href="https://wptech.kiichiro.work/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://wptech.kiichiro.work</link>
	<description>WordPressとかAWSとかPHPとか</description>
	<lastBuildDate>Mon, 12 Dec 2022 09:12:07 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>BeautifulSoupとSeleniumのあわせ技でスクレイピングする</title>
		<link>https://wptech.kiichiro.work/2xch5zq3e9/</link>
		
		<dc:creator><![CDATA[むらおか]]></dc:creator>
		<pubDate>Sun, 21 Mar 2021 07:56:59 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<guid isPermaLink="false">http://13.115.157.198/?p=156</guid>

					<description><![CDATA[Pythonでスクレイピングを行う際は、BeautifulSoupを利用するのが一般的かと思われます。使い方もDOMをセレクタで取得して解析するような感じですので、難易度もそこまで高くありません。 Seleniumはブラ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Pythonでスクレイピングを行う際は、BeautifulSoupを利用するのが一般的かと思われます。<br>使い方もDOMをセレクタで取得して解析するような感じですので、難易度もそこまで高くありません。</p>



<p>Seleniumはブラウザのレンダリングまでを考慮しているので、JavaScriptのによる遅延読み込み後のDOMをダウンロードすることができます。</p>



<p>スクレイピングをするのであれば、BeautifulSoupとSeleniumを組み合わせて実施すると幸せになれる、というお話です。</p>



<span id="more-156"></span>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">やろうとしたこと</a></li><li><a href="#toc2" tabindex="0">BeautifulSoupで取得してみる</a></li><li><a href="#toc3" tabindex="0">Seleniumも使ってみる</a></li><li><a href="#toc4" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">やろうとしたこと</span></h2>



<p>ことの発端は、「WordPressの公式リポジトリに登録されているプラグインのダウンロード数を日時で集計したい」という要望で、とりあえず該当ページを開いて値を取ってくれば良いという単純なものでした。</p>



<p>Advanced View の DOWNLOADS HISTORY というテーブルから拾ってくれば良さそうですね。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://wptech.kiichiro.work/wp-content/uploads/2021/03/f94641aee58b3987a74a510cada67842-1024x340.png" alt="Downloads history"/></figure>



<p>HTMLは以下のような感じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-html" data-lang="HTML"><code>&lt;table id=&quot;plugin-download-history-stats&quot; class=&quot;download-history-stats&quot;&gt;
		&lt;tbody&gt;
            &lt;tr&gt;
                &lt;th scope=&quot;row&quot;&gt;Today&lt;/th&gt;
                &lt;td&gt;100&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;th scope=&quot;row&quot;&gt;Yesterday&lt;/th&gt;
                &lt;td&gt;200&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;th scope=&quot;row&quot;&gt;Last 7 Days&lt;/th&gt;
                &lt;td&gt;300&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;th scope=&quot;row&quot;&gt;All Time&lt;/th&gt;
                &lt;td&gt;1000&lt;/td&gt;  &lt;!-- 主にこの数値がほしい --&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;
&lt;/table&gt;</code></pre></div>



<h2 class="wp-block-heading"><span id="toc2">BeautifulSoupで取得してみる</span></h2>



<p>とりあえず、BeautifulSoupだけで取得してみます。</p>



<p>まずは必要なライブラリのインストール。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>$ pip install requests
$ pip install beautifulsoup4</code></pre></div>



<p>書いたコードは↓こんな感じ。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="plugin-download-rate.py" data-lang="Python"><code>import requests
from bs4 import BeautifulSoup

load_url = &#39;https://wordpress.org/plugins/{プラグインのslug}/advanced/&#39;
html = requests.get(load_url)
soup = BeautifulSoup(html.content, &#39;html.parser&#39;)
print(soup.select(&#39;table#plugin-download-history-stats&#39;))</code></pre></div>



<p>実行した結果はというと。。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>$ python plugin-download-rate-bs.py
[&lt;table class=&quot;download-history-stats&quot; id=&quot;plugin-download-history-stats&quot;&gt;
&lt;tbody&gt;&lt;/tbody&gt;
&lt;/table&gt;]</code></pre></div>



<p>該当のテーブルが取得できていませんね。<br>どうやら該当のテーブルのtbodyは遅延読み込みとなっているようで、requestsでは取得できないようでした。</p>



<h2 class="wp-block-heading"><span id="toc3">Seleniumも使ってみる</span></h2>



<p>最初期はテスティングフレームワークとして開発されたSeleniumですが、現在ではブラウザ操作を自動化するツールとして、Webサイトのクローリングなどに利用されています。</p>



<p>今回はSeleniumを使ってスクレイピングを行っていきます。</p>



<p>まずはSeleniumとWebDriver (今回はChrome) をインストールします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>$ pip install selenium
$ pip install chromedriver-binary={Chromeのバージョン}</code></pre></div>



<p>※WebDriverはChromeのバージョンと合わせる必要があります。</p>



<p>書いたコードは↓。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="plugin-download-rate-selenium.py" data-lang="Python"><code>import chromedriver_binary
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opts = Options()
opts.headless = True
driver = webdriver.Chrome(options=opts)

load_url = &#39;https://wordpress.org/plugins/{プラグインのslug}/advanced/&#39;
driver.get(load_url)

html = driver.page_source.encode(&#39;utf-8&#39;)
soup = BeautifulSoup(html, &#39;html.parser&#39;)
print(soup.select(&#39;table#plugin-download-history-stats&#39;))

driver.quit()</code></pre></div>



<p>requestsの代わりにwebdriverで対象のURLにアクセスしています。<br>headlessモードはFalseでもOKなはず。</p>



<p>実行結果は。。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>$ python3 plugin-download-rate-bs.py
[&lt;table class=&quot;download-history-stats&quot; id=&quot;plugin-download-history-stats&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Today&lt;/th&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Yesterday&lt;/th&gt;&lt;td&gt;200&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Last 7 Days&lt;/th&gt;&lt;td&gt;300&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;All Time&lt;/th&gt;&lt;td&gt;400&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;]</code></pre></div>



<p>狙ったDOMが取得できていますね。</p>



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



<p>Seleniumをスクレイピングに利用すると捗ることがわかりました。<br>今回はheadlessモードでやりましたがブラウザモードで実行すれば実行中の画面を閲覧できるので、どこで失敗したかの追跡も比較的やりやすいかと思います。</p>



<p>ただし、Seleniumを利用した場合は実行に時間がかかることが多いため、なんでもかんでもSeleniumにするのは回避した方が良いかもしれません。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
