동적 웹 크롤링에서 일관되지 않는 HTML 구조를 다루는 전략
웹 크롤링에서 일관되지 않은 HTML 구조 문제
웹 페이지 데이터를 크롤링 할 때 개발자는 종종 동일한 URL이 다른 시간 또는 다른 요청 방법으로 다른 HTML 컨텐츠를 반환하는 상황을 만나게됩니다. 이것은 일반적으로 다음과 같은 현대 웹 사이트의 복잡성 때문입니다.
- 클라이언트 측 렌더링 (CSR) : 페이지 컨텐츠는 브라우저 측에서 JavaScript에 의해 동적으로 생성됩니다. 요청 라이브러리에서 얻은 원래의 HTML에는 최종 렌더링 된 데이터가 포함되어 있지 않을 수 있습니다.
- CDN (Content Delivery Network) 또는로드 밸런싱 : 요청은 약간 다른 HTML 버전을 반환 할 수있는 다른 서버로 라우팅 될 수 있습니다.
- A/B 테스트 또는 개인화 된 컨텐츠 : 웹 사이트는 사용자 특성 또는 테스트 목적으로 다른 사용자에게 다른 레이아웃이나 콘텐츠를 표시합니다.
- 내부 API 호출 : 많은 웹 사이트가 내부 API를 통해 데이터를 얻은 다음 JavaScript를 사용하여 DOM에 주입합니다. 원래 URL을 직접 요청하면 API 통화 스크립트가 포함 된 로더 페이지 또는 골격 HTML 만 반환 할 수 있습니다.
위의 경우, 사용자는 IBM 문서 페이지에 대한 요청이 때때로 예상되는 구조화 된 HTML (테이블 데이터 포함)을 반환하는 것을 관찰했으며 때로는 많은 JavaScript 변수 및 오류 프롬프트가 포함 된 예상치 못한 HTML을 반환합니다 (예 : Error.sorrytext). 이는 웹 사이트가 API를 통해 기본 컨텐츠를 동적으로로드 할 수 있음을 강력하게 암시하고 직접 요청.
해결책 : 내부 API를 식별하고 활용하십시오
이러한 유형의 문제를 해결하는 핵심은 브라우저 동작을 시뮬레이션하고 웹 사이트가 실제 콘텐츠를 얻기 위해 사용하는 내부 API를 식별하는 것입니다. 일반적으로 네트워크 요청을 확인하려면 브라우저의 개발자 도구 (F12)의 도움이 필요합니다.
핵심 아이디어 :
- 브라우저 동작 시뮬레이션 : 사용자 에이전트와 같은 HTTP 요청 헤더를 설정하여 서버가 일반 브라우저 액세스라고 생각하도록합니다.
- 비동기 요청 : 최신 웹 사이트의 경우 비동기 HTTP 클라이언트는 특히 여러 API 호출이 전체 컨텐츠를 얻기 위해 여러 요청을보다 효율적으로 처리 할 수 있습니다.
- API 발견 및 활용 : 초기 HTML 컨텐츠를 분석하여 실제 데이터 API에 대한 단서를 찾은 다음 API를 직접 호출하여 구조화 된 데이터를 얻습니다.
샘플 코드 세부 사항
다음은 IBM 문서 페이지 크롤링 문제에 대한 솔루션으로, 비동기 HTTP 요청에 httpx를 사용하고, 트리오는 비동기 시간으로 실행되며, 초기 페이지에서 일반 표현식을 통해 API 경로를 추출하고 마지막으로 팬더를 사용하여 테이블을 직접 구문 분석합니다.
httpx를 가져옵니다 수입 트리오 가져 오기 re 팬더를 PD로 가져옵니다 # 브라우저 동작 시뮬레이션, 사용자 에이전트 헤더 설정 = { '사용자 에이전트': 'Mozilla/5.0 (Windows NT 10.0; Win64; X64; RV : 109.0) Gecko/20100101 Firefox/113.0' } Async def main () : # httpx.asyncclient를 사용하여 비동기식 HTTP 클라이언트 생성 및 SET BASE_URL 및 헤더 클라이언트로서 httpx.asyncclient (headers = headers, base_url = 'https : //www.ibm.com/docs')가있는 비동기 : # 첫 번째 요청 : 원래 URL에 액세스하고 API 단서가 포함 된 HTML을 얻습니다. # 참고 : Params 'Topic': 'T-AccessDateVal'은 원래 URL PARAMS = {의 쿼리 매개 변수에 해당합니다. '주제': 'T-AccessDateVal' } r = await client.get ( 'en/imdm/12.0', params = params) # 응답 텍스트에서 정규 표현식을 통해 내부 API의 경로를 추출# 예기치 않은 HTML에는 실제 콘텐츠 매치의 API 경로를 가리키는 "OldUrl"필드가 있음을 관찰하십시오. 일치하지 않는 경우 : Print ( "OldUrl이 발견되지 않았고 페이지 구조가 변경되었거나 요청이 실패했을 수 있습니다.") 반품 # 새 API URL을 구축하십시오 NURL = "API/V1/Content/"Match.Group (1) # 두 번째 요청 : 실제 데이터가 포함 된 JSON 또는 HTML 스 니펫을 얻으려면 내부 API에 액세스하십시오. 'Parsebody': 'true', '랭': 'en' } r = await client.get (nurl, params = params) # html 컨텐츠에서 직접 테이블을 구문 분석하기 위해 Pandas 'read_html 함수를 사용하여 정확도를 향상시키기 위해 구문 분석 할 테이블의 CSS 클래스 이름을 지정하려면 : df = pd.read_html (r.content, attrs = { 'class': 'defaultStyle'}) [0] 인쇄 (DF) valueError를 제외하고 E : print (f "응답에서 테이블을 구문 분석하지 못했습니다. 오류 메시지 : {e}") print ( "응답 내용 스 니펫 :", r.text [: 500]) # __name__ == "__main__"인 경우 디버깅을 위해 응답 내용의 일부를 인쇄합니다. # 트리오를 사용하여 비동기 기본 기능 trio.run (main)을 실행하십시오.
코드 구문 분석의 핵심 사항 :
- HTTPX 및 TRIO : HTTPX는 동기 및 비동기 요청을 지원하는 최신 HTTP 클라이언트입니다. 여기서는 비동기 I/O 프레임 워크 인 Trio와 결합하여 비동기 모드를 사용하여 특히 여러 URL을 동시에 처리해야 할 때 네트워크 요청을보다 효율적으로 처리합니다.
- 사용자 에이전트 : 사용자 에이전트 헤더 설정은 브라우저 동작을 시뮬레이션하는 데 중요한 단계이며, 특정 웹 사이트의 크롤링 방지 메커니즘을 효과적으로 피할 수 있습니다.
- 두 가지 요청 정책 :
- 첫 번째 요청 : 목표는 실제 콘텐츠 API 경로가 포함 된 초기 페이지를 얻는 것입니다. 이 페이지에 데이터가 직접 포함되지 않더라도 단서를 제공 할 수 있습니다. 이 경우 "Oldurl": "(.*?)"는 컨텐츠 API의 실제 경로를 가리키는 중요한 지표입니다.
- 두 번째 요청 : 첫 번째 요청에서 추출한 API 경로를 사용하고 새 URL을 구성하고 요청을 보냅니다. 이 요청의 목표는 실제 구조화 된 데이터를 얻는 것입니다. parsebody = true 및 lang = en 은이 API에 필요한 특정 매개 변수입니다.
- Re.Search : 정규식을 사용하여 HTML 텍스트에서 필요한 정보를 추출하십시오. 여기에 OldUrl의 값이 있습니다.
- pandas.read_html : 이것은 HTML 문자열 또는 파일 경로에서
태그를 직접 인식하고 구문 분석 할 수있는 매우 강력한 기능입니다. attrs = { 'class': 'defaultStyle'} 매개 변수를 사용하면 특정 CSS 클래스 이름을 가진 테이블 만 구문 분석의 정확도를 향상 시키도록 지정할 수 있습니다.
메모 및 모범 사례
- 개발자 도구는 친구입니다 . 어려움을 겪을 때 항상 브라우저의 개발자 도구 (F12)를 사용하여 네트워크 요청 (네트워크 탭)을 확인하십시오. 페이지로드 중에 발행 된 XHR/페치 요청을 관찰하면 일반적으로 데이터 API를 발견 할 수 있습니다.
- 요청 헤더의 중요성 : 사용자 에이전트 외에도 브라우저 동작을보다 현실적으로 시뮬레이션하기 위해서는 참조, 수용 언어, 쿠키 등과 같은 다른 요청 헤더를 시뮬레이션해야합니다.
- 오류 처리 : 실제 프로젝트에서는 RE.Search가 일치하는 것을 찾지 못하는 캡처 및 처리 사례와 같은보다 강력한 오류 처리 메커니즘을 추가해야합니다.
- 웹 사이트 변경 : 웹 사이트 구조 및 API는 시간이 지남에 따라 변경 될 수 있습니다. 크롤러 코드를 정기적으로 확인하고 웹 사이트 업데이트에 따라 조정하십시오.
- 로봇 계약 준수 : 웹 페이지를 크롤링 할 때 웹 사이트의 robots.txt 파일 규정을 준수하고 웹 사이트 사용 약관을 존중하십시오.
- 비동기 프로그래밍의 장점 : 많은 URL 또는 여러 API 호출이 필요한 시나리오의 경우, 비동기 HTTP 클라이언트 (예 : HTTPX 및 Asyncio/Trio)는 크롤링 효율성을 크게 향상시킬 수 있습니다.
요약
웹 크롤링에서 일관되지 않은 HTML 구조 문제에 직면하여 간단한 요청 BeautifulSoup 조합이 그렇게 할 수 없을 수 있습니다. 현대 웹 사이트의 작업 메커니즘, 특히 API에 대한 의존성을 깊이 이해함으로써보다 고급 전략을 채택 할 수 있습니다. 이 자습서는 비동기 요청에 httpx를 사용하는 방법을 보여주고, 초기 페이지를 구문 분석하여 내부 API를 발견하고,이 API를 직접 호출하여 구조화 된 데이터를 얻고, 마지막으로 pandas.read_html을 사용하여 테이블 내용을 효율적으로 추출합니다. 이 접근법은 일관되지 않은 HTML 구조의 문제를 해결할뿐만 아니라보다 복잡한 동적 웹 사이트를 처리하기위한 강력한 도구를 제공합니다.
위 내용은 동적 웹 크롤링에서 일관되지 않는 HTML 구조를 다루는 전략의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

