logo

BeautifulSoup을 사용하여 Python에서 웹 스크래핑 구현

웹사이트에서 데이터를 추출하는 방법에는 주로 두 가지가 있습니다.

  • 웹사이트의 API를 사용하세요(존재하는 경우). 예를 들어 Facebook에는 Facebook에 게시된 데이터를 검색할 수 있는 Facebook Graph API가 있습니다.
  • 웹페이지의 HTML에 액세스하여 유용한 정보/데이터를 추출합니다. 이 기술을 웹 스크래핑, 웹 수집 또는 웹 데이터 추출이라고 합니다.

이 기사에서는 Beautiful Soup이라는 Python의 웹 스크래핑 프레임워크 구현을 사용하여 웹 스크래핑과 관련된 단계를 설명합니다. 웹 스크래핑과 관련된 단계:



  1. 액세스하려는 웹페이지의 URL로 HTTP 요청을 보냅니다. 서버는 웹페이지의 HTML 콘텐츠를 반환하여 요청에 응답합니다. 이 작업에서는 Python 요청을 위한 타사 HTTP 라이브러리를 사용합니다.
  2. HTML 콘텐츠에 액세스하고 나면 데이터를 구문 분석하는 작업이 남습니다. HTML 데이터의 대부분은 중첩되어 있기 때문에 단순히 문자열 처리만으로는 데이터를 추출할 수 없습니다. HTML 데이터의 중첩/트리 구조를 생성할 수 있는 파서가 필요합니다. 사용할 수 있는 HTML 파서 라이브러리는 많지만 가장 발전된 라이브러리는 html5lib입니다.
  3. 이제 우리가 해야 할 일은 우리가 만든 구문 분석 트리를 탐색하고 검색하는 것, 즉 트리 순회입니다. 이 작업을 위해 우리는 다른 타사 Python 라이브러리를 사용할 것입니다. 아름다운 수프 . HTML 및 XML 파일에서 데이터를 가져오는 Python 라이브러리입니다.

1단계: 필수 타사 라이브러리 설치

  • Python에서 외부 라이브러리를 설치하는 가장 쉬운 방법은 pip를 사용하는 것입니다. Python으로 작성된 소프트웨어 패키지를 설치하고 관리하는 데 사용되는 패키지 관리 시스템입니다. 당신이 해야 할 일은 다음과 같습니다:
pip install requests pip install html5lib pip install bs4>

2단계: 웹페이지에서 HTML 콘텐츠에 액세스

파이썬








import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)>

자바의 예외 처리
>

>

이 코드를 이해해 보도록 하겠습니다.

  • 우선 요청 라이브러리를 가져옵니다.
  • 그런 다음 스크랩하려는 웹페이지의 URL을 지정하세요.
  • 지정된 URL로 HTTP 요청을 보내고 서버의 응답을 r이라는 응답 개체에 저장합니다.
  • 이제 r.content를 인쇄하여 원시 HTML 콘텐츠 웹페이지의 '문자열' 유형입니다.

참고: 때로는 허용되지 않음 오류가 발생할 수 있으므로 아래와 같이 브라우저 사용자 에이전트를 추가해 보세요. 여기에서 기기 및 브라우저를 기반으로 사용자 에이전트를 찾으세요. https://deviceatlas.com/blog/list-of-user-agent-strings

파이썬3


자바의 메소드



