Python을 사용한 웹 스크래핑: 단계별 가이드

웹 스크래핑은 웹사이트에서 정보를 추출하여 특정 사용 사례에 사용하는 아이디어입니다.

웹 페이지에서 테이블을 추출하여 JSON 파일로 변환하고 내부 도구를 빌드하기 위해 JSON 파일을 사용하려고 한다고 가정해 보겠습니다. 웹 스크래핑의 도움으로 웹 페이지의 특정 요소를 타겟팅하여 원하는 데이터를 추출할 수 있습니다. Python을 사용한 웹 스크래핑은 Python이 BeautifulSoup 또는 Scrapy와 같은 여러 라이브러리를 제공하여 데이터를 효과적으로 추출하므로 매우 인기 있는 선택입니다.

데이터를 효율적으로 추출하는 기술을 갖추는 것도 개발자나 데이터 사이언티스트로서 매우 중요합니다. 이 문서는 웹사이트를 효과적으로 스크랩하는 방법을 이해하고 필요에 따라 웹사이트를 조작하는 데 필요한 콘텐츠를 얻는 데 도움이 될 것입니다. 이 자습서에서는 BeautifulSoup 패키지를 사용합니다. 파이썬에서 데이터를 스크랩하기 위한 트렌디한 패키지입니다.

웹 스크래핑에 Python을 사용하는 이유는 무엇입니까?

웹 스크레이퍼를 구축할 때 많은 개발자가 Python을 가장 먼저 선택합니다. Python이 첫 번째 선택인 데는 여러 가지 이유가 있지만 이 기사에서는 Python이 데이터 스크래핑에 사용되는 세 가지 주요 이유에 대해 논의해 보겠습니다.

라이브러리 및 커뮤니티 지원: BeautifulSoup, Scrapy, Selenium 등과 같이 웹 페이지를 효과적으로 스크랩할 수 있는 훌륭한 기능을 제공하는 몇 가지 훌륭한 라이브러리가 있습니다. 웹 스크래핑을 위한 훌륭한 생태계를 구축했으며, 또한 전 세계적으로 많은 개발자들이 이미 Python을 사용하고 있기 때문에 막혔을 때 신속하게 도움을 받을 수 있습니다.

자동화: Python은 자동화 기능으로 유명합니다. 스크래핑에 의존하는 복잡한 도구를 만들려면 웹 스크래핑 이상이 필요합니다. 예를 들어 온라인 상점에서 항목의 가격을 추적하는 도구를 구축하려는 경우 매일 요율을 추적하고 데이터베이스에 추가할 수 있도록 몇 가지 자동화 기능을 추가해야 합니다. Python은 이러한 프로세스를 쉽게 자동화할 수 있는 기능을 제공합니다.

데이터 시각화: 웹 스크래핑은 데이터 과학자들이 많이 사용합니다. 데이터 과학자는 종종 웹 페이지에서 데이터를 추출해야 합니다. Pandas와 같은 라이브러리를 사용하여 Python은 원시 데이터에서 데이터 시각화를 더 간단하게 만듭니다.

Python의 웹 스크래핑을 위한 라이브러리

웹 스크래핑을 더 간단하게 만들기 위해 Python에서 사용할 수 있는 여러 라이브러리가 있습니다. 여기에서 가장 인기 있는 세 가지 라이브러리에 대해 논의해 보겠습니다.

#1. 아름다운 수프

웹 스크래핑에 가장 많이 사용되는 라이브러리 중 하나입니다. BeautifulSoup은 2004년부터 개발자들이 웹 페이지를 스크랩하는 데 도움을 주고 있습니다. 이는 구문 분석 트리를 탐색, 검색 및 수정하는 간단한 방법을 제공합니다. Beautifulsoup 자체도 수신 및 발신 데이터에 대한 인코딩을 수행합니다. 잘 관리되고 훌륭한 커뮤니티가 있습니다.

#2. 스크래피

데이터 추출을 위한 또 다른 인기 있는 프레임워크입니다. Scrapy는 GitHub에서 43000개 이상의 별을 보유하고 있습니다. API에서 데이터를 스크랩하는 데에도 사용할 수 있습니다. 또한 이메일 보내기와 같은 몇 가지 흥미로운 내장 지원 기능이 있습니다.

#삼. 셀렌

Selenium은 주로 웹 스크래핑 라이브러리가 아닙니다. 대신 브라우저 자동화 패키지입니다. 그러나 웹 페이지 스크래핑 기능을 쉽게 확장할 수 있습니다. 다른 브라우저를 제어하기 위해 WebDriver 프로토콜을 사용합니다. 셀레늄은 거의 20년 동안 시장에 출시되었습니다. 그러나 Selenium을 사용하면 웹 페이지에서 데이터를 쉽게 자동화하고 스크랩할 수 있습니다.

