어두운 proxyscrape 로고

웹 스크래핑, 정규식, 데이터 시각화, 이 모든 것을 파이썬으로 하기

Python, 스크래핑, Nov-02-20225분 읽기

Web scraping can be defined as the method of collecting and restructuring data from websites. It can also be defined as the programmatic approach of obtaining website data in an automated manner. For instance, you want to extract the email IDs of all people who commented on a Facebook post. You can do this by

목차

웹 스크래핑은 웹사이트에서 데이터를 수집하고 재구성하는 방법으로 정의할 수 있습니다. 또한 웹사이트 데이터를 자동화된 방식으로 획득하는 프로그래밍 방식이라고 정의할 수도 있습니다. 예를 들어 Facebook 게시물에 댓글을 단 모든 사람의 이메일 ID를 추출하고 싶다고 가정해 보겠습니다. 이 작업은 두 가지 방법으로 수행할 수 있습니다. 먼저, 커서를 원하는 사람의 이메일 주소 문자열로 가리킬 수 있습니다. 그런 다음 이를 복사하여 파일에 붙여넣을 수 있습니다. 이 방법을 수동 스크래핑이라고 합니다. 하지만 2000개의 이메일 ID를 수집하려면 어떻게 해야 할까요? 웹 스크래핑 도구를 사용하면 수동 스크래핑을 사용할 경우 3시간이 걸리던 것을 30초 만에 모든 이메일 ID를 추출할 수 있습니다.

웹 스크래핑 도구를 사용해 웹사이트에서 정보를 추출할 수 있습니다. 클릭하는 방법만 알면 되고 프로그래밍 지식이 필요하지 않습니다. 이러한 도구는 리소스 효율적이며 시간과 비용을 절약할 수 있습니다. 네트워크 대역폭에 대한 걱정 없이 필요에 따라 수백만 개의 페이지를 스크랩할 수 있습니다. 일부 웹사이트는 스크래퍼가 데이터를 수집하지 못하도록 안티 봇을 구현하기도 합니다. 하지만 좋은 웹 스크래핑 도구에는 이러한 도구를 우회하고 원활한 스크래핑 환경을 제공하는 기능이 내장되어 있습니다.

파이썬의 웹 스크래핑

Python에는 웹에서 데이터를 스크랩할 수 있는 훌륭한 도구가 있습니다. 예를 들어 요청 라이브러리를 가져와서 웹 페이지에서 콘텐츠를 검색하고 bs4(BeautifulSoup)를 사용하여 관련 정보를 추출할 수 있습니다. 아래 단계에 따라 Python에서 웹 스크래핑을 수행할 수 있습니다. 웹사이트에서 정보를 추출하겠습니다. 

가져오기 요청:

웹사이트의 HTML을 가져오려면 요청 라이브러리를 가져와야 합니다. 

가져오기 요청

GET 요청:

웹사이트에 GET 요청을 해야 합니다. 요청.get() 함수에 URL을 붙여넣으면 됩니다.

r = requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

콘텐츠를 추출합니다:

r.content를 사용하여 웹사이트의 콘텐츠를 추출합니다. 웹사이트의 콘텐츠를 바이트 단위로 제공합니다. 

c = r.content

BeautifulSoup을 가져옵니다:

웹 페이지에서 정보를 쉽게 스크랩할 수 있도록 BeautifulSoup 라이브러리를 가져와야 합니다.

bs4에서 BeautifulSoup 가져오기

수프 개체를 만듭니다:

콘텐츠에서 BeautifulSoup 객체를 생성하고 여러 메서드를 사용하여 구문 분석해야 합니다.

soup = BeautifulSoup(c)
print(soup.get_text())

다음과 같은 결과물(일부일 뿐)을 얻을 수 있습니다.

유용한 데이터를 추출합니다:

원하는 데이터를 추출해야 하므로 올바른 CSS 선택기를 찾아야 합니다. 수프 객체의 .find() 메서드를 사용하여 웹 페이지의 주요 콘텐츠를 찾을 수 있습니다.

