본문 바로가기

Machine Learning(머신러닝)

Python을 이용한 인스타그램 태그 크롤링

파이썬을 이용해서 인스타그램의 태그를 크롤링해 보도로 한다. 

웹 크롤링은 여러가지 방법과 라이브러리를 이용해서 할 수 있다. 

여기서는 최소한의 노력(?) 으로 인스타그램의 사진을 얻어 오도록 해 본다. 


우선 github에서 instagram crawler 를 찾아 보도록 하자. 많은 사람들이 자신이 만든 코드를 올려 놓은 것을 알 수 있다. 

오늘 사용할 소스는 아래 github repository를 사용하도록 한다.


https://github.com/huaying/instagram-crawler.git


code를 받는 방법은 간단하다. git 을 이용해서 아래와 같이 git clone 을 할 수도 있으며, 홈페이지에서 다운로드 받을 수도 있다. git clone 만 할 줄 알면 여러가지 유용한 코드를 무료로 받을 수 있으니 익혀 두도록 하자. 

git clone https://github.com/huaying/instagram-crawler.git


위의 홈페이지에 README.md를 보면 잘 알겠지만. 기본은 크롤링한 데이터를 json 형태로 받아 주고 있다. 

이 파일을 받아서 유용하게 사용할 수 도 있지만, jpg 파일을 바로 받고 싶어할 수도 있다. 


여기에서는 위의 코드에서 몇줄을 추가하여 내가 원하는 사진을 바로 받는 것을 해 보도록 한다. 

위의 코드를 사용하게 되면 아래와 같은 구조를 가진 데이터를 받게 된다. 이 중 사진의 주소는 img_url 키가 가지고 있다. 

따라서, 이 키를 가지고 사진을 받는 코드를 추가해 주면 된다. 


한 개의 img_url을 포함하는 json data를 받아서 저장하는 코드를 만들어 보자. 


1
2
3
4
def crawl_image_one( x, out_path):
    fname =  x['img_url'].split('/')[-1].split('.jpg')[0+ '.jpg'
    #print(fname)
    urllib.request.urlretrieve(x['img_url'], os.path.join( out_path, fname))
cs


이제 위의 함수를 여러개의 주소를 한 번에 받는 코드를 작성해 보자. 

시간을 줄이기 위해 multi thread로 빠르게 받아 보자. 

tqdm을 사용하면 진행 과정을 progressive bar를 통해 쉽게 확인 할 수 있다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def crawl_and_save(tag, out_path, num=100):
    
    # Create when directory does not exist
    if not os.path.isdir(out_path):
        os.makedirs(out_path)
        
    data_raw = crawler.get_posts_by_hashtag(tag, num)
    crawler.save_to_json(data_raw, os.path.join(out_path, tag + '.json'))
    cores = 8
    
    with Pool(cores) as pool:
        tqdm.tqdm(pool.starmap(crawl_image_one, zip(data_raw, repeat(out_path))), total=len(data_raw))
        #df = pd.concat(r)
        pool.close()
        pool.join()
 
 
cs


자 거의 다 되었다. 

이제 만든 함수를 이용하여 사진을 긁어와 보자. 


1
2
3
4
5
TAG='architectural'
out_path='./' + TAG
st = time.time()
crawl_and_save(TAG, out_path, num=10000)
print('tatal time: ', time.time() -st)
cs


태그 이름이 architectural 인 아름다운 사진 10000장을 긁어 오는 것을 볼 수 있다.