Python 웹 스크래핑의 과제

웹 사이트에서 데이터를 스크랩하려고 할 때 많은 문제에 직면할 수 있습니다. 느린 네트워크, 스크래핑 방지 도구, IP 기반 차단, 캡차 차단 등과 같은 문제가 있습니다. 이러한 문제는 웹 사이트를 스크래핑하려고 할 때 엄청난 문제를 일으킬 수 있습니다.

그러나 몇 가지 방법을 따르면 문제를 효과적으로 우회할 수 있습니다. 예를 들어, 대부분의 경우 특정 시간 간격으로 전송되는 요청 수가 일정량 이상인 경우 웹 사이트에서 IP 주소를 차단합니다. IP 차단을 피하려면 요청을 보낸 후 냉각되도록 스크레이퍼를 코딩해야 합니다.

개발자는 또한 스크레이퍼용 허니팟 트랩을 설치하는 경향이 있습니다. 이러한 함정은 보통 사람의 눈에는 보이지 않지만 스크레이퍼로 기어갈 수 있습니다. 이러한 허니팟 함정을 설치하는 웹사이트를 스크랩하는 경우 그에 따라 스크레이퍼를 코딩해야 합니다.

보안 문자는 스크레이퍼의 또 다른 심각한 문제입니다. 오늘날 대부분의 웹사이트는 캡차를 사용하여 페이지에 대한 봇 액세스를 보호합니다. 이러한 경우 캡차 솔버를 사용해야 할 수도 있습니다.

파이썬으로 웹사이트 스크랩하기

논의한 대로 BeautifulSoup을 사용하여 웹사이트를 스크랩할 것입니다. 이 튜토리얼에서는 Coingecko에서 Ethereum의 과거 데이터를 스크랩하고 테이블 데이터를 JSON 파일로 저장합니다. 스크레이퍼 만들기로 넘어 갑시다.

첫 번째 단계는 BeautifulSoup 및 요청을 설치하는 것입니다. 이 자습서에서는 Pipenv를 사용합니다. Pipenv는 Python용 가상 환경 관리자입니다. 원한다면 Venv를 사용할 수도 있지만 저는 Pipenv를 선호합니다. Pipenv에 대해 논의하는 것은 이 튜토리얼의 범위를 벗어납니다. 그러나 Pipenv를 사용하는 방법을 알고 싶다면 이 가이드를 따르십시오. 또는 Python 가상 환경을 이해하려면 이 가이드를 따르세요.

pipenv shell 명령을 실행하여 프로젝트 디렉토리에서 Pipenv 셸을 시작합니다. 가상 환경에서 하위 셸을 시작합니다. 이제 BeautifulSoup을 설치하려면 다음 명령을 실행하십시오.

pipenv install beautifulsoup4

그리고 요청을 설치하려면 위와 유사한 명령을 실행합니다.

pipenv install requests

설치가 완료되면 필요한 패키지를 기본 파일로 가져옵니다. main.py라는 파일을 만들고 아래와 같이 패키지를 가져옵니다.

from bs4 import BeautifulSoup
import requests
import json

다음 단계는 기록 데이터 페이지의 내용을 가져오고 BeautifulSoup에서 사용할 수 있는 HTML 파서를 사용하여 파싱하는 것입니다.

r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

soup = BeautifulSoup(r.content, 'html.parser')

위의 코드에서 요청 라이브러리에서 사용할 수 있는 get 메서드를 사용하여 페이지에 액세스합니다. 그런 다음 구문 분석된 콘텐츠는 soup라는 변수에 저장됩니다.

오리지널 스크래핑 파트가 지금 시작됩니다. 먼저 DOM에서 테이블을 올바르게 식별해야 합니다. 이 페이지를 열고 브라우저에서 사용할 수 있는 개발자 도구를 사용하여 검사하면 테이블에 다음 클래스가 있는 것을 볼 수 있습니다. table table-stripe text-sm text-lg-normal.

Coingecko 이더리움 과거 데이터 표

이 테이블을 올바르게 대상으로 지정하려면 find 메소드를 사용할 수 있습니다.

table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'})

table_data = table.find_all('tr')

table_headings = []

for th in table_data[0].find_all('th'):
    table_headings.append(th.text)