main_content = soup.find('div', attrs = {'class': 'entry-content'})

.text 속성을 사용합니다:

수프의.text 속성을 사용하여 테이블에서 정보를 텍스트로 검색할 수 있습니다.

content = main_content.find('ul').text
print(content)

테이블의 텍스트를 문자열로 검색했습니다. 하지만 이 정보는 텍스트 문자열의 특정 부분을 추출하면 매우 유용하게 사용될 것입니다. 이 작업을 수행하려면 정규 표현식으로 넘어가야 합니다.

파이썬의 정규 표현식

정규식(RegEx)은 검색 패턴을 정의하는 패턴의 시퀀스입니다. 기본 개념은 다음과 같습니다:

  • 텍스트 문자열에서 일치시킬 패턴을 정의합니다. 
  • 문자열에서 검색하여 일치하는 항목을 반환합니다.

텍스트 테이블에서 다음과 같은 정보를 추출하고 싶다고 가정해 보겠습니다.

  • 급여
  • 대학 이름
  • 사장단 이름

아래 설명된 단계에 따라 세 가지 정보를 추출할 수 있습니다.

01단계:

re를 가져와서 급여를 추출하려면 급여 패턴을 만들어야 합니다. re.compile() 메서드를 사용하여 문자열로 제공된 정규식 패턴을 RegEx 패턴 객체로 컴파일합니다. 또한 pattern.findall() 을 사용하여 일치하는 모든 항목을 찾아 문자열 목록으로 반환할 수 있습니다. 각 문자열은 하나의 일치 항목을 나타냅니다.

import re
salary_pattern = re.compile(r'\$.+')
salaries = salary_pattern.findall(content)

02단계:

동일한 절차를 반복하여 대학 이름을 추출합니다. 패턴을 만들고 이름을 추출합니다. 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

03단계:

같은 절차를 반복하여 대통령의 이름을 추출합니다. 패턴을 만들고 필요한 이름을 추출합니다. 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

04단계:

급여는 지저분해 보이고 이해하기 어렵습니다. 그래서 우리는 문자열 급여를 숫자로 변환하기 위해 Python 목록 이해력을 사용합니다. 문자열 조각화, 분할 및 조인, 목록 이해력을 사용하여 원하는 결과를 얻습니다.

salaries = ['$876,001', '$543,903', '$2453,896']
[int(''.join(s[1:].split(','))) for s in salaries]

출력은 다음과 같습니다:

파이썬으로 데이터 시각화

데이터 시각화는 데이터를 시각적으로 이해하여 추세, 패턴, 상관관계를 파악할 수 있도록 도와줍니다. 대량의 데이터를 그래프, 차트 및 기타 시각적 자료로 변환하여 이상값을 식별하고 가치 있는 인사이트를 얻을 수 있습니다.

아래와 같이 matplotlib를 사용하여 데이터를 시각화할 수 있습니다.

아래와 같이 필요한 라이브러리를 가져옵니다.

pandas를 pd로 가져옵니다.
matplotlib.pyplot을 plt로가져옵니다.

학교, 이름, 급여에 대한 판다 데이터 프레임을 만드세요. 예를 들어, 학교를 다음과 같이 데이터 프레임으로 변환할 수 있습니다:

df_school = pd.DataFrame(schools)
print(df_school)

출력은 다음과 같습니다:

마찬가지로 급여와 이름도 동일하게 변경할 수 있습니다.

데이터 시각화를 위해 아래와 같이 막대 그래프를 그릴 수 있습니다.

df.plot(kind='barh', x = 'President', y = 'salary')

출력은 다음과 같습니다:

웹 스크래핑에 프록시가 필요한 이유는 무엇인가요?

