selenium이 webdriver를 사용해 인터넷 브라우저를 조종해 request를 보내는 방식이라 많이 느렸다.
하지만, requests는 python에서 바로 html요청을 보내기 때문에 인터넷 브라우저를 거치지 않아 훨씬 빠를꺼라고 생각해서 두 라이브러리를 비교해보기로 했다.
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
|
import time
import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve # 이미지를 저장할 때 사용
food_list = ['김치찌개']
start = time.time()
for name in food_list:# 반복문을 사용해 음식 종류 list안에 있는 음식별로 크롤링 할 수 있도록 설정
base_url = 'https://www.10000recipe.com/recipe/list.html?q={}&order=reco&page={}'
n = 1
for page in range(1, 5):
try:
url = base_url.format(name, page)
response = requests.post(url)
soup = BeautifulSoup(response.content, 'html.parser')
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
except Exception as ex: # 이미지가 없는 경우 종료
print(name + " 크롤링 완료")
print(ex)
break
print("총 소요시간 : " + str(time.time() - start))
|
cs |
코드도 조금 더 간단하다.
selenium을 사용한 코드와 거의 비슷하지만, webdriver를 쓸 필요 없이 그냥 해당 url을 POST나 GET형식으로 requests 해주면 된다.
(위의 코드에는 POST형식으로 전송했는데, GET형식이 더 빨랐다.)
GET형식이 더 빠른이유는 POST는 HTTP 메시지에 Body부분이 들어가서 그 차이가 나는 것 같다.
그리고 beautifulsoup를 사용해서 받은 response에서 이미지를 긁어와서 저장하면 끝
결과 비교
같은 사이트에서 같은 조건으로 4번 실행했을 때의 결과이다.
크롤링할때는 requests를 사용하는게 훨씬 좋을꺼같다..
selenium이 매번 브라우저를 켜야하니까 시간차이가 더 많이 나는 것 같다.
url이 바뀔때마다 브라우저를 새로 띄우지 않고 현재 브라우저에서 url만 바뀌게 짜면 더 나은 결과를 얻을 수 있을 것이다.
'프로젝트 > 음식 분류' 카테고리의 다른 글
머신러닝을 사용한 음식 분류 프로젝트 (6) (0) | 2020.09.02 |
---|---|
머신러닝을 사용한 음식 분류 프로젝트 (3) (0) | 2020.08.18 |
머신러닝을 사용한 음식 분류 프로젝트 (2) (0) | 2020.08.18 |
머신러닝을 사용한 음식 분류 프로젝트 (1) (0) | 2020.08.18 |