๐Ÿ•ธ๏ธ PHP ์›น ์Šคํฌ๋ž˜ํ•‘ ๊ธฐ๋ฒ•๊ณผ ์ฃผ์˜์‚ฌํ•ญ ๐Ÿ•ท๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ•ธ๏ธ PHP ์›น ์Šคํฌ๋ž˜ํ•‘ ๊ธฐ๋ฒ•๊ณผ ์ฃผ์˜์‚ฌํ•ญ ๐Ÿ•ท๏ธ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, PHP ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์›น ์Šคํฌ๋ž˜ํ•‘์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์›น ์Šคํฌ๋ž˜ํ•‘์ด ๋ญ”์ง€ ๋ชจ๋ฅด๋Š” ๋ถ„๋“ค๋„ ๊ฑฑ์ • ๋…ธ๋…ธ~ ์‰ฝ๊ณ  ์žฌ๋ฐŒ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๊ทธ๋Ÿผ PHP๋กœ ์›น ์Šคํฌ๋ž˜ํ•‘์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค์„ ์•Œ์•„๋ณผ๊นŒ์š”? ๋ ˆ์ธ  ๊ณ ! ๐Ÿš€

1. ์›น ์Šคํฌ๋ž˜ํ•‘์ด ๋ญ์•ผ? ๐Ÿค”

์›น ์Šคํฌ๋ž˜ํ•‘์€ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธ์–ด์˜ค๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ธํ„ฐ๋„ท ์„ธ์ƒ์˜ '๋ฐ์ดํ„ฐ ์‚ฌ๋ƒฅ๊พผ' ๊ฐ™์€ ๊ฑฐ์ฃ ! ๊ทผ๋ฐ ์ด๊ฒŒ ์™œ ํ•„์š”ํ• ๊นŒ์š”?

  • ์‹ค์‹œ๊ฐ„ ๊ฐ€๊ฒฉ ๋น„๊ต
  • ๋‰ด์Šค ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์†Œ์…œ ๋ฏธ๋””์–ด ํŠธ๋ Œ๋“œ ๋ถ„์„
  • ์—ฐ๊ตฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

์ด๋Ÿฐ ์‹์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ์žฌ๋Šฅ ๊ณต์œ  ํ”Œ๋žซํผ์—์„œ๋„ ํŠธ๋ Œ๋“œ ๋ถ„์„์„ ์œ„ํ•ด ์›น ์Šคํฌ๋ž˜ํ•‘์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

์›น ์Šคํฌ๋ž˜ํ•‘ ๊ฐœ๋…๋„ ์›น์‚ฌ์ดํŠธ ๋ฐ์ดํ„ฐ ์ถ”์ถœ

2. PHP๋กœ ์›น ์Šคํฌ๋ž˜ํ•‘ ์‹œ์ž‘ํ•˜๊ธฐ ๐Ÿ› ๏ธ

์ž, ์ด์ œ PHP๋กœ ์›น ์Šคํฌ๋ž˜ํ•‘์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์ด ์žˆ์–ด์š”.

  • cURL: ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”.
  • DOMDocument: HTML์„ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐ ์“ฐ์ด์ฃ .
  • Simple HTML DOM Parser: ์ข€ ๋” ์‰ฝ๊ฒŒ HTML์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.

๋จผ์ € cURL์„ ์‚ฌ์šฉํ•ด์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊ฒŒ์š”.


$url = 'https://www.example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›น ํŽ˜์ด์ง€์˜ HTML์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. ์‰ฝ์ฃ ? ๐Ÿ˜Ž

3. HTML ํŒŒ์‹ฑํ•˜๊ธฐ ๐Ÿงฉ

HTML์„ ๊ฐ€์ ธ์™”๋‹ค๋ฉด ์ด์ œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•ด์š”. ์—ฌ๊ธฐ์„œ DOMDocument๋‚˜ Simple HTML DOM Parser๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค!


$dom = new DOMDocument();
@$dom->loadHTML($html);
$links = $dom->getElementsByTagName('a');

foreach ($links as $link) {
    echo $link->getAttribute('href') . "\n";
}

์ด ์ฝ”๋“œ๋Š” ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ๋งํฌ๋ฅผ ์ถ”์ถœํ•ด์š”. ์™„์ „ ์ฉ”์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹

HTML ํŒŒ์‹ฑ ๊ณผ์ • HTML ํŒŒ์‹ฑ ๋ฐ์ดํ„ฐ <html> DOMDocument ์ถ”์ถœ๋œ ์ •๋ณด

4. ์ฃผ์˜์‚ฌํ•ญ โš ๏ธ

์›น ์Šคํฌ๋ž˜ํ•‘์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค์ด ์žˆ์–ด์š”!

๊ผญ ๊ธฐ์–ตํ•˜์„ธ์š”!

  • ์›น์‚ฌ์ดํŠธ์˜ robots.txt๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ๊ณผ๋„ํ•œ ์š”์ฒญ์€ ์„œ๋ฒ„์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”.
  • ์ €์ž‘๊ถŒ ๋ฌธ์ œ๋ฅผ ์กฐ์‹ฌํ•˜์„ธ์š”.
  • ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ•์„ ์ค€์ˆ˜ํ•˜์„ธ์š”.

