웹사이트에서 데이터를 추출하는 방법에는 주로 두 가지가 있습니다.
- 웹사이트의 API를 사용하세요(존재하는 경우). 예를 들어 Facebook에는 Facebook에 게시된 데이터를 검색할 수 있는 Facebook Graph API가 있습니다.
- 웹페이지의 HTML에 액세스하여 유용한 정보/데이터를 추출합니다. 이 기술을 웹 스크래핑, 웹 수집 또는 웹 데이터 추출이라고 합니다.
이 기사에서는 Beautiful Soup이라는 Python의 웹 스크래핑 프레임워크 구현을 사용하여 웹 스크래핑과 관련된 단계를 설명합니다. 웹 스크래핑과 관련된 단계:
- 액세스하려는 웹페이지의 URL로 HTTP 요청을 보냅니다. 서버는 웹페이지의 HTML 콘텐츠를 반환하여 요청에 응답합니다. 이 작업에서는 Python 요청을 위한 타사 HTTP 라이브러리를 사용합니다.
- HTML 콘텐츠에 액세스하고 나면 데이터를 구문 분석하는 작업이 남습니다. HTML 데이터의 대부분은 중첩되어 있기 때문에 단순히 문자열 처리만으로는 데이터를 추출할 수 없습니다. HTML 데이터의 중첩/트리 구조를 생성할 수 있는 파서가 필요합니다. 사용할 수 있는 HTML 파서 라이브러리는 많지만 가장 발전된 라이브러리는 html5lib입니다.
- 이제 우리가 해야 할 일은 우리가 만든 구문 분석 트리를 탐색하고 검색하는 것, 즉 트리 순회입니다. 이 작업을 위해 우리는 다른 타사 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가 웹사이트에 의해 영구적으로 차단될 수도 있습니다. 이 블로그의 작성자는 다음과 같습니다. 니킬 쿠마르 .