본문 바로가기
Data Science/Data Science

[Data Science] 파이썬 크롤링 2

by m2162003 2021. 1. 7.

여러 페이지를 크롤링 하는 법을 배워보자.

 

 

1. Query

url엔 쿼리라는게 존재한다. url 끝쪽에 ? 뒤에 있는 부분이 쿼리다.

 

이 쿼리를 바꾸는 방법으론 스트링을 직접 붙이는 방법도 있다.

for i in range(0,5):
	url = f"http://sports.donga.com/Enter?p={(i*20 + 1)}"

그치만...안예쁘다. 우리가 배운 requests 모듈을 사용해보자

 

params 매개변수에 딕셔너리를 전달하여 쿼리를 전달한다. 

url = "https://news.naver.com/main/main.nhn" # ? 전까지
result = requests.get(url, params={'mode':'LSD', 'mid':'shm', 'sid1':102})

 

 

2. 태그와 속성

태그마다 속성이라는게 존재한다. class, id 이런 게 속성이다.

태그에 어떤 속성이 있는지 확인하고 싶다면 attrs 멤버 변수를 출력한다.

 

div = soup.find("div")
print(div.attrs)
print(div['class'])

attrs 딕셔너리의 키로 인덱싱하여 태그 속성에 접근할 수 있다.

 

하이퍼 링크의 url로 넘어가고 싶을 때 위의 인덱싱을 사용하면 된다.

링크를 걸 땐 a 태그에 href 속성을 사용하므로 아래와 같이 링크를 불러올 수 있다.

a = soup.find('a')
href_url = a['href']

 

3. children과 name 속성

children은 해당 태그의 자식 태그 리스트를 return

name은 태그의 이름을 return한다. 태그가 없다면 none값을 리턴한다.

soup.find("div").children

# div가 포함하는 태그 리스트가 return

 

 

4. 예제

영화 제목을 입력하면 가장 상단에 있는 검색 결과에 해당하는 영화의 리뷰 제목들을 리스트에 담아서 출력하는 예제이다. 

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    ul = soup.find('ul', class_='rvw_list_area')
    res = []
    for li in ul.find_all('li'):
        res.append(li.find('a').find('strong').get_text())
    return res
    
def get_href(soup) :
    # 검색 결과, 가장 위에 있는 영화로 접근할 수 있는 href를 반환하세요.
    ul = soup.find('ul', class_='search_list_1')
    href = ul.find('li').find('p', class_='result_thumb').find('a')['href']
    href = href.replace('basic', 'review')
    return 'https://movie.naver.com' + href
    

def get_url(movie) :
    # 입력된 영화를 검색한 결과의 url을 반환하세요.
    return f'https://movie.naver.com/movie/search/result.nhn?query={movie}&section=all&ie=utf8'
    
def main() :
    list_href = []
    
    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    # 섹션을 입력하세요.
    movie = input('영화 제목을 입력하세요. \n  > ')
    
    url = get_url(movie)
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")
    
    movie_url = get_href(soup)
    href_req = requests.get(movie_url)
    href_soup = BeautifulSoup(href_req.text, "html.parser")
    
    list_href = crawling(href_soup)
    print(list_href)
    


if __name__ == "__main__" :
    main()

댓글