概要
Webスクレイピングをする際に、ページ内でjavascriptを実行したい時がある。
WebページでjQuery等のライブラリを使っている場合は、そのライブラリを利用してDOM操作が簡単に行えるが、ライブラリを利用していないページでは、素のjavascriptを実行してDOM操作を行わなければならない。
…それは面倒だという人向けの記事。
方法
以下のjavascriptをWebスクレイピングしたいページで実行すればOK!
function jquery_exe(){
/*
ここに実行したい処理をかく!!!
*/
};
function require(uri) {
var js = document.createElement("script");
js.type = "text/javascript";
js.src = uri + "?v=" + new Date().getTime().toString();
var head = document.getElementsByTagName("head")[0];
head.appendChild(js);
};
require("https://code.jquery.com/jquery-3.4.1.js");
setTimeout(jquery_exe, 1000);
Python3での実装(サンプルコード)
# -*- coding: utf8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_webdriver = './driver/chromedriver.exe'
options = Options()
options.add_argument('--headless')
# webスクレイング対象url
url = ''
# 実行したいスクリプト
java_script = '\
function jquery_exe(){\
/*\
ここに実行したい処理をかく!!!\
*/\
};\
function require(uri) {\
var js = document.createElement("script");\
js.type = "text/javascript";\
js.src = uri + "?v=" + new Date().getTime().toString();\
var head = document.getElementsByTagName("head")[0];\
head.appendChild(js);\
};\
require("http://code.jquery.com/jquery-3.4.1.js");\
setTimeout(jquery_exe, 1000);\
'
driver = webdriver.Chrome(executable_path="{0}".format(chrome_webdriver), options=options)
# スクレイピング対象ページを開く
driver.get(url)
# スクリプト実行
driver.execute_script(java_script)
# キャプチャを取得
driver.set_window_size(1280, 1400)
capture_img_name = './{0}.png'.format('Capture')
driver.save_screenshot(capture_img_name)
driver.quit()
サンプルコードを元に、以下のjavascriptを某HPで実行してみる
$("body > h1").html("<ruby>阿部<rt>あべ</rt></ruby> <ruby>寛<rt>ひろし</rt></ruby>のホームページ");
結果
jQueryのコードで、しっかりとルビを振ることが出来た。
参考
https://petitviolet.hatenablog.com/entry/20130418/1366288852
http://abehiroshi.la.coocan.jp/top.htm