์ด๋Ÿฐ ์ ๋“ค์„ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ํฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฌด๋‹จ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธ์–ด๊ฐ€๋ฉด... ์Œ... ์•ˆ ์ข‹์€ ์ผ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ๐Ÿ˜…

5. ๊ณ ๊ธ‰ ๊ธฐ๋ฒ• ๐Ÿš€

๊ธฐ๋ณธ์„ ์ตํ˜”๋‹ค๋ฉด ์ด์ œ ์ข€ ๋” ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ๋ฐฐ์›Œ๋ณผ๊นŒ์š”?

5.1 ๋น„๋™๊ธฐ ์Šคํฌ๋ž˜ํ•‘

์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋™์‹œ์— ์Šคํฌ๋ž˜ํ•‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.


$urls = ['url1', 'url2', 'url3'];
$mh = curl_multi_init();

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
}

do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

foreach ($urls as $i => $url) {
    $result = curl_multi_getcontent($ch[$i]);
    // ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
}

curl_multi_close($mh);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋™์‹œ์— ์Šคํฌ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋น ๋ฅด์ฃ ? ๐Ÿ˜Ž

5.2 JavaScript ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ

์š”์ฆ˜ ์›น์‚ฌ์ดํŠธ๋“ค์€ JavaScript๋กœ ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ Puppeteer๋‚˜ Selenium ๊ฐ™์€ ๋„๊ตฌ๋ฅผ PHP์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.


// Puppeteer ์‚ฌ์šฉ ์˜ˆ์ œ (Node.js ํ™˜๊ฒฝ ํ•„์š”)
$browser = new \Browser\Browser();
$page = $browser->createPage();
$page->goto('https://example.com');
$content = $page->content();
$browser->close();

// PHP์—์„œ ์ฒ˜๋ฆฌ
$dom = new DOMDocument();
@$dom->loadHTML($content);
// ์ดํ›„ ํŒŒ์‹ฑ ์ž‘์—…...

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JavaScript๋กœ ๋ Œ๋”๋ง๋œ ์ฝ˜ํ…์ธ ๋„ ์Šคํฌ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ํ”„๋กœ ์ˆ˜์ค€์ด์ฃ ? ใ…‹ใ…‹

๊ณ ๊ธ‰ ์›น ์Šคํฌ๋ž˜ํ•‘ ๊ธฐ๋ฒ• ๋น„๋™๊ธฐ JS ๋ Œ๋”๋ง

6. ์‹ค์ „ ์˜ˆ์ œ: ๋‰ด์Šค ํ—ค๋“œ๋ผ์ธ ์Šคํฌ๋ž˜ํ•‘ ๐Ÿ“ฐ

์ž, ์ด์ œ ์‹ค์ œ๋กœ ๋‰ด์Šค ์‚ฌ์ดํŠธ์—์„œ ํ—ค๋“œ๋ผ์ธ์„ ์Šคํฌ๋ž˜ํ•‘ํ•ด๋ณผ๊นŒ์š”?


$url = 'https://example-news.com';
$html = file_get_contents($url);

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

$headlines = $xpath->query('//h2[@class="headline"]');

foreach ($headlines as $headline) {
    echo $headline->textContent . "\n";
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‰ด์Šค ํ—ค๋“œ๋ผ์ธ์„ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ๊ฟ€ํŒ์ด์ฃ ? ๐Ÿ˜‰

7. ์—๋Ÿฌ ์ฒ˜๋ฆฌ์™€ ๋””๋ฒ„๊น… ๐Ÿ›

์›น ์Šคํฌ๋ž˜ํ•‘์„ ํ•˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•ด์ค˜์•ผ ํ•ด์š”.


try {
    $url = 'https://example.com';
    $html = file_get_contents($url);
    if ($html === false) {
        throw new Exception('Failed to load the webpage');
    }
    // ํŒŒ์‹ฑ ์ž‘์—…...
} catch (Exception $e) {
    error_log('Scraping error: ' . $e->getMessage());
    // ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋กœ์ง
}

์ด๋ ‡๊ฒŒ try-catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ์ž˜ ์žก์„ ์ˆ˜ ์žˆ์–ด์š”. ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ ์Šต๊ด€์ด์ฃ ! ๐Ÿ‘

8. ์„ฑ๋Šฅ ์ตœ์ ํ™” ๐Ÿš€

์›น ์Šคํฌ๋ž˜ํ•‘์„ ํ•  ๋•Œ ์„ฑ๋Šฅ๋„ ์ค‘์š”ํ•ด์š”. ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”.

  • ์บ์‹ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ด์„ธ์š”.
  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„ ํƒ์ ์œผ๋กœ ํŒŒ์‹ฑํ•˜์„ธ์š”.
  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.