"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


[Python] 구글에서 검색 결과로 나온 파일을 다운로드 하는 크롤러
728x90

 

구글에서 검색 결과로 나온 파일을 다운로드 하는 파이썬 크롤러를 구현해보겠습니다.

셀레니움을 이용하여 크롤링을 하기 때문에 셀레니움 드라이버가 필요합니다. 설치방법은 아래 링크에서 보시면 됩니다.

 

[Linux] 우분투에서 셀레니움 설치하고 파이썬에서 사용하기

파이썬에서 셀레니움(selenium)을 사용하기 위해서는 파이썬 셀레니움 모듈을 설치하고, OS에는 크롬을 설치해야 웹드라이버를 사용할 수 있습니다. 파이썬 selenium 모듈 설치하기 파이썬에서 셀리

jkim83.tistory.com

 

 

구글에서 파일 타입으로 검색하기

구글에서 filetype 명령을 이용하면 검색결과로 파일만 나오도록 쿼리를 만들 수 있습니다.

 

위 스샷처럼 "검색어 filetype:pdf"를 입력하면 해당 검색어와 관련되어 있는 pdf 파일을 검색해줍니다. 

워드 문서를 검색하고 싶으면 filetype에 doc를 넣으면 되고, 텍스트 파일을 검색하고 싶으면 txt를 넣으면 됩니다.

이렇게 검색한 파일을 크롤러를 이용하여 다운로드 받아 보겠습니다.

 

 

 

구글 검색 결과 파일 크롤링를 위한 준비

검색 결과로 나온 파일을 다운로드하는 크롤러를 구현하기 위해 우선 크롤링 주소를 확인해야 합니다.

 

크롤링 주소 확인하기

크롤링 시 요청할 주소를 알아야 합니다. 

파일 타입을 넣고 검색을 수행한 후 크롬의 주소창을 보면 search?q= 뒤에 쿼리가 붙어서 요청하는 것을 알 수 있습니다. 그리고 & 뒤에 있는 start에는 페이지 번호가 들어갑니다.

다시 한 번 url을 정리하면, 다음과 같습니다

 

파일 다운로드 요청을 위한 html 태그 확인하기

크롤링 요청할 주소를 알았으면, 이제 실제 파일 다운로드를 요청할 주소를 알아내야 합니다.

구글 검색 결과를 보면 pdf 아이콘 옆에 있는 부분이 다운로드 받아야 할 파일의 주소 입니다.

 

크롤링 요청한 검색 결과 페이지에서 파일의 링크가 나와 있는 URL을 가져와야 합니다.

저 URL 부분을 누르면 해당 페이지로 이동하기 때문에 <a href> 태그로 링크가 걸려 있는 부분 입니다. 단 페이지 내에 모든 a href 태그가 아닌 pdf 파일 링크가 걸려있는 a href 태그만 찾아야 하기 때문에 해당 부분의 div 태그를 찾아야 합니다.

 

크롬의 개발자도구(F12)를 열어서 해당 위치를 찾아보면 div class명은 "MjjYud"로 되어 있음을 확인할 수 있습니다.

 

 

 

구글 검색 결과 파일을 다운로드 하는 파이썬 크롤러 구현하기

구글 검색 결과 파일을 다운로드하는 크롤러 구현을 위한 준비는 끝났으니 실제 파이썬 코드를 구현해보겠습니다.

우선 셀레니움 패키지를 import하고 크롬 드라이버도 로드합니다. 또한 필요한 urlib과 beautifulsoup 패키지도 import 합니다.

 

from selenium import webdriver
import urllib.parse, os
from bs4 import BeautifulSoup

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)

 

크롤링을 요청할 주소를 정의합니다. 이때 콜론(:)은 퍼센트 인코딩 값을 넣어주거나 urllib을 이용하여 퍼센트 인코딩을 수행합니다. filetype 이후에 다운로드 할 파일의 타입을 넣어주면 됩니다.

baseurl = 'https://www.google.com/search?q='
purl = '+filetype%3Apdf&start='

 

검색할 키워드와 페이지 수도 지정합니다. 검색 키워드에 따라 페이지 수가 달라지는데 페이지 수가 맞지 않은 경우를 처리하는 예외를 넣지 않기 위해서 저는 5페이지로 지정하였습니다. path에는 파일을 다운로드 할 로컬 드라이브의 위치를 넣었습니다.

keywords = {'test', 'text', 'readme', 'dos','windows'}
page_count = 5
path = "./file_download/"

 

이제 입력받은 키워드를 돌면서 검색 결과를 요청하고, 페이지 수만큼 pdf 파일의 다운로드 링크를 얻어서 다운로드를 수행하는 코드를 구현합니다.

for word in keywords:
    for i in range(page_count):
        url = baseurl + word + urllib.parse.quote_plus(purl) + str(i)
    
        driver.get(url)

        html = driver.page_source
        soup = BeautifulSoup(html)

        r = soup.select('.MjjYud')

        for i in r:
            try:
                line = i.a.attrs['href']
                if ".pdf" == line[-4:] :
                    filename = os.path.basename(line)
                    accessDLUrl = line
                    print (accessDLUrl)
                    get_download(accessDLUrl, filename, path)
            except:
                pass

driver.close()

url에 페이지수를 합쳐서 get()으로 요청을 한 후 html 결과를 가져 옵니다.

BeautifulSoup으로 해당 html을 파싱한 후 a href 태그를 체크 합니다. pdf 파일을 다운로드 할 것이기 때문에 주소가 .pdf로 끝나는지 확인한 후 해당 주소로 다운로드 요청을 합니다. 

 

def get_download(url, fname, directory):
    try:
        os.chdir(directory)
        request.urlretrieve(url, fname)
        print('다운로드 완료')
    except Exception as e:
        print('error', e)
        
    print('\n')
    return

다운로드를 요청하는 get_download 함수는 requst의 urlretrieve를 이용해서 구현하면 됩니다.

 

지금까지 파이썬으로 구글에서 파일타입으로 검색한 결과 파일을 다운로드하는 크롤러를 구현하는 방법을 알아보았습니다. 전체 코드를 마지막으로 포스팅을 마칩니다.

 

 

from selenium import webdriver
import urllib.parse, os
from bs4 import BeautifulSoup

def get_download(url, fname, directory):
    try:
        os.chdir(directory)
        request.urlretrieve(url, fname)
        print('다운로드 완료')
    except Exception as e:
        print('error', e)
        
    print('\n')
    return

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)

baseurl = 'https://www.google.com/search?q='
purl = '+filetype%3Apdf&start='

keywords = {'test', 'text', 'readme', 'dos','windows'}
page_count = 5
path = "./file_download/"

for word in keywords:
    for i in range(page_count):
        url = baseurl + word + urllib.parse.quote_plus(purl) + str(i)
    
        driver.get(url)

        html = driver.page_source
        soup = BeautifulSoup(html)

        r = soup.select('.MjjYud')

        for i in r:
            try:
                line = i.a.attrs['href']
                if ".pdf" == line[-4:] :
                    filename = os.path.basename(line)
                    accessDLUrl = line
                    print (accessDLUrl)
                    get_download(accessDLUrl, filename, path)
            except:
                pass

driver.close()

 

 

 

 

 

 

 

728x90
728x90
LIST