인스타그램 해시태그 크롤링(2)

2019. 8. 27. 21:41해봤던것들

멀티 프로세스 사용해보기

크롤링할 데이터는 많은데 파이썬에서는 기본으로 하나의 프로세스만 동작하기 대문에 시간이 오래 걸립니다.

이 문제를 해결하기 위해 파이썬에서는 멀티 프로세스, 멀티스레드 방법을 사용할 수 있습니다.

그중 멀티 프로세스 방법을 사용해서 크롤링하는 방법 사용했습니다.

 

멀티 프로세스와 멀티스레드는 아래와 같은 차이점이 있습니다.

멀티프로세스 멀티스레드
멀티 프로세싱은 CPU를 추가하여 컴퓨팅 성능을 향상 멀티 스레딩은 단일 프로세스의 다중 스레드를 만들어 컴퓨팅 성능을 향상
여러 프로세스가 동시에 실행됩니다. 단일 프로세스의 여러 스레드가 동시에 실행됩니다.
프로세스 생성은 시간 소모적이며 리소스 집약적입니다. 쓰레드 생성은 감지 시간과 자원 모두에서 경제적입니다.
다중 처리는 대칭 또는 비대칭 일 수 있습니다. 멀티 스레딩은 분류되지 않습니다.

 

multiprocessing을 import 해주고 병렬 처리를 위해 Pool을 불러옵니다.

from multiprocessing import Pool, Value, freeze_support

freeze_support는 exe파일로 만든 후 생기는 오류를 없애기 위해 추가했습니다.

디버깅과 프로그램 실행에는 아무 문제가 없지만 freeze_support를 사용하지 않고 exe파일로 만들면

계속해서 프로세스를 생성하고 처음으로 되돌아가는 것을 무한 반복합니다. 

 

Pool을 사용하는 방법은 아래와 같습니다.

p = Pool(5)
p.map(f, reallink)
p.close()

Pool(5)는 5개의 프로세스를 사용한다는 의미입니다.

P.map으로 f 함수에 데이터 변수(리스트)를 전달합니다.

P.colse()로 모든 작업 완료 후 프로세스 사용을 중지합니다. 

 

Pool을 사용하기 위해 작업할 부분을 함수에 넣어줬습니다.

def f(x):   
    frame = []
    global num 
    
    req = Request('https://www.instagram.com/p'+x,headers={'User-Agent': 'Mozilla/5.0'})
    webpage = urlopen(req).read()
    soup = BeautifulSoup(webpage,"lxml",from_encoding='utf-8')
    soup1 = soup.find("meta",attrs={"property":"og:description"})
    reallink1 = soup1['content']
    reallink1 = reallink1[reallink1.find("@")+1:reallink1.find(")")]
    reallink1 = reallink1[:20]
    if reallink1 == '':
        return
    #mylist.append(reallink1)
        
    for reallink2 in soup.find_all("meta",attrs={"property":"instapp:hashtags"}):
    
        reallink2 = reallink2['content']
        reallink2 = reallink2[:10]
        mylist = []
        
        mylist.append(reallink1)
        mylist.append(reallink2)
        
        frame.append(mylist)

    print(str(num)+"개의 데이터 저장 중")
    num += 1
    data = pd.DataFrame(frame)
    data.to_csv('insta.txt', mode='w',encoding='utf-8',header=None)

데이터가 많으면 프로그램이 불안정해져서 데이터를 얻자마자

txt 파일에 차례대로 추가해줬습니다.

 

Pool을 사용한 결과 시간이 배 이상으로 단축됐습니다.

프로세스의 수를 5개 말고 50개로 하면 더욱 빨라지겠지만

주의할 점은 프로세스의 수를 무리해서 늘리면 역효과가 날 수 있다는 점입니다.

컴퓨터의 성능에 따라 프로세스의 개수를 조절할 필요가 있습니다.

 

 


 

Yeowoolee/Instagram-crawler

Instagram-crawler. Contribute to Yeowoolee/Instagram-crawler development by creating an account on GitHub.

github.com