개발자 선배님들 질문드립니다.
알림
|
페이지 정보
작성일
2024.04.17 16:25
본문
저희 회사에서 C#기반 자체적인 스크래핑 툴이 필요해져서 개발에 들어갔습니다.
제가 잘 몰라서 그런데
질문1. 다른 스크래핑이나 크롤링 회사들은 어떠한 방식으로 웹의 데이터를 수집하나요?
요즘은 자바스크립트로 웹페이지에 내용들을 출력하기 때문에 일반 스크래핑 코드로는 빈 웹페이지만 나옵니다.
그래서 연구중인데 selenium, cefsharp 같은 유명한 라이브러리들을 보니 대부분 chromium 이라는 브라우저 엔진을 사용하더군요.
chromium은 브라우저 엔진인데 chrome, microsoft edge 등이 이걸로 만들어졌다고 이해했습니다.
그래서 어쩌다보니 C++ 솔루션으로 배포되어 있는 CEF(chromium embedded framework) 를 연구중입니다만..
사용방법 같은 기록들이 거의 전무한 수준이네요..
질문2. 크로미움을 C# 프로젝트에서 사용할 수 있게 개발할때 참고할만한 자료 부탁드립니다. 아님 경험담이라도..
질문3. CEFSharp 라고 질문2를 c# 에서 사용하기 쉽게 만든 라이브러리가 있더군요.. 정 안되면 이걸 사용하려고 하는데, 다른 회사들에서도 제품에 사용중이신지?
쓰고나니 너무 두서 없이 썼네요.
다모앙에 개발자분들이 많으시다고 듣고 선배님들에게 고견을 여쭙니다.
댓글 4
/ 1 페이지
디클님의 댓글
단계적으로 스크래핑을 수행하면서 문제점을 해결해 보시는 것이 어떨까 합니다.
1. 스크래핑 라이브러리 선정 및 사용법
2. DOM 에서 원하는 태그, ID, class 기반으로 컨텐츠를 가져오는 방법
3. AJAX 등으로 동적 컨텐츠 랜딩되는 데이터 가져오는 방법 (지연)
4. 해당 어플리케이션 (배치)를 수행할 환경 (e.g docker)
5. 수행 시간 측정 및 문제점
위에 언급 리플에 업금 되었듯이, selenium의 --headless 수행 환경이나 컨텐츠의 동적 시간 이슈등으로 원하는 결과를 못가져올 수 있습니다. 일단 해보시면서 부딛혀 보면서 질문을 추려 가는 과정을 추천합니다.
아래는 클로드(https://claude.ai/) 에 c# 스크래핑 문의한 내용 참고 하십시요
---
C#을 이용한 웹 스크래핑 시 동적 렌더링 대응 및 DOM 파싱을 위해 다음과 같은 라이브러리를 추천드립니다:
1. **Selenium WebDriver**
- C#에서 가장 널리 사용되는 웹 스크래핑 라이브러리
- 브라우저를 직접 제어하여 동적 렌더링 페이지 처리 가능
- DOM 요소 선택 및 조작, 스크립트 실행 등 다양한 기능 제공
- 예시 코드:
```csharp
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
// 크롬 드라이버 초기화
IWebDriver driver = new ChromeDriver();
// 웹 페이지 접속
driver.Navigate().GoToUrl("https://example.com");
// DOM 요소 찾기 및 조작
IWebElement element = driver.FindElement(By.Id("myElement"));
string text = element.Text;
element.Click();
// 브라우저 종료
driver.Quit();
```
2. **HtmlAgilityPack**
- HTML 문서 파싱을 위한 강력한 라이브러리
- 동적 렌더링 페이지에는 직접적으로 대응하기 어려우나, 정적 페이지의 DOM 파싱에 매우 유용
- 선택자를 통한 노드 탐색, 데이터 추출 등의 기능 제공
- 예시 코드:
```csharp
using HtmlAgilityPack;
// HTML 문서 로드
HtmlDocument doc = new HtmlDocument();
doc.Load("https://example.com");
// DOM 요소 찾기 및 데이터 추출
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@id='myElement']");
string text = node.InnerText;
```
3. **Puppeteer-sharp**
- Puppeteer의 C# 포트
- 브라우저를 직접 제어하여 동적 렌더링 페이지 처리 가능
- Selenium과 비슷한 기능 제공, 다만 보다 간결한 API 제공
- 예시 코드:
```csharp
using PuppeteerSharp;
// 브라우저 인스턴스 생성
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = false
});
var page = await browser.NewPageAsync();
// 웹 페이지 접속
await page.GoToAsync("https://example.com");
// DOM 요소 찾기 및 데이터 추출
var element = await page.QuerySelectorAsync("#myElement");
var text = await element.EvaluateFunctionAsync<string>("node => node.textContent");
// 브라우저 종료
await browser.CloseAsync();
```
이 중 필요에 따라 Selenium WebDriver, HtmlAgilityPack, Puppeteer-sharp 중 적절한 라이브러리를 선택하여 사용하시면 됩니다. 각 라이브러리의 특성을 고려하여 프로젝트에 가장 적합한 것을 선택하는 것이 중요합니다.
1. 스크래핑 라이브러리 선정 및 사용법
2. DOM 에서 원하는 태그, ID, class 기반으로 컨텐츠를 가져오는 방법
3. AJAX 등으로 동적 컨텐츠 랜딩되는 데이터 가져오는 방법 (지연)
4. 해당 어플리케이션 (배치)를 수행할 환경 (e.g docker)
5. 수행 시간 측정 및 문제점
위에 언급 리플에 업금 되었듯이, selenium의 --headless 수행 환경이나 컨텐츠의 동적 시간 이슈등으로 원하는 결과를 못가져올 수 있습니다. 일단 해보시면서 부딛혀 보면서 질문을 추려 가는 과정을 추천합니다.
아래는 클로드(https://claude.ai/) 에 c# 스크래핑 문의한 내용 참고 하십시요
---
C#을 이용한 웹 스크래핑 시 동적 렌더링 대응 및 DOM 파싱을 위해 다음과 같은 라이브러리를 추천드립니다:
1. **Selenium WebDriver**
- C#에서 가장 널리 사용되는 웹 스크래핑 라이브러리
- 브라우저를 직접 제어하여 동적 렌더링 페이지 처리 가능
- DOM 요소 선택 및 조작, 스크립트 실행 등 다양한 기능 제공
- 예시 코드:
```csharp
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
// 크롬 드라이버 초기화
IWebDriver driver = new ChromeDriver();
// 웹 페이지 접속
driver.Navigate().GoToUrl("https://example.com");
// DOM 요소 찾기 및 조작
IWebElement element = driver.FindElement(By.Id("myElement"));
string text = element.Text;
element.Click();
// 브라우저 종료
driver.Quit();
```
2. **HtmlAgilityPack**
- HTML 문서 파싱을 위한 강력한 라이브러리
- 동적 렌더링 페이지에는 직접적으로 대응하기 어려우나, 정적 페이지의 DOM 파싱에 매우 유용
- 선택자를 통한 노드 탐색, 데이터 추출 등의 기능 제공
- 예시 코드:
```csharp
using HtmlAgilityPack;
// HTML 문서 로드
HtmlDocument doc = new HtmlDocument();
doc.Load("https://example.com");
// DOM 요소 찾기 및 데이터 추출
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@id='myElement']");
string text = node.InnerText;
```
3. **Puppeteer-sharp**
- Puppeteer의 C# 포트
- 브라우저를 직접 제어하여 동적 렌더링 페이지 처리 가능
- Selenium과 비슷한 기능 제공, 다만 보다 간결한 API 제공
- 예시 코드:
```csharp
using PuppeteerSharp;
// 브라우저 인스턴스 생성
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = false
});
var page = await browser.NewPageAsync();
// 웹 페이지 접속
await page.GoToAsync("https://example.com");
// DOM 요소 찾기 및 데이터 추출
var element = await page.QuerySelectorAsync("#myElement");
var text = await element.EvaluateFunctionAsync<string>("node => node.textContent");
// 브라우저 종료
await browser.CloseAsync();
```
이 중 필요에 따라 Selenium WebDriver, HtmlAgilityPack, Puppeteer-sharp 중 적절한 라이브러리를 선택하여 사용하시면 됩니다. 각 라이브러리의 특성을 고려하여 프로젝트에 가장 적합한 것을 선택하는 것이 중요합니다.
gudtkdml님의 댓글의 댓글
@디클님에게 답글
우와 엄청난 정보군요
정성스러운 답변 감사합니다!
정성스러운 답변 감사합니다!
프로그피쉬님의 댓글
CEFSharp 은 몰라서 패스하겠습니다.
스크레이핑 라이브러리는 두가지로 나눠 볼수 있습니다.
1)HTML 파싱
2)인간 행세하는(?) UI 테스팅
1)같은경우 간단히 html 요청해서 받아오는 걸 파싱하기땜에 가볍고 간단하고 그런데 말씀하신 것처럼 자바스크립트로 내용을 가져오는 기술 (Ajax)에 관한건 하지 못합니다.
닷넷용은 '퍼핏' 라이브러리가 널리 알려진것같습니다.
2)같은경우 셀레니움이 가장 많이 알려져있지만 playwright 라는 것과 또 다른것들도 있습니다. 보통은 UI테스팅 자동화를 위해 많이 쓰이기때문에 이에 관한 강좌가 많습니다. 닷넷개발커뮤에서는 대부분 UI테스팅 얘기뿐일거예요. 닷넷용 셀레니움 라이브러리도 있습니다.
이것은 크로미움 웹드라이버 바이너리를 닷넷프로젝트에 추가할 수 있어요.
웹드라이버 바이너리란, 그 파일 자체만으로 웹브라우저 기능을 하는 작은 프로그램입니다. 이것을 프로젝트에 포함시켜서 코드에서 이 웹드라이버의 API를 이용해 실행시켜서 웹을 탐색합니다.
플레이라이트는 MS에서 만들었고 node.js 기반을 닷넷이나 파이썬으로 래핑한 것들이 있습니다. 공식문서사이트에 가면 언어 별로 문서를 골라서 볼 수 있습니다.
플레이라이트의 경우 누겟에서 닷넷용 라이브러리 받아서 한다해도 결국 node.js 래핑이기때문에 실행시 node.js가 돌아갑니다. 웹브라우저 설치 스크립트를 실행하게 되는데 이게 결국 node.js 스크립트예요.
저는 개인적으로 c# 셀레니움으로 시도하다가 플레이라이트를 했는데 셀레니움을 다 구현하고 못쓰게된 이유가 서버에서 헤드리스 실행과 구린 성능 문제 때문이었습니다.
일반 컴퓨터(맥)에서는 둘다 잘 돌아갑니다.
서버에서 웹드라이버를 실행하려면 모니터가 없으므로 헤드리스를 써야하는데 국내 쇼핑몰은 이미지와 자바스크립트 떡칠이라 웹페이지가 무거워 타임아웃만되고 잘 동작하지 않았습니다.
서버에 가상모니터를 붙일수도 있으나 거기까지 하진 못했고요. 그리고 셀레니움은 한번도는데 램을 많이 먹습니다. 400mb 정도 먹기땜에 작은 서버사양으로는 힘겹죠. 결론은 제 경험상 서버에서 헤드리스로 돌릴려면 플레이라이트여야 했고요(닷넷이 문제인지도요 ㅎㅎ).
닷넷용으로 둘의 차이가 쿠팡홈기준으로 셀레니움은 100초대, 플레이라이트는 20초이내 정도 되었습니다(맥 M2 Max).
둘째로 플레이라이트역시 서버리스 서비스 (aws 람다)에서 써보려했지만 실패했습니다. 플레이라이트는 웹브라우저 드라이버를 여러종류 설치해서 골라 실행할 수 있습니다. 하지만 바이너리뿐만 아니라 디펜던시도 함께 설치해줘야하기때문에 복잡합니다. 웹드라이버 바이너리도 CDN주소가 공개되지 않아서 코드돌려야 MS의 CDN통해서 바이너리가 빌드폴더에 생깁니다.
내 컴에서 실행한다고 할 땐 웹드라이버를 따로 설치하지 않고 코드로 평소 쓰는 크롬웹브라우저로 지정가능하니 설치해줄 필욘 없습니다.
플레이 라이트 관심있으면 삽질한 거 참고해보세요 ㅎㅎ https://kyleplanet.com/?p=204