フラベアーのワンマンカンパニー(仮)(倒産済み)

コミュ障(重度)プログラマがどうやって一人で金儲けするか試行錯誤を報告していたブログ。アフィ、ネット副業ブログは死すべし

即興「D〇daをハックせよ」仮完了

こんばんは、人と一時間近く喋っただけで頭痛がする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(パスワード)を
作成するようにお願いします

タイトルの通り仮完成なので時間があれば
色々機能を追加しようと思っています。