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(15):  
        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에서 이미지를 긁어와서 저장하면 끝

 

결과 비교

requests
selenium

같은 사이트에서 같은 조건으로 4번 실행했을 때의 결과이다.

크롤링할때는 requests를 사용하는게 훨씬 좋을꺼같다..

selenium이 매번 브라우저를 켜야하니까 시간차이가 더 많이 나는 것 같다.

url이 바뀔때마다 브라우저를 새로 띄우지 않고 현재 브라우저에서 url만 바뀌게 짜면 더 나은 결과를 얻을 수 있을 것이다.

+ Recent posts