๋๋ ๋ฉ๋ก ์ฐจํธ๋ฅผ ๊ฝค๋ ์์ฃผ ํ์ธํ๋ ํธ์ด๋ค. ์ค๋์ ์ด๋ค ๊ฐ์๊ฐ ์๋์ง, ์ด๋ค ๋ ธ๋๊ฐ ์ด๋ค ์์์ธ์ง ์ฐจํธ๋ฅผ ๋ณด๊ธฐ ์ํด ๋ฉ๋ก ์ฑ์ ์คํํ๋ฉด ๋ฉ๋ก ์ ๊ฒฐ์ ํ๋ผ๋ ์๋ฆผ, ๊ฐ์ข ๊ด๊ณ ๋ค์ ๋ซ๊ณ ์ฐจํธ๋ฅผ ๋ด์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐจํธ์๋ ๊ฒ์ ๊ธฐ๋ฅ๊ณผ ํํฐ๊ฐ ์์ผ๋ฉฐ ์ํฐ์คํธ ๋ณ๋ก ๋ถ๋ฆฌํด์ ๋ณผ ์ ์๋ค๋ ์ ์ด ๊ฝค๋ ๋ถํธํ๊ฒ ๋๊ปด์ก๋ค. ๊ทธ๋์ ๊ฒฐ๊ตญ ์ง์ ๋ฉ๋ก ์ฐจํธ๋ฅผ ํ์ฑํ์ฌ ๋ฉ๋ก ์ฐจํธ๋ฅผ ๋ด ๋ง๋๋ก ๋ชจ์๋ณผ ์ ์๋ ์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ธฐ๋ก ํ์๋ค.
๋ด๊ฐ ํ์ฑํ ์ฌ์ดํธ์ธ ๋ฉ๋ก ์ฐจํธ ํ์ด์ง๋ฅผ ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ๋ฏ์ด๋ณด๊ฒ ๋๋ฉด, <table> ์์ 50์๊น์ง๋ lst50์ด๋ผ๋ <tr>์ด, 50์๋ถํฐ 100์๊น์ง๋ lst100์ด๋ผ๋ <tr>์ด ๊ณ์ ๋ฐ๋ณต๋๋ ํ์์ด๋ค. ์ด tr ์์ span, img๋ค์ด ๋ค ๋ค์ด๊ฐ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ table ์์ ์๋ span๋ค์ ๋ชจ๋ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
foreach($tables as $table){
foreach($classes as $class){
$trs = $xpath->query(".//tr[contains(@class,'$class')]", $table);
foreach($trs as $tr){
$wraps = $xpath->query(".//td//div[contains(@class,'wrap_song_info')]", $tr);
foreach($wraps as $wrap){
$artistNodes = $xpath->query(".//div[contains(@class,'wrap_artist')]", $wrap);
foreach($artistNodes as $artistNode){
$artistNode->parentNode->removeChild($artistNode);
}
$buttonNodes = $xpath->query(".//button", $wrap);
foreach($buttonNodes as $btn){
$btn->parentNode->removeChild($btn);
}
$spans = $xpath->query(".//span", $wrap);
$info = [];
foreach($spans as $span){
$text = trim($span->nodeValue);
if($text !== "๋๋ณด๊ธฐ" && $text !== ""){
$info[] = $text;
}
}
$imgNode = $xpath->query(".//img", $tr);
$imgSrc = $imgNode->length > 0 ? $imgNode[0]->getAttribute('src') : "";
if(!empty($info)){
$chartData[] = [
'rank' => $rank,
'songs' => isset($info[0]) ? $info[0] : "",
'artist' => isset($info[1]) ? $info[1] : "",
'image' => $imgSrc
];
$rank++;
}
}
}
}
}
๊ทธ๋์ table ์์ชฝ์ ์๋ tr ํ๊ทธ๋ค์ ๋๋ฉด์, lst50์ด๋ lst100์ด ํฌํจ๋ tr๋ง ์ ํํ๋ค. ๊ทธ ํ wrap_song_info์์ span๋ง ํ์ฑํ๋ค. (์ฌ๊ธฐ์ ๋ถํ์ํ ๋ฒํผ์ด ์๊พธ ๋ธ๋ ค์ค๊ธธ๋ ์ ์ธ์์ผฐ๋ค.) ์จ๋ฒ ์ปค๋ฒ๋ img ํ๊ทธ ์์ ์๋ src๋ฅผ ํ์ฑํด์๋ค.
{
"rank": 1,
"songs": "Golden",
"artist": "HUNTR/X, EJAE, AUDREY NUNA, REI AMI, KPop Demon Hunters Cast",
"image": "https://cdnimg.melon.co.kr/cm2/album/images/118/59/863/11859863_20250620104512_500.jpg/melon/resize/120/quality/80/optimize"
}
๋์ค์ ์ด API๋ฅผ ์ฌ์ฌ์ฉ์ ํ ์ ์๊ฒ JSON ํ์์ผ๋ก ํ์ํ๊ฒ ํด๋์๋ค.
์ฌ์ดํธ๋ ๋ญ ๋ด๊ฐ ๋ง๋ค๊ธฐ ๊ท์ฐฎ์ผ๋ ์์ฆ ์ ํํ๋ค๋ ๋ฐ์ด๋ธ์ฝ๋ฉ์ผ๋ก Cluade๊ฐ ์ด์ฌํ ์ ์์๊ฒ ๋ง๋ค์ด์คฌ๋ค. ํํฐ ๊ธฐ๋ฅ๋ Cluade์๊ฒ ์์ผฐ๋ค. ๋ด๊ฐ ์ํ๋ ์ํฐ์คํธ๋ณ๋ก ํํฐ๋ง์ด ๋๋ ๊ธฐ๋ฅ๋ ๋ค์ด๊ฐ๊ณ , ๊ฒ์ ๊ธฐ๋ฅ๊น์ง ๋ค์ด๊ฐ์ผ๋ ์ผ์ถ ๋ด๊ฐ ์ํ๋ ์ฐจํธ๋ฅผ ๋ฐ๋ก ๋ณผ ์ ์๊ฒ ์์ฑ์ด ๋ ๋ฏ ํ๋ค.
ChartZ
TOP100 HOT100
chartiz.netlify.app