こんばんは、人と一時間近く喋っただけで頭痛がするFlaxBearです。
今回は、前回書いた即興「D〇daをハックせよ」のプログラムが
一応完成したので書こうかと思います。
まず、最初に即興「D〇daをハックせよ」のプログラムから
紹介していこうと思います。
const puppteer = require("puppeteer");
require('dotenv').config();
const {createObjectCsvWriter} = require('csv-writer');
// ===== 設定 =====
/** Headlessモードの設定 */
const target_headless = true;
/** 対象のページURL*/
const target_page = 'https://doda.jp/dcfront/login/login/?url=/index.html';
/** ページを閉じるかの設定*/
const close_page = true;
// ===== 設定終了 =====
const getOfferList = async (browser, url, state) => {
// 新しいタブを開く
const childPage = await browser.newPage();
// urlを指定してページ遷移
await childPage.goto(url, {waitUntil: 'load'});
// span.company要素にある内容を全て取得
const get_offer_list = await childPage.evaluate(() =>
Array.from(document.querySelectorAll('span.company'))
.map(span => span.textContent)
);
// offer_listにまとめる
// 複数ある場合countの個数を上げる
var offer_list = [];
for(company of get_offer_list) {
tmp = company.trim();
if(offer_list.some(array => array.company_name === tmp)) {
for(temp of offer_list) {
if(temp["company_name"] == tmp) {
temp["count"]++;
}
}
} else {
offer_list.push({"company_name": tmp, "count": 1});
}
}
// CSV書き込み
const csvfilepath = __dirname + '/offer_list' + state + '.csv';
const csvWriter = createObjectCsvWriter({
path: csvfilepath,
header: [
'company_name','count'
],
encoding:'utf8',
append: false,
});
csvWriter.writeRecords(offer_list)
.then(() => {
console.log('OK');
});
}
(async () => {
// ===== 事前設定 =====
// Puppeteerの起動
const browser = await puppteer.launch({
headless: target_headless, // Headlessモードで起動するか(PDF出力の場合は,true)
slowMo: 50, // 指定のミリ秒スローモーションで実行する
});
// 新しい空のページを開く
const page = await browser.newPage();
// view Postの設定
await page.setViewport({
width: 1200,
height: 800,
});
// 対象のページを開く
//await page.goto(target_page);
await page.goto(target_page, {waitUntil: 'domcontentloaded'});
// ===== 事前設定終了 ======
// 処理開始
// ログインに必要な情報を取得
const mail = process.env.DODA_MAIL;
const password = process.env.DODA_PASS;
// ログイン
await page.type('input[name=mailAddress]', mail);
await page.type('input[name=password]', password);
await page.waitFor(1000);
await page.click('input[name=doLogin]');
// ページ遷移後、js関係でずっと読み込みを行っているみたいでpage.waitForNavigationが効かないため
await page.waitFor(5000);
// a.hrefのurlを取得
const page_list = await page.evaluate(() =>
Array.from(document.querySelectorAll('ul.asideMunu01 li.last dl dd.scoutUtilizing a'))
.map(a => a.href)
);
// リストを取得
var state = 1;
for (get_page of page_list) {
await page.waitFor(1000);
await getOfferList(browser, get_page, state);
state++;
}
// close_pageがtrueならブラウザを閉じる
if(close_page === true) {
await browser.close();
}
})();
処理の内容を簡単に説明すると、
ログインして別タブで各オファーページに開いて、
会社名を取得してCSVに出力していく流れです。
使用には同じ階層に.envファイルを作成し、
DODA_MAIL(メールアドレス)とDODA_PASS(パスワード)を
作成するようにお願いします
タイトルの通り仮完成なので時間があれば
色々機能を追加しようと思っています。