[Laravel] GuzzleHttp 와 Symfony dom-crawler를 사용하여 크롤링(crawling) 만들기 updated_at: 2024-12-14 03:26

라라벨을 이용한 크롤링(crawling) 만들기 3- GuzzleHttp 와 Symfony dom-crawler를 사용하는 방법

이전에 Goutte\Client package를 사용하여 크롤링을 만든는 방법에 대해서 설명드렸습니다.
그러나 저는 개인적으로는 GuzzleHttp 와 Symfony dom-crawler를 이용한 방법을 추천드리고 싶습니다.
Goutte 는 사용법에서는 편안하나 http 연결에 다양한 옵션을 사용할 수 없음과 만약 target source 가 깨진경우(태그가 안닫히거나) 는 크롤링에 문제가 발생한다는 것입니다.

package install

여기서 사용할 GuzzleHttp\Client 과 Symfony\Component\DomCrawler\Crawler package를 인스톨 한다.

composer require guzzlehttp/guzzle
composer require symfony/dom-crawler

source

use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar; // SingIn(Login) 이 필요할때 사용
use Symfony\Component\DomCrawler\Crawler;
..........

$client = new Client();
$crawler = new Crawler();
$response = $client->request('GET', $url);
$html = $response->getBody();// 받은 데이타를 $html에 넣어준다.
// $html = iconv('EUC-KR', 'UTF-8//IGNORE', ($response->getBody())); 만약 charset을 변경해야 하는 경우 이것 처럼 처리하면 된다.
$crawler->addHTMLContent($html, 'UTF-8'); // Symfony dom-crawler 에 저장한다. 여기까지 하면 다른 기능은 goutte 에서 사용하는 방법과 동일하다.

$crawler->filter('div.list')->each(function ($node, $i) use($client, $cookieJar) {

});

로그인

goutte 를 사용할 때 보다 권한이 필요한 곳에서는 좀 복잡한 단점이 있다.

  • login.html
<form action=''>
  <input type='text' name='login_id'>
  <input type='password' name='login_password'>
  <button type="submit">Login</button>
</form>
$client = new Client();
$cookieJar = new CookieJar(); // use GuzzleHttp\Cookie\CookieJar

$form_params = ['login_id' => 'UserID', 'login_password' => 'UserPWD'];
$response = $client->request('POST', 'https://onstory.fun/login.html', ['form_params'=>$form_params, 'allow_redirects'=>true,  'cookies' => $cookieJar]);

// $cookieJar 를 이용하여 권한을 가진 페이지에 접근하여 처리하면 된다.
$response = $client->request('GET', 'https://onstory.fun/authencated.page.html', ['cookies' => $cookieJar]);

필터 pattern

필터 패턴은 이곳을 참조해주세요

평점을 남겨주세요
평점 : 5.0
총 투표수 : 2

질문 및 답글