본문 바로가기
Data Analysis/Data Mining

[Web Crawling] 인피니티 스크롤 크롤링

by 베짱이28호 2024. 11. 16.

[Web Crawling] 인피니티 스크롤 크롤링


 

인피니티 스크롤 크롤링

  • 스크롤을 내리면, api를 요청한 후 새로운 정보를 계속해서 보여주는 웹 사이트 형태

예시 사이트

디자인 이야기가 있는 디자이너들의 매거진, 디자인정글

  • 메인 페이지에서 아래로 드래그하면, 요청을 보내서 데이터를 렌더링 해주는 비동기 사이트이다.

  • 이런 방식으로 나와있고 드래그를 하면서 어떤 응답 요청을 받는지 확인한다.
요청 URL:
https://jungle.co.kr/recent.json?magazineOffset=0&contestOffset=0&exhibitOffset=0&galleryOffset=0

https://jungle.co.kr/recent.json?magazineOffset=1&contestOffset=5&exhibitOffset=0&galleryOffset=0

https://jungle.co.kr/recent.json?magazineOffset=4&contestOffset=8&exhibitOffset=0&galleryOffset=0

https://jungle.co.kr/recent.json?magazineOffset=8&contestOffset=10&exhibitOffset=0&galleryOffset=0

 

  • 드래그를 할 때 마다, resent.json? 이후 파라미터 값을 입력해서 데이터를 불러오는 방식이다.

  • 규칙을 찾기 어려워서, 미리보기를 통해 정보를 더 살펴보면 다음으로 올  파라미터 값들을 가지고 있다.
  • 이를 활용해서 크롤링하기.

 

크롤링

import requests
from bs4 import BeautifulSoup as bs

url = "https://jungle.co.kr/recent.json?magazineOffset=0&contestOffset=0&exhibitOffset=0&galleryOffset=0"
response = requests.get(url)
response.text

'{"exhibitOffset":0,"existMore":true,"contestOffset":5,"success":true,"galleryOffset":0,"moreList":[{"id":208212,"title":"탄소중립 서울 캠퍼스 대전 참가 초대","thumbnailImageId":"78c2a204490e9f10b55eb696","secondaryThumbnailImageId":"bb35575e4fb3bd8c281fa61f","confirmedDate":"24-11-15","originalCreatedDate":1731646217000,"targetCode":"공모전","targetName":"contest"},{"id":208211,"title":"[추천공모전] 아나운서 포트폴리오 제작 심화 과정 (~12.19)","thumbnailImageId":"867d59d44b9db2e601c38414","secondaryThumbnailImageId":"ad6034d34767a239d84336cf","confirmedDate":"24-11-15","originalCreatedDate":1731631600000,"targetCode":"공모전","targetName":"contest"},{"id":208210,"title":"2025 에몬스 장학생 [17기]모집","thumbnailImageId":"785f4fa8405ab34762e2abc8","secondaryThumbnailImageId":"78dfcd7f4614b0f2ca5ddc46","confirmedDate":"24-11-14","originalCreatedDate":1731578646000,"targetCode":"공모전","targetName":"contest"},{"id":206527,"title":"[포커스 인터뷰] \\"책으로 인생을 설계하라\\"_ 독서코칭 전문가 김을호 회장이 전하는 독서의 지혜와 방법\xa0","thumbnailImageId":"1c7224924f0d91eff072a574","confirmedDate":"24-11-14","originalCreatedDate":1731578446000,"targetCode":"매거진","targetName":"magazine"},{"id":208209,"title":"It_청년취업 네트워킹 파티(with. 성동청도지)","thumbnailImageId":"9fbf7e19463f8e2a3fa1df92","secondaryThumbnailImageId":"b60951ad459b89142cee2f0f","confirmedDate":"24-11-14","originalCreatedDate":1731578366000,"targetCode":"공모전","targetName":"contest"},{"id":208208,"title":"It\'s 여행(with. 성동청도지)","thumbnailImageId":"ce86dd204c15bd4ce9a07570","secondaryThumbnailImageId":"1077ea604a399d4b8041029d","confirmedDate":"24-11-14","originalCreatedDate":1731578071000,"targetCode":"공모전","targetName":"contest"}],"magazineOffset":1}'
  • 잘 오는 것을 확인할 수 있다.

 

  • 미리보기에서 봤던 파라미터들에서 moerList에 데이터가 들어있는 것을 확인할 수 있다.
  • 다음 파라미터도 같이 전달되는데, 이를 루프를 돌면서 변수를 업데이트하고 크롤링하며 된다.

 

