본문 바로가기

2019년 혁신성장 청년인재 집중양성(빅데이터)/집중양성과정 프로젝트 01

2. 파이썬 신문사 홈페이지 텍스트 크롤링

https://webnautes.tistory.com/779

 

파이썬 웹 크롤링(Web Crawling) 강좌 - 1. 웹페이지 긁어오기

Beautiful Soup를 사용하여 간단한 웹 크롤러를 만드는 방법을 다루고 있습니다. Python 3.6으로 코드를 작성하였습니다. 버전의 차이로 필요한 모듈이 달라질 수도 있습니다. 웹 크롤러(Web Crawler)는 웹문서,..

webnautes.tistory.com

이 분의 블로그를 보고 따라했다. 크롤링 주소만 다르고 동일하다.

 

 

1. 먼저 cmd창에서 BeautifulSoup4를 설치한다.

...더보기

pip install request BeautifulSoup4

 

# pip install BeautifulSoup4와 request의 차이가 무엇인지는 모르겠다. 이후에 알아봐야겠다.

 

2. 나는 중앙일보의 홈페이지를 크롤링했다. https://joongang.joins.com/?cloc=joongang|home|bi

# urllib의 urlopen과 BeautifulSoup를 설치하고
from urllib.request import urlopen
from bs4 import BeautifulSoup

# urlopen을 통해 html이라는 핸들을 만들고
# bsObject에 html이라는, html 파서를 이용하는 메쏘드를 만든다.
# bsObject의 제목을 가져온다.
html =urlopen("https://joongang.joins.com/")
bsObject = BeautifulSoup(html, "html.parser")
print(bsObject.head.title)

#bsObject의 head의 'meta'로 된 데이터를 모두 다 찾겠다. # html자체에서는 find를
# bsObject의 meta안의 'content'테그의 내용을 모두 가져와 출력한다. # 테그 내에서는 get을 쓰는 것이다?
for meta in bsObject.head.find_all('meta'):
print(meta.get('content'))

#list를 하나 생성하고
# bsObject의 모든 테그의 link라는 아이템에 대해서
# 그 link 원소 하나의 text만을 strip한 뒤에 lsit에 추가한다.
list =[]
for link in bsObject.find_all('a'):
    list.append(link.text.strip())
    print(list)

# bsObject의 모든 테그에 대해서, 그 각 원소 link에 대해 반복문을 시행한다.
# link의 text를 strip한 것과, linkdptj 'href'테그를 가져온다.
for link in bsObject.find_all('a'):
    print(link.text.strip(), link.get('href'))

 

3. 크롤링 결과

 

 

#bsobject의 모든 태그의 text를 strip하여 가져와서 list에 넣으니 그 원소들은 중첩된 리스트형 구조가 되었다.

다시 말하자면 1차원의 배열 안에 다시 1차원의 배열이 있는 것처럼 된다.

 

왜냐하면, 문자는 그 자체가 1차원의 배열 형태를 가지기 때문이다.

 

만약 내가

 

...더보기

A = [ abc, 123, def]로 배열을 선언했다면

A[0] = abc

A[0][1] = b가 된다.

 

A[1] = 123

A[1][1] = 2가 된다.

물론 여기에서 123은 문자열로 다뤄진다. 

 

또한 그렇기에, 한 리스트의 원소의 타입 형태는 모두 같아야 한다. 그렇지 않으면 일관성 있는 명령을 내려줄 수 없다.

 

3. 각각의 길이가 궁금하여 이렇게 써봤다.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

html =urlopen("https://joongang.joins.com/")
bsObject = BeautifulSoup(html, "html.parser")
#print(bsObject.head.title)

list =[]
for link in bsObject.find_all('a'):
    list.append(link.text.strip())

for i in list:
    print(len(list))

엥 365? 365인건 둘째 치고 왜 다 똑같은 거지?

 

파이썬은 잘못한 것 하나도 없다.

당연히 for문을 써서 반복을 했는데, list에 대한 길이를 내 놓으라고 하면 

나는 그냥 명령을 잘못 시킨 것이다. list의 원소 i에 대하여 반복문을 사용함으로 list가 아닌 i를 지정해주어야 한다.

 

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

html =urlopen("https://joongang.joins.com/")
bsObject = BeautifulSoup(html, "html.parser")
#print(bsObject.head.title)

list =[]
for link in bsObject.find_all('a'):
    list.append(link.text.strip())

for i in list:
    print(len(i))

반복문에 들어가야 할 것은 list가 아니라 i다.