이 기사는 JavaScript를 사용하여 이미지를 클릭하는 효과를 얻는 방법을 소개합니다. 핵심 아이디어는 HTML5의 데이터-* 속성을 사용하여 대체 이미지 경로를 저장하고 JavaScript를 통해 클릭 이벤트를 듣고 SRC 속성을 동적으로 전환하여 이미지 전환을 실현하는 것입니다. 이 기사는 일반적으로 사용되는 대화식 효과를 이해하고 마스터하는 데 도움이되는 자세한 코드 예제 및 설명을 제공합니다.

먼저 브라우저가 geolocationapi를 지원하는지 확인하십시오. 지원되는 경우 GetCurrentPosition ()을 호출하여 사용자의 현재 위치 좌표를 얻고 성공적인 콜백을 통해 위도 및 경도 값을 얻으십시오. 동시에 거부 허가, 위치의 이용 불가능 또는 시간 초과와 같은 오류 콜백 처리 예외를 제공하십시오. 또한 구성 옵션을 전달하여 높은 정밀도를 활성화하고 시간 초과 시간 및 캐시 유효성 기간을 설정할 수도 있습니다. 전체 프로세스에는 사용자 승인 및 해당 오류 처리가 필요합니다.

이 기사는 javaScript에서 document.getElementByid ()를 통해 DOM 요소를 얻을 때 NULL을 반환하는 문제를 해결하는 것을 목표로합니다. 핵심은 스크립트 실행 타이밍 및 DOM 파싱 상태를 이해하는 것입니다. 태그를 올바르게 배치하거나 DomContentLoaded 이벤트를 사용하여 요소가 사용 가능한 경우 다시 시도하여 이러한 오류를 효과적으로 피할 수 있습니다.

