zenn.skin 무료버전 배포중!
자세히보기

Python/Web Scraping

[웹크롤링] 미국 하의원의 홈페이지 링크 저장하기

koosco! 2020. 8. 10. 05:34

Beautifulsoup와 urllib 모듈을 이용해 'https://www.house.gov/representatives' 홈페이지에 있는 주소를 저장해 보자

 

1. 페이지의 HTML 콘텐츠 획득

HTML 문서를 불러오고 파싱을 하기 위해, urllib와 bs4 모듈을 import 한다

urlopen을 이용해 HTML 문서 내용을 불러오고 BeautifulSoup 객체를 생성한다

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = urlopen('https://www.house.gov/representatives')
bsObj = BeautifulSoup(url.read(), 'html.parser')

 

2. 링크의 추출

all_urls = [a['href']
            for a in bsObj('a')
            if a.has_attr('href')]
print(len(all_urls))

<a> tag 중 href 속성을 갖는 링크를 추출한다

 

 

- 미국의 하의원 수는 435명인데 추출된 링크는 966개로 너무 많다. <a> 태그를 모두 긁어와서 그렇다. 원하는 정보를 얻으려면 구체적인 조건이 필요하다.

 

- 저장된 링크들을 txt 파일로 저장해 확인해보자

with open('first_trial.txt', 'w') as f:
    for url in all_urls:
        f.write(url + '\n')

 

* 불필요한 링크들

 

불필요한 링크들이다

 

 

* 얻고자하는 링크들

 

얻고자 하는 링크들

 

- 규칙을 살펴보면,

1) https로 시작한다 (혹시 http도 있을 수 있으니 포함해보자)

2) .house.gov/ 또는 .house.gov 으로 끝난다

 

- 해당되는 링크를 정규표현식으로 표현하면 다음과 같다

>> 'https?://.*\.house\.gov/?$'

 

- re 모듈을 import 하고 정규표현식을 이용해 링크를 다시 찾아보자

import re

regex = r'^https?://.*\.house\.gov/?$'
refined_urls = [url for url in all_urls
              if re.match(regex, url)]

print(len(refined_urls))

 

 

- 100개가량 줄어들긴 했지만 여전히 많다..

- 한 번 걸러낸 링크들을 정렬해서 파일에 다시 저장해 보자

refined_urls.sort()
with open('second_trial.txt', 'w') as f:
    for url in refined_urls:
        f.write(url+'\n')

 

 

- 앞부분만 확인해도 겹치는 링크들이 많다. set을 이용해 겹치는 주소를 모두 걸러내 보자

refined_urls = list(set(refined_urls))
print(len(refined_urls))

 

 

- 435명에 근접한 436개의 링크를 얻을 수 있다. 1의 오차 정도면 유효하다고 판단할 수 있다

 

* 전체 코드는 다음과 같다

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = urlopen('https://www.house.gov/representatives')
bsObj = BeautifulSoup(url.read(), 'html.parser')

all_urls = [a['href']
            for a in bsObj('a')
            if a.has_attr('href')]

import re

regex = r'^https?://.*\.house\.gov/?$'
refined_urls = [url for url in all_urls
              if re.match(regex, url)]

refined_urls = sorted(list(set(refined_urls)))

with open('third_trial.txt', 'w') as f:
    for url in refined_urls:
        f.write(url+'\n')
print(len(refined_urls))

 

 

- 링크가 겹치지 않고 정렬되어 원하는 정보를 가독성 좋게 획득하였다

'Python/Web Scraping'의 다른글

  • 현재글 [웹크롤링] 미국 하의원의 홈페이지 링크 저장하기

관련글