멀티 프로세싱을 이용한 웹스크래핑
requests와 BeautifulSoup을 사용하여 웹 페이지를 가져오고 파싱
pip install requests beautifulsoup4
코드예시
import requests
from bs4 import BeautifulSoup as bs
import time
from multiprocessing import Pool
# 스크래핑 대상 컨텐츠: https://beomi.github.io/beomi.github.io_old/
# 하이퍼 링크 읽어오기
def get_links():
data = requests.get("https://beomi.github.io/beomi.github.io_old/").text
soup = bs(data, 'html.parser')
print(type(soup)) # <class 'bs4.BeautifulSoup'>
my_titles = soup.select('h3 > a')
data = []
for title in my_titles:
data.append(title.get('href'))
return data
def get_content(link):
abs_link = "https://beomi.github.io" + link # full url 완성
# print(abs_link)
data = requests.get(abs_link).text
print(data)
# soup=bs(data,'html.parser')
# print(soup.select('h1')[0].text)
if __name__ == '__main__':
# print(get_links())
# print(len(get_links()))
start_time = time.time()
'''직렬처리
for link in get_links():
get_content(link)
'''
# 병렬처리, 프로세스 네개를 사용하고 있습니다, 자원은 더 사용하지만 속도는 더 빨라짐
pool = Pool(processes=4)
pool.map(get_content, get_links())
print("---%s 초---" % (time.time() - start_time))
# Pool을 사용하여 병렬 처리 완료
추가 설명
- get_links(): 웹 페이지에서 하이퍼링크를 읽어오는 함수입니다. requests 라이브러리를 사용하여 웹 페이지를 가져와 BeautifulSoup을 이용해 파싱합니다. 그 후, 선택자를 사용해 원하는 링크를 추출합니다.
- get_content(link): 링크를 받아 해당 페이지의 내용을 가져오는 함수입니다. 전체 URL을 완성시킨 후, requests를 사용해 해당 페이지를 가져옵니다.
- if __name__ == '__main__':: 메인 모듈에서 실행되도록 하는 블록입니다. Windows에서 multiprocessing 모듈을 사용할 때 필요합니다.
각각에 대한 처리 시간 비교
직렬: ---26.34516739845276 초---
병렬: ---13.443757057189941 초---