"https://jungle.co.kr/recent.json?magazineOffset=0&contestOffset=0&exhibitOffset=0&galleryOffset=0"

datas = []
magazineOffset = 0
contestOffset = 0
exhibitOffset = 0
galleryOffset = 0

url = f"https://jungle.co.kr/recent.json?magazineOffset={magazineOffset}&contestOffset={contestOffset}&exhibitOffset={exhibitOffset}&galleryOffset={0}"

 

  • 기존 URL에서 어떤 변수가 들어가는지 확인한다.
  • = 이후에 들어가는 파라미터를 통해서 변수를 할당할 수 있게 변경한다.

 

url = f"https://jungle.co.kr/recent.json?magazineOffset={magazineOffset}&contestOffset={contestOffset}&exhibitOffset={exhibitOffset}&galleryOffset={0}"
response = requests.get(url)
response.json()

------------------

{'exhibitOffset': 0,
 'existMore': True,
 'contestOffset': 5,
 'success': True,
 'galleryOffset': 0,
 'moreList': [{'id': 208212,
   'title': '탄소중립 서울 캠퍼스 대전 참가 초대',
   'thumbnailImageId': '78c2a204490e9f10b55eb696',
   'secondaryThumbnailImageId': 'bb35575e4fb3bd8c281fa61f',
   'confirmedDate': '24-11-15',
   'originalCreatedDate': 1731646217000,
   'targetCode': '공모전',
   'targetName': 'contest'},
  {'id': 208211,
   'title': '[추천공모전] 아나운서 포트폴리오 제작 심화 과정 (~12.19)',
   'thumbnailImageId': '867d59d44b9db2e601c38414',
   'secondaryThumbnailImageId': 'ad6034d34767a239d84336cf',
   'confirmedDate': '24-11-15',
   'originalCreatedDate': 1731631600000,
   'targetCode': '공모전',
   'targetName': 'contest'},
  {'id': 208210,
   'title': '2025 에몬스 장학생 [17기]모집',
   'thumbnailImageId': '785f4fa8405ab34762e2abc8',
   'secondaryThumbnailImageId': '78dfcd7f4614b0f2ca5ddc46',
   'confirmedDate': '24-11-14',
   'originalCreatedDate': 1731578646000,
   'targetCode': '공모전',
   'targetName': 'contest'},
  {'id': 206527,
   'title': '[포커스 인터뷰] "책으로 인생을 설계하라"_ 독서코칭 전문가 김을호 회장이 전하는 독서의 지혜와 방법\xa0',
   'thumbnailImageId': '1c7224924f0d91eff072a574',
   'confirmedDate': '24-11-14',
   'originalCreatedDate': 1731578446000,
   'targetCode': '매거진',
   'targetName': 'magazine'},
  {'id': 208209,
   'title': 'It_청년취업 네트워킹 파티(with. 성동청도지)',
   'thumbnailImageId': '9fbf7e19463f8e2a3fa1df92',
   'secondaryThumbnailImageId': 'b60951ad459b89142cee2f0f',
   'confirmedDate': '24-11-14',
   'originalCreatedDate': 1731578366000,
   'targetCode': '공모전',
   'targetName': 'contest'},
  {'id': 208208,
   'title': "It's 여행(with. 성동청도지)",
   'thumbnailImageId': 'ce86dd204c15bd4ce9a07570',
   'secondaryThumbnailImageId': '1077ea604a399d4b8041029d',
   'confirmedDate': '24-11-14',
   'originalCreatedDate': 1731578071000,
   'targetCode': '공모전',
   'targetName': 'contest'}],
 'magazineOffset': 1}
  • 요청을 보내면 잘 오는 것을 확인할 수 있다.
  • for문을 통해서 데이터를 넣고, 파라미터를 업데이트 시키면서 반복하면 된다.

'Data Analysis > Data Mining' 카테고리의 다른 글

[Web Crawling] snake - camel case  (0) 2024.11.23
[Web Crawling] 정리  (0) 2024.11.17
[Web Crawling] 비동기 사이트  (0) 2024.11.16
[Web Crawling] CSS 셀렉터  (0) 2024.11.16
[Web Crawling] BeautifulSoup  (0) 2024.11.14
[Web Crawling] Requests  (0) 2024.11.14
[Web Crawling] HTML 구조  (0) 2024.11.14

댓글