저번 코드에서 21번째 페이지까지 간 뒤에 다시 11번째 페이지로 돌아가는 문제점이 있었다.
모두의 레시피 사이트의 검색 URL이 끝에 한자리씩만 1씩 증가된다는 점을 생각해 반복문으로 해당 값을 1씩 증가시켜 URL을 이동하고 크롤링 한 뒤, 사이트를 종료하고 다시 1 증가한 새로운 URL을 띄우는 방식으로 문제를 해결했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
food_list = ['김치찌개', '떡볶이']
for name in food_list:# 반복문을 사용해 음식 종류 list안에 있는 음식별로 크롤링 할 수 있도록 설정
n = 1 # 크롤링 결과 사진에 숫자를 하나씩 증가시키기 위한 변수
# list에서 받아온 값을 넣은 url 생성
base_url = 'https://www.10000recipe.com/recipe/list.html?q={}&order=reco&page={}'
for page in range(1, 100):
try:
url = base_url.format(name, page)
driver = webdriver.Chrome(ChromeDriverManager().install()) # 구글 크롤링에 사용하기 위한 코드 (크롬 브라우저를 사용할 것임)
driver.get(url) # url 변수를 크롬으로 열 수 있도록
html = driver.page_source # 페이지의 elements 전부 가져오기
soup = BeautifulSoup(html) # BeautifulSoup 사용
images = soup.findAll("a", {"class" : "common_sp_link"}) # 이미지 클래스의 값을 불러옴
if not images: # 빈 리스트인 경우
raise ex
imgurl = [] # 이미지 url을 저장하기 위한 변수
for i in images:
temp = i.img['src']
if temp.endswith('png') is False: # png형식의 파일은 저장하지 않는다.
imgurl.append(i.img['src']) # 이미지의 source 주소를 가져와 imgurl list에 추가한다
for i in imgurl:
urlretrieve(i, "음식 사진/" + name + str(n) + ".jpg") # 크롤링한 사진에 1씩 값을 증가해 저장한다
n += 1
print(str(page) + "번째 페이지 크롤링 중...")
driver.quit()
except Exception as ex: # 이미지가 없는 경우 종료
print(name + " 크롤링 완료")
driver.quit()
break
|
cs |
24번째 페이지까지 있다고 가정하는 경우 예외처리를 해주지 않으면 25번째, 26번째… 100번째까지 이미지가 존재하지 않는 URL을 계속 탐색하기 때문에 예외처리를 통해 이미지가 없는 URL이 나오면(페이지가 더 없으면) 반복문을 종료하고 다음 요리를 크롤링하도록 했다.
차후 과제
Requests 라이브러리를 사용해서 크롤링 할 수 있다고 하는데, Requests를 사용한 것과 Selenium을 사용한 것의 속도를 비교해 어떤 것이 더 좋은지 확인해 볼 예정이다.
'프로젝트 > 음식 분류' 카테고리의 다른 글
머신러닝을 사용한 음식 분류 프로젝트 (6) (0) | 2020.09.02 |
---|---|
머신러닝을 사용한 음식 분류 프로젝트 (4) (0) | 2020.08.18 |
머신러닝을 사용한 음식 분류 프로젝트 (2) (0) | 2020.08.18 |
머신러닝을 사용한 음식 분류 프로젝트 (1) (0) | 2020.08.18 |