powershell web crawling / powershell variable uft8 encoding
์ต๊ทผ์ windows์ powershell์ ์ด์ฉํด์ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ ์ผ์ด ์์๋ค.
์๋์ผ๋ก ์น ํ์ด์ง์ ํน์ ํค์๋๋ฅผ ๊ฒ์ํด์ ํน์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ํ๋ก๊ทธ๋จ์ธ๋ฐ ์ฌ์ฉํ ์ปดํจํฐ์ ์ฌ์์ python ํ๋ก๊ทธ๋จ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ๋ถ๋ด์ค๋ฝ๊ณ ์๋ ์งง๊ณ ๊ฐ๋จํ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ ๊ฒ์ด๊ธฐ์ ์คํฌ๋ฆฝํธ๋ก ์ถฉ๋ถํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋๋ ๋์ถฉ ์๋์ ๊ฐ๋ค.
# power shell
# variable section
$KEY_WORD1="๊ฒ์ํ ํค์๋"
$KEY_WORD2="๊ฒ์ํ ํค์๋2"
$KEY_WORD1_URL="https://search.naver.com/search.naver?query=$KEY_WORD1"
$KEY_WORD2_URL="https://search.naver.com/search.naver?query=$KEY_WORD2"
$PROGRAM_NAME="iexplore"
$WAITTING_TIME=10 #sec
$LOOP_COUNT=2
For ($i=1; $i -le $LOOP_COUNT; $i++) { # loop
$ie=New-Object -COM 'InternetExplorer.Application'; # create ie application object
$ie.visible=$true; # show visual
$ie.navigate("https://www.naver.com");
$sText=$ie.Document.getElementByID("query");
$sText.Value=$KEY_WORD1;
while ($ie.Busy -eq $true) {Start-Sleep -seconds 1;}
$sform=$ie.Document.getElementByID("sform");
$sform.submit();
$ie.navigate($KEY_WORD1_URL); # open first tab
$ie.navigate($KEY_WORD2_URL, 0x1000); # create new tab
while ($ie.Busy -eq $true) {Start-Sleep -seconds 1;}
get-Process iexplore | stop-Process; # kill ie process
sleep 1; # sleep after ie process
}
๊ฒ์์ฐฝ์ ํน์ ํค์๋๋ฅผ ๋ฃ์ด์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ์๊ฐํด ๋ณผ ์ ์๋ค.
1. DOM(Document Object Model)์ ์ง์ ์กฐ์ํด ๊ฒ์์ฐฝ์ value๋ฅผ ์์ ํด์ form ํ๊ทธ ์ ์ถ(submit).
2. form์ด ์ ์ถ๋์์ ๋, ์ด๋๋๋ url์ query์ ์ํ๋ ํค์๋๋ฅผ ๋ฃ์ url์ ์ง์ ์์ฒญ.
์ ์ฝ๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ฌ์ฉํด ๋ณธ ๊ฒ์ด๋ค.
1๋ฒ ๋ฐฉ์์ ๊ฒฝ์ฐ, javascript์์ DOM์ ์กฐ์ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๊ธฐ์ ์น ํ์ด์ง ์์ฑ ๊ฒฝํ์ด ์๋ค๋ฉด ์ฝ๊ฒ ๋ฐ๋ผ ํ ์ ์์ ๊ฒ์ด๋ค.
์ ๊ณต์๋ฌธ์์ html ์์ฑ์ ๋ฐ๋ผ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ค์ ํ์ธํ ์ ์์๋ค.
2๋ฒ ๋ฐฉ์์ ๊ฒฝ์ฐ ํด๋น ์ฌ์ดํธ์ html์ ์ ํด์ํด์ ํ์ํ query๊ฐ ๋ฌด์์ธ์ง ํ๋จํด์ผํ๋ค.
powershell์ "navigate" ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ฐ๋ก url์ ์ด ์๊ฐ ์์๋ค.
$ie=New-Object -COM 'InternetExplorer.Application'; # create ie application object
$ie.visible=$true; # show visual
$ie.navigate($KEY_WORD1_URL); # open first tab
$ie.navigate($KEY_WORD2_URL, 0x1000); # create new tab
๋ณ์ $ie์๋ ์น ๋ธ๋ผ์ฐ์ ์ธ internet exlporer๋ฅผ ๋ฃ์ด์ฃผ์๋ค. ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ปดํจํฐ๊ฐ ๊ตฌํ์ด๋ผ์ ie ๋ธ๋ผ์ฐ์ ๋ง ์์๊ธฐ ๋๋ฌธ...
visible์ ๋ด์ฅ ๋ณ์์ธ $true๋ก ์ค์ ํด์ฃผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฆด ๋ ์๊ฐํํด์ค๋ค. ๋ง์ฝ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด (flase) url์ ์์ฒญํ๊ธด ํ์ง๋ง ๋์ ๋ณด์ด์ง๋ ์๋๋ค.
navigate ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ ์ผ์ ธ ์๋ ๋ธ๋ผ์ฐ์ ์ ์ ํญ์ ์ด์ด์ url์ ์์ฒญํ๋ค.
๋ง์ฝ ๊ธฐ์กด ํญ์ด ์๋๋ผ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ผ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
Start-Process "์ํ๋ url" # default browser process ์คํ
[system.Diagnostics.Process]::Start("chrome","์ํ๋ url") # ์ chrome์์ url ์ด๊ธฐ
๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ url์ ์์ฒญํ๊ณ ์ถ๋ค๋ฉด ์์ ๊ฐ์ด ์ ๋ ฅํ๋ฉด ๋๋ค.
PowerShell ํ๊ธ ๋ณ์ ์ค๋ฅ
# variable section
$KEY_WORD1="๊ฒ์ํ ํค์๋"
$KEY_WORD2="๊ฒ์ํ ํค์๋2"
ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๋ฉด์ ํ๊ธ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋, ์ธ์ฝ๋ฉ์ด ๊นจ์ง๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
์๋ฅผ ๋ค์ด ๋ค์ด๋ฒ ๊ฒ์์ฐฝ์ $KEY_WORD1์ด๋ผ๋ ๋ณ์์ "์๋ ํ์ธ์" ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ๋ค์ด๋ฒ ๊ฒ์์ฐฝ์ ํด๋น ๋ณ์๋ฅผ ๊ธฐ์ ํ๊ฒ ํ์ ๋ "?๋๋ทํํด?ํฌ์ค?"์ฒ๋ผ ๋๋ ๊ฒ์ ๋งํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, windows์ ์ ์ฅ๋ powershell ํ์ผ(. ps1 ํ์ผ)์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ "uft8(bom)"์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฒ.
ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ mac ํ๊ฒฝ์์ ์์ฑํ๊ณ ํ ์คํธ๋ฅผ windows์์ ํ๋ค๋ ๊ฒ์ด ๋ฌธ์ ์์๋ค.
๋ถ๋ช utf8 ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ ์ ์ฅํ๋๋ฐ ์ ์ ๋๋ ๊ฑฐ์ง?๋ผ๊ณ ์๊ฐํ๋ฉฐ ์คํ ์ค๋ฒ ํ๋ก์ฐ๋ฅผ ์ฑํ๊ฒ ๋ค์ก์ง๋ง ๋ช ํํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๋ค. ๋์ ๋น์ทํ ์ง๋ฌธ์ด ๋ช ๊ฐ ์์์ง๋ง ์ ํํ ํด๊ฒฐ์ฑ ์ ์์์๋ค.
์ผ๋จ ์ด ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ค๋ฉด BOM(Byte Order Mark)์ ๋ํด์ ์์์ผ ํ๋๋ฐ, ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด ์ปดํจํฐ๊ฐ ํด๋น ํ์ผ์ด ์ด๋ ํ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ์ง๋ ์๊ธฐ ์ํด์ ํ์ผ ๊ฐ์ฅ ์๋ถ๋ถ์ "๋งค์ง๋๋ฒ"๋ผ๋ ์ซ์๋ฅผ ์ ๋ ฅํ๋ ๊ฒ์ด๋ค.
์ปดํจํฐ๋ ํด๋น ํ์ผ์ ์ฝ์ ๋, ๋จผ์ ๋งค์ง๋๋ฒ๋ฅผ ์ฝ์ด ๋ค์ฌ uft8์ธ์ง utf16์ธ์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ค. ์กฐ๊ธ ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ์ํค๋ฐฑ๊ณผ๋ฅผ ์ฐธ๊ณ ...
https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8_%EC%88%9C%EC%84%9C_%ED%91%9C%EC%8B%9D
์ต๊ทผ์๋ utf8์ ๊ฒฝ์ฐ ์ด ๋งค์ง๋๋ฒ๋ฅผ ์๊ฐํ๋ค๊ณ ํ๋ค. ๋ด๊ฐ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ ํ๊ฒฝ์ mac์ด์๊ธฐ์ ์ด BOM์ ์๋ต๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, windows์ ๋ช๋ช ํ๋ก๊ทธ๋จ์ด ์์ง ์ด BOM์ ์๋ตํ์ง ์๋๋ค๊ณ ํ๋ค. ๋ํ์ ์ผ๋ก txt ํ์ผ์ธ๋ฐ powershell script ํ์ผ์ธ ps1ํ์ผ๋ ์ฌ์ค์ txt์ด๊ธฐ ๋๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ํํ ์๊ธฐ ์ํด์ BOM์ด ํ์ํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋จ์ํ utf8์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ utf8 with bom ๋ฐฉ์์ธ uft8(bom)์ผ๋ก ์ ์ฅํด ์ฃผ์ด์ผ ํ๋ค.
ํน์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๋ฒ์ ๋ํด์ ๋ชจ๋ฅด๋ ์ฌ๋์ด ์์ ์ ์๊ธฐ์ ์ ์ฅ ๋ฐฉ๋ฒ์ ๋ํด์ ๊ฐ๋ตํ ์๊ฐํ์๋ฉด
ํ์ผ ์ผ์ชฝ ์๋จ "ํ์ผ -> ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ฅ -> ๋งจ ์๋ ์ธ์ฝ๋ฉ ํญ ํด๋ฆญ -> uft8(bom) ์ ํ -> ์ ์ฅ" ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ฉด ๋๋ค.
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ด์ฌํ ๊ตฌ๊ธ๋ง ํ์ฌ ์์๋๋ ๋ฐฉ๋ฒ๋ค์ ์๋์ ๊ฐ์๋ค.
[System.Text.Encoding]::UTF8;
$env:LC_ALL='C.UTF-8';
๋ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ ์ด์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ด ํด๊ฒฐ์ด ๋์ง๋ ์์๋ค... ์ด๋ฏธ UTF8 ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ์ง๋ง, BOM์ด ์์ด์ ์๊ฒผ๋ ๋ฌธ์ ์๊ธฐ์...
ํ์ง๋ง ๊ทธ์ค์ ์ฌ๋ฏธ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋๋ฐ ๋ฐ๋ก uft8๋ก ์ธ์ฝ๋ฉ ๋์ด์๋ text๋ฅผ ์ฝ์ด์ ๋ณ์์ ์ ์ฅํ๋ฉด ๋ฌธ์ ์์ด ํด๊ฒฐํ ์ ์์๋ค.
$KEY_WORD1=get-content -encoding utf8 "var1.txt";
$KEY_WORD2=get-content -encoding utf8 "var2.txt";
์คํฌ๋ฆฝํธ์ ๋์ผํ ํด๋์ "var1.txt"๋ผ๋ ํ์ผ์ ๋ณ์์ ์ ์ฅํ ๋ฌธ์์ด์ ๊ธฐ์ ํด ๋์ผ๋ฉด ์ธ์ฝ๋ฉ์ด ๊นจ์ง์ง ์๊ณ ๋ณ์์ ์ ์ ์ฅ๋๋ค.
๋ฌผ๋ก , var1.txt ํ์ผ๋ utf8 ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ ์ฅ๋์ด์์ด์ผ ํ๋ค. with BOM ๋ฐฉ์์ด ์๋์๋ ํด๋น ๊ฒฝ์ฐ๋ ์ ๋์ํ๋ ๊ฒ์ windows ์์ฒด๊ฐ txt ํ์ผ์ uft8๋ก ์ ์ฅํ ๋ BOM์ ํฌํจ์ํค๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ๋ค.
๊ต์ฅํ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ ๋ฌธ์ด์์ง๋ง, ์ฒ์์ผ๋ก powershell๋ ์ฌ์ฉํด๋ณด๊ณ ์๋ฌ๋ ๊ฒช์ด๋ณด๋ฉด์ windows์ mac์ ์ฐจ์ด, utf8 ์ธ์ฝ๋ฉ๊ณผ BOM์ ๋ํด์ ์กฐ๊ธ ์์ธํ ์์๋ณผ ์ ์์๋ ์๊ฐ์ด ๋ ๊ฒ ๊ฐ๋ค.
์คํ์ค๋ฒํ๋ก์ฐ์ ์์ ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ๋ชปํ ์ธ๋ ์น๊ตฌ๊ฐ ์์๋๋ฐ ๋ค์ ๊ทธ ์ง๋ฌธ์ ์ฐพ๊ฒ ๋๋ค๋ฉด ๋ต๋ณํด์ฃผ๋ ๊ฑธ๋ก...