Goutte Crawler 문의 채택완료
안녕하세요.
뉴질랜드 도서관 한글 장서를 정리하고 있습니다.
오클랜드 도서관의 한글 장서는 잘 긁어오는데요, 크라이스트처치의 장서는 방식이 조금 달라서 애를 먹고 있네요.
아래 url으로 가면 html문서의 마지막 부분에 script로 json 문서가 들어 있는데, 거기에 도서 정보가 가지런히 들어 있거든요.
그걸 이용하려고 아래 코드를 만들었는데, 왠지 모르지만 25개 중에서 10개만 가져옵니다.
제가 무엇을 놓친 것인지 알수 없어서 도움을 구합니다.
운영되는 환경은 bookcafe.co.nz 입니다.
</p>
<p>use Goutte\Client;</p>
<p>$client = new Client();</p>
<p>$searchUrl = "<a href="https://christchurch.bibliocommons.com/v2/search?custom_edit=false&query=isolanguage%3A%22kor%22%20available%3A%22%5B*%20TO%20*%5D%22%20formatcode%3A(BK%20)%20pubyear%3A%5B2015%20TO%202015%5D&searchType=bl&suppress=true&pagination_page=14&page=7";" target="_blank" rel="noopener noreferrer">https://christchurch.bibliocommons.com/v2/search?custom_edit=false&query=isolanguage%3A%22kor%22%20available%3A%22%5B*%20TO%20*%5D%22%20formatcode%3A(BK%20)%20pubyear%3A%5B2015%20TO%202015%5D&searchType=bl&suppress=true&pagination_page=14&page=7";</a></p>
<p> </p>
<p>$crawler = $client->request('GET', $searchUrl);</p>
<p> </p>
<p>$chch_json = $crawler->filterXpath('//script[@type="application/json"]')->text();</p>
<p>$R = json_decode($chch_json, true);</p>
<p> </p>
<p>//echo "<pre>"; print_r($R);echo "</pre>";</p>
<p>$chchBooks = $R['entities']['bibs'];</p>
<p> </p>
<p>$book= array();</p>
<p>$i = 0;</p>
<p>foreach ($chchBooks as $key) {</p>
<p style="text-align: justify;"> if (isset($key['briefInfo']['isbns']['0'])) $isbn = $key['briefInfo']['isbns']['0']; else $isbn = "N/A";</p>
<p style="text-align: justify;"> $book[$i]['no'] = $key['id'];</p>
<p style="text-align: justify;"> $book[$i]['isbn'] = $isbn;</p>
<p style="text-align: justify;"> $i++;</p>
<p>}</p>
<p>
여기까지 앍어주셔셔 감사합니다.
도움을 주실 분께는 더 많은 감사를..,,,
답변 2개
안녕하세요? ^^
올려주신 URL을 통해서는 10개씩 서적의 리스트를 볼 수 있는 것으로 확인됩니다.
브라우저에서 보기 방식을 List view 또는 Cover view로 변경하시면
URL이 바뀌지 않으면서 10개가 아닌 25개씩 리스트하는 페이지로 바뀝니다.
이는 소위 '동적 웹페이지' 방식으로 작동하는 것으로 보입니다.
개발자도구에서 살펴보면 아래 URL로 POST 전송을 하여 JSON으로 데이터를 받아오는 것을 확인할 수 있습니다.
https://gateway.bibliocommons.com/v2/libraries/christchurch/bibs/search?locale=en-CA
25개씩 데이터를 받고 싶으시다면 위 URL로 적절한 headers와 formdata를 넣어 POST 전송을 한 후 전송받은 JSON을 파싱하시면 됩니다.
그럼 작업을 잘 마무리하시기를 기원합니다 :)
답변에 대한 댓글 2개
부디 뉴질랜드에서 건승하시기를 기원합니다 :)
댓글을 작성하려면 로그인이 필요합니다.
script내에서도 10개밖에 없는것으로 보이네요
25개를 가져오는 부분이 없는데 왜 25개를 가져온다고 보시는건가요?
스크립트나 코드가 잘못된것은 없고, 사이트에서 10개만 나옵니다
답변에 대한 댓글 3개
$searchUrl 으로 접근해서 나오는 html 문서의 script 중에 type="application/json"인 내용을 들여다보면 즉 /html/body/script[1]/text() 를 보면 briefInfo값이 25개를 찾을 수 있거든요.
그런데 $R 에는 10개만 보이거든요.
크롬으로 브라우징히면 25개씩 나오는데,
$crawler = $client->request('GET', $searchUrl);
위 모듈을 타면 10개씩 나오는군요,ㅠㅠ
감사합니다.
어떤 이벤트가 실행 되면 다음 15개를 가져 오게 되어 있을 겁니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
감사합니다.