headers>=> {>'User-Agent'>:>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'>}> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r>=> requests.get(url>=>URL, headers>=>headers)> print>(r.content)>

>

>

3단계: HTML 콘텐츠 구문 분석

파이썬




#This will not run on online IDE> import> requests> from> bs4>import> BeautifulSoup> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)># If this line causes an error, run 'pip install html5lib' or install html5lib> print>(soup.prettify())>

>

>

BeautifulSoup 라이브러리의 정말 좋은 점은 html5lib, lxml, html.parser 등과 같은 HTML 구문 분석 라이브러리 위에 구축된다는 것입니다. 따라서 BeautifulSoup 개체와 파서 라이브러리 지정을 동시에 생성할 수 있습니다. 위의 예에서,

soup = BeautifulSoup(r.content, 'html5lib')>

두 개의 인수를 전달하여 BeautifulSoup 개체를 만듭니다.

    r.content : 원시 HTML 콘텐츠입니다. html5lib : 사용하려는 HTML 파서를 지정합니다.

지금 수프.예쁘게() 인쇄되어 있으며, 이는 원시 HTML 콘텐츠에서 생성된 구문 분석 트리를 시각적으로 표현합니다. 4단계: 구문 분석 트리 검색 및 탐색 이제 HTML 콘텐츠에서 유용한 데이터를 추출해 보겠습니다. 수프 개체에는 프로그래밍 방식으로 추출할 수 있는 중첩 구조의 모든 데이터가 포함되어 있습니다. 이 예에서는 몇 가지 인용문으로 구성된 웹페이지를 스크랩하고 있습니다. 그래서 우리는 이러한 인용문(및 그에 대한 모든 관련 정보)을 저장하는 프로그램을 만들고 싶습니다.

파이썬




#Python program to scrape website> #and save quotes from website> import> requests> from> bs4>import> BeautifulSoup> import> csv> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)> > quotes>=>[]># a list to store quotes> > table>=> soup.find(>'div'>, attrs>=> {>'id'>:>'all_quotes'>})> > for> row>in> table.findAll(>'div'>,> >attrs>=> {>'class'>:>'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'>}):> >quote>=> {}> >quote[>'theme'>]>=> row.h5.text> >quote[>'url'>]>=> row.a[>'href'>]> >quote[>'img'>]>=> row.img[>'src'>]> >quote[>'lines'>]>=> row.img[>'alt'>].split('>#')[0]> >quote[>'author'>]>=> row.img[>'alt'>].split('>#')[1]> >quotes.append(quote)> > filename>=> 'inspirational_quotes.csv'> with>open>(filename,>'w'>, newline>=>'') as f:> >w>=> csv.DictWriter(f,[>'theme'>,>'url'>,>'img'>,>'lines'>,>'author'>])> >w.writeheader()> >for> quote>in> quotes:> >w.writerow(quote)>

>

>

계속 진행하기 전에, 우리가 Soup.prettify() 메소드를 사용하여 인쇄한 웹페이지의 HTML 콘텐츠를 살펴보고 패턴이나 인용문을 탐색하는 방법을 찾아보는 것이 좋습니다.

  • 모든 인용문은 ID가 'all_quotes'인 div 컨테이너 내에 있는 것으로 나타났습니다. 따라서 우리는 다음을 사용하여 div 요소(위 코드에서는 테이블이라고 함)를 찾습니다. 찾다() 방법 :
table = soup.find('div', attrs = {'id':'all_quotes'})>
  • 첫 번째 인수는 검색하려는 HTML 태그이고 두 번째 인수는 해당 태그와 관련된 추가 속성을 지정하는 사전 유형 요소입니다. 찾다() 메소드는 일치하는 첫 번째 요소를 반환합니다. 인쇄를 시도할 수 있습니다. 테이블.예쁘게() 이 코드 조각이 무엇을 하는지 이해하기 위해서입니다.
  • 이제 테이블 요소에서 각 인용문은 클래스가 quote인 div 컨테이너 내에 있음을 알 수 있습니다. 따라서 클래스가 quote인 각 div 컨테이너를 반복합니다. 여기서는 인수 측면에서 find 메소드와 유사한 findAll() 메소드를 사용하지만 일치하는 모든 요소의 목록을 반환합니다. 이제 각 인용문은 다음과 같은 변수를 사용하여 반복됩니다. 열. 더 나은 이해를 위한 샘플 행 HTML 콘텐츠는 다음과 같습니다. 이제 다음 코드를 고려해보세요.
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)>
  • 견적에 대한 모든 정보를 저장하기 위해 사전을 만듭니다. 중첩된 구조는 점 표기법을 사용하여 액세스할 수 있습니다. HTML 요소 내부의 텍스트에 액세스하려면 다음을 사용합니다. .텍스트 :
quote['theme'] = row.h5.text>
  • 태그의 속성을 추가, 제거, 수정 및 액세스할 수 있습니다. 이는 태그를 사전으로 처리하여 수행됩니다.
quote['url'] = row.a['href']>
  • 마지막으로 모든 인용문은 다음 목록에 추가됩니다. 인용 부호.
  • 마지막으로 모든 데이터를 일부 CSV 파일에 저장하고 싶습니다.
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
  • 여기서는 Inspirational_quotes.csv라는 CSV 파일을 만들고 나중에 사용할 수 있도록 모든 인용문을 저장합니다.

이상으로 Python에서 웹 스크레이퍼를 만드는 방법에 대한 간단한 예였습니다. 여기에서 원하는 다른 웹사이트를 스크랩할 수 있습니다. 문의사항이 있는 경우 아래 댓글 섹션에 게시하세요.

... 자바에서

메모 : 웹 스크래핑은 많은 경우 불법으로 간주됩니다. 또한 귀하의 IP가 웹사이트에 의해 영구적으로 차단될 수도 있습니다. 이 블로그의 작성자는 다음과 같습니다. 니킬 쿠마르 .