위의 코드에서 먼저 soup.find 메서드를 사용하여 테이블을 찾은 다음 find_all 메서드를 사용하여 테이블 내의 모든 tr 요소를 검색합니다. 이러한 tr 요소는 table_data라는 변수에 저장됩니다. 테이블에는 제목에 대한 몇 가지 요소가 있습니다. 제목을 목록에 유지하기 위해 table_headings라는 새 변수가 초기화됩니다.

그런 다음 테이블의 첫 번째 행에 대해 for 루프가 실행됩니다. 이 행에서 th가 있는 모든 요소가 검색되고 해당 텍스트 값이 table_headings 목록에 추가됩니다. 텍스트는 text 메서드를 사용하여 추출됩니다. 지금 table_headings 변수를 인쇄하면 다음 출력을 볼 수 있습니다.

['Date', 'Market Cap', 'Volume', 'Open', 'Close']

다음 단계는 나머지 요소를 스크랩하고 각 행에 대한 사전을 생성한 다음 행을 목록에 추가하는 것입니다.

for tr in table_data:
    th = tr.find_all('th')
    td = tr.find_all('td')

    data = {}

    for i in range(len(td)):
        data.update({table_headings[0]: th[0].text})
        data.update({table_headings[i+1]: td[i].text.replace('n', '')})

    if data.__len__() > 0:
        table_details.append(data)

이것은 코드의 필수 부분입니다. table_data 변수의 각 tr에 대해 먼저 th 요소가 검색됩니다. th 요소는 테이블에 표시된 날짜입니다. 이 th 요소는 변수 th 안에 저장됩니다. 마찬가지로 모든 td 요소는 td 변수에 저장됩니다.

빈 사전 데이터가 초기화됩니다. 초기화 후 td 요소 범위를 반복합니다. 각 행에 대해 먼저 사전의 첫 번째 필드를 th의 첫 번째 항목으로 업데이트합니다. 코드 table_headings[0]: 일[0].text는 날짜와 첫 번째 요소의 키-값 쌍을 할당합니다.

첫 번째 요소를 초기화한 후 다른 요소는 data.update({table_headings[i+1]: td[i].text.replace(‘n’, ”)}). 여기서 td 요소 텍스트는 먼저 text 방식을 사용하여 추출한 다음 replace 방식을 사용하여 모든 n을 교체합니다. 그러면 i번째 요소가 이미 할당되어 있으므로 table_headings 목록의 i+1번째 요소에 값이 할당됩니다.

그런 다음 데이터 사전 길이가 0을 초과하면 사전을 table_details 목록에 추가합니다. table_details 목록을 인쇄하여 확인할 수 있습니다. 그러나 우리는 값을 JSON 파일에 쓸 것입니다. 이에 대한 코드를 살펴보겠습니다.

with open('table.json', 'w') as f:
    json.dump(table_details, f, indent=2)
    print('Data saved to json file...')

여기서는 json.dump 메서드를 사용하여 값을 table.json이라는 JSON 파일에 씁니다. 작성이 완료되면 json 파일에 저장된 데이터를 콘솔에 출력합니다.

이제 다음 명령을 사용하여 파일을 실행하십시오.

python run main.py

잠시 후 콘솔에서 데이터가 JSON 파일에 저장됨… 텍스트를 볼 수 있습니다. 작업 파일 디렉터리에 table.json이라는 새 파일도 표시됩니다. 파일은 다음 JSON 파일과 유사합니다.

[
  {
    "Date": "2022-11-27",
    "Market Cap": "$145,222,050,633",
    "Volume": "$5,271,100,860",
    "Open": "$1,205.66",
    "Close": "N/A"
  },
  {
    "Date": "2022-11-26",
    "Market Cap": "$144,810,246,845",
    "Volume": "$5,823,202,533",
    "Open": "$1,198.98",
    "Close": "$1,205.66"
  },
  {
    "Date": "2022-11-25",
    "Market Cap": "$145,091,739,838",
    "Volume": "$6,955,523,718",
    "Open": "$1,204.21",
    "Close": "$1,198.98"
  },
// ...
// ... 
]

Python을 사용하여 웹 스크레이퍼를 성공적으로 구현했습니다. 전체 코드를 보려면 이 GitHub 리포지토리를 방문하세요.

결론

이 기사에서는 간단한 Python 스크랩을 구현하는 방법에 대해 설명했습니다. BeautifulSoup을 사용하여 웹 사이트에서 데이터를 빠르게 스크랩하는 방법에 대해 논의했습니다. 또한 사용 가능한 다른 라이브러리와 많은 개발자가 웹사이트 스크래핑을 위해 Python을 가장 먼저 선택하는 이유에 대해서도 논의했습니다.

이러한 웹 스크래핑 프레임워크를 볼 수도 있습니다.