티스토리 뷰
반응형
크롤러는 병렬로 여러 URL을 동시에 요청하고, 그 결과(HTML) 일부를 가져오는 예제
✅ 목표
- 여러 웹페이지를 병렬로 요청
- 각 페이지의 제목(<title>)을 추출
- 병렬 작업이므로 빠르게 완료
❗ 이 예제는 CLI 전용입니다. parallel은 Apache나 Nginx 같은 웹 서버에서 동작하지 않으므로 터미널에서 실행하세요.
📦 사전 준비
1. parallel 확장 설치
pecl install parallel
php.ini에 추가:
extension=parallel.so
2. PHP 버전 확인 (7.2 이상)
php -v
📄 parallel_web_crawler.php
<?php
use parallel\Runtime;
function getTitleFromUrl($url) {
$html = @file_get_contents($url);
if ($html === false) {
return "Failed to fetch: $url";
}
if (preg_match('/<title>(.*?)<\/title>/i', $html, $matches)) {
return "[$url] => " . $matches[1];
} else {
return "[$url] => (No title found)";
}
}
// 병렬로 실행할 URL 목록
$urls = [
'https://www.php.net',
'https://www.wikipedia.org',
'https://www.github.com',
'https://www.stackoverflow.com',
'https://www.openai.com',
];
// Runtime과 작업 Future 배열
$runtimes = [];
$futures = [];
// 각 URL을 병렬로 처리
foreach ($urls as $url) {
$runtime = new Runtime();
$runtimes[] = $runtime;
$futures[] = $runtime->run(function ($url) {
return getTitleFromUrl($url);
}, [$url]);
}
// 결과 출력
foreach ($futures as $future) {
echo $future->value() . PHP_EOL;
}
▶ 실행
php parallel_web_crawler.php
🧠 출력 예시
[https://www.php.net] => PHP: Hypertext Preprocessor
[https://www.wikipedia.org] => Wikipedia
[https://www.github.com] => GitHub: Let’s build from here
[https://www.stackoverflow.com] => Stack Overflow - Where Developers Learn, Share, & Build Careers
[https://www.openai.com] => OpenAI
🔍 참고 및 확장 가능성
- 크롤링 결과를 파일로 저장하거나 DB에 저장
- DOMDocument와 DOMXPath를 사용하여 제목 외에 다른 정보도 추출
- 병렬 크롤링 후 필터링, 분석 등 추가 작업도 가능
반응형
'배움 > PHP' 카테고리의 다른 글
Laravel Helper Class 사용법 (0) | 2025.07.01 |
---|---|
프록시 설정, User-Agent 설정 등 (0) | 2025.06.24 |
PHP Multi Thread 구현 (0) | 2025.06.24 |
Laravel 12 Swagger (0) | 2025.06.05 |
Laravel 11 Swagger (0) | 2025.06.02 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- laravel 테스트
- 명령어
- Laravel
- #php
- PYTHON
- call_user_func
- flask
- privatechannel
- swagger
- laravel 11
- #collect
- jp:a
- 설치
- wsl
- curl_multi_init
- createfromformat
- array_combine
- strict_types
- reflectionclass
- ob_get_contents
- uniqid
- 비동기
- facades
- mysql
- 설정
- laravel 12
- ubuntu
- php
- researcher
- WSL2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함