여러 페이지를 크롤링 하는 법을 배워보자.
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}§ion=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()
'Data Science > Data Science' 카테고리의 다른 글
[Data Science] 데이터 형변환 (0) | 2021.01.17 |
---|---|
[Data Science] 텍스트 파일 분석 (2) | 2021.01.12 |
[Data Science] 파이썬 크롤링 - 워드 클라우드 만들기 (0) | 2021.01.12 |
[Data Science] API 크롤링 (0) | 2021.01.07 |
[Data Science] 파이썬 크롤링 (0) | 2021.01.06 |
댓글