웹 스크래핑은 기업이 시장 인사이트와 산업에 대한 유용한 정보를 추출하여 데이터 기반 서비스를 제공하고 데이터에 기반한 의사 결정을 내리는 데 도움이 됩니다. 프록시는 다음과 같은 이유로 다양한 웹사이트에서 데이터를 효과적으로 스크랩하는 데 필수적입니다.

  • IP 금지 방지 - 스크레이퍼가 너무 많은 요청을 하는 것을 막기 위해 비즈니스 웹사이트는 크롤링 속도라고 하는 크롤링 가능한 데이터의 양을 제한합니다. 크롤링 속도가 높으면 웹사이트의 속도가 느려지고 사용자가 원하는 콘텐츠에 효과적으로 액세스하기 어려워집니다. 그러나 충분한 프록시 풀을 사용하여 데이터를 스크레이핑하면 대상 웹사이트의 크롤링 속도 제한을 통과할 수 있습니다. 프록시가 서로 다른 IP 주소에서 요청을 전송하므로 요구 사항에 따라 웹 사이트에서 데이터를 추출할 수 있기 때문입니다.
  • 지역별 콘텐츠 액세스 활성화 - 기업은 특정 지역의 고객에게 적절한 제품 기능과 가격을 제공하는지 경쟁사(웹사이트)를 모니터링해야 합니다. IP 주소가 있는 거주지 프록시를 사용하여 해당 지역에서 제공되는 모든 콘텐츠에 액세스할 수 있습니다.
  • 보안 강화 - 프록시 서버는 사용자 디바이스의 IP 주소를 숨겨 보안을 한층 더 강화합니다.

위의 혜택을 받으려면 몇 개의 프록시가 필요한지 알고 있나요? 다음 공식을 사용하여 필요한 프록시 수를 계산할 수 있습니다:

프록시 수 = 액세스 요청 수 / 크롤링 속도

액세스 요청 횟수는 다음 매개변수에 따라 달라집니다.

  • 스크래퍼가 웹사이트에서 정보를 추출하는 빈도입니다.
  • 사용자가 스크랩하려는 페이지 수

반면 크롤링 속도는 사용자가 특정 시간 동안 요청하는 횟수에 따라 제한됩니다. 일부 웹사이트에서는 자동화된 요청과 사람에 의한 요청을 구분하기 위해 사용자당 요청 횟수를 제한하기도 합니다. 

파이썬에서 프록시 사용

아래 단계에 따라 Python에서 프록시를 사용할 수 있습니다.

  • 파이썬의 요청 모듈을 가져와야 합니다.
가져오기 요청
  • 프록시 풀을 생성하여 로테이션할 수 있습니다.
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
  • 요청.get()을 사용하여 URL에 프록시를 매개변수로 전달하여 GET 요청을 보낼 수 있습니다.
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • 연결 오류가 없는 경우 요청된 URL의 콘텐츠를 가져올 수 있습니다.
인쇄(페이지.텍스트)

출력은 다음과 같습니다:

결론

수동 스크래핑 대신 웹 스크래핑을 사용하여 웹 사이트에서 데이터를 추출할 수 있다고 설명했습니다. 웹 스크래핑은 비용 효율적이고 시간을 절약할 수 있는 프로세스입니다. 기업은 웹 정보를 수집하고 재구성하여 데이터 기반의 의사 결정을 내리고 가치 있는 인사이트를 얻기 위해 웹 스크래핑을 사용합니다. 프록시를 사용하면 대상 웹사이트로부터 사용자의 원래 IP 주소를 숨길 수 있으므로 안전한 웹 스크래핑을 위해 프록시를 사용하는 것이 필수적입니다. 웹 스크래핑에는 데이터센터 또는 주거용 프록시를 사용할 수 있습니다. 그러나 주거용 프록시는 속도가 빠르고 쉽게 감지되지 않으므로 주거용 프록시를 사용하는 것을 선호합니다. 또한 파이썬의 정규 표현식을 사용하여 문자열 집합을 일치시키거나 찾을 수 있습니다. 즉, 정규식을 사용해 텍스트에서 어떤 문자열 패턴이든 추출할 수 있습니다. 또한 데이터 시각화는 방대한 양의 데이터를 차트, 그래프 및 기타 시각적 자료로 변환하여 이상 징후를 감지하고 데이터의 유용한 추세를 파악하는 데 도움이 된다는 것을 확인했습니다.