Nuxt3의 구성 API 코어 사용에는 다음이 포함됩니다. 1. DefinePagemeta는 제목, 레이아웃 및 미들웨어와 같은 페이지 메타 정보를 정의하는 데 사용됩니다. 이는 직접 호출해야하며 조건부 진술서에 배치 할 수 없습니다. 2. ASSHEAD는 페이지 헤더 태그를 관리하고 정적 및 반응 형 업데이트를 지원하며 SEO 최적화를 달성하기 위해 DefinePagemeta와 협력해야합니다. 3. USEASYNCDATA는 비동기 데이터를 안전하게 얻고 로딩 및 오류 상태를 자동으로 처리하며 서버 및 클라이언트 데이터 수집 제어를 지원하는 데 사용됩니다. 4. UseFetch는 USEASYNCDATA 및 $ FETCH의 캡슐화로, 요청 키를 자동으로 유추하여 중복 요청을 피하십시오.

JavaScript에서 반복 간격을 만들려면 SetInterVal () 함수를 사용해야하며, 이는 지정된 밀리 초 간격으로 기능 또는 코드 블록을 반복적으로 실행합니다. 예를 들어, setInterVal (() => {console.log ( "2 초마다 실행");}, 2000)는 ClearInterval (IntervalId)에 의해 지워질 때까지 2 초마다 메시지를 출력합니다. 실제 애플리케이션에서 클럭, 설문 조사 서버 등을 업데이트하는 데 사용할 수 있지만 최소 지연 한도와 기능 실행 시간의 영향에주의를 기울이고 더 이상 메모리 누출을 피할 필요가없는 시간 간격을 정리하십시오. 특히 구성 요소가 제거되거나 페이지가 닫히기 전에이를 확인하십시오

theBestatorReateAmulti-linestringInjavaScriptSingStisingStisingTemPlatalswithBackTicks, PRESERVEREAKENXACTLYASWRITENTINGSINGISINGSTINGISINGSTISIGINGSTISIGINSTEMPLATALSWITHTING.

이 튜토리얼은 JavaScript에서 두 개의 소수점으로 고정 된 두 가지 소수의 문자열로 숫자를 문자열로 포맷하는 방법에 대해 자세히 설명합니다. 정수도 "#.00"형식으로 표시 될 수 있습니다. 우리는 구문, 기능, 샘플 코드 및 리턴 유형이 항상 문자열 인 것과 같은 숫자의 구문, 기능, 샘플 코드 및 주요 포인트를 포함하여 숫자를 사용하는 데 중점을 둘 것입니다.

Clipboardapi의 WriteText 메소드를 사용하여 클립 보드에 텍스트를 복사하십시오. 보안 컨텍스트 및 사용자 상호 작용에서 호출되어야하며 최신 브라우저를 지원하며 기존 버전은 ExeccCommand로 다운 그레이드 될 수 있습니다.
