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