빅데이터 프로그래밍/Python

[Python] 30. [Scraping] XKCD.com 이미지 다운받기 -- CHECK CHECK CHECK CHECK CHECK

밍글링글링 2017. 8. 16.
728x90

[01] https://xkcd.com 이미지 다운받기

1. Rquests 패키지 설치하기

 
C:\Users\soldesk>pip install requests

Collecting requests
  Downloading requests-2.13.0-py2.py3-none-any.whl (584kB)
    100% ■■■■■■■■■ 593kB 1.2MB/s
Installing collected packages: requests
Successfully installed requests-2.13.0

 
1. 이미지 다운로드
[실행 화면]
▷ crawler1.xkcd.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import requests, os, bs4

# http://xkcd.com/# 으로 끝나면 마지막 페이지임을 나타냄.
url    = 'http://xkcd.com'                 # starting url

# makedirs: 상위 경로도 함께 생성
# exist_ok=True:  폴더가 있으면 다시 만들지 않고 에러 발생 안됨.
# 선언을 생략하면 기존에 폴더가 있는 경우 에러가 발생됨.
os.makedirs('xkcd', exist_ok=True)    # store comics in ./xkcd
max_download = 0

while not url.endswith('#'): # url '#'으로 끝나지 않을 동안 순환
    max_download +=1
    if max_download >= 11:
        break  # 10장의 이미지 다운로드 후 while 종료
    
    # Download the page.
    print('Downloading page %s'  %url)
    res = requests.get(url)
    res.raise_for_status() # 200 OK 코드가 아닌 경우 에러 발생
    
    # res.text: 내용 추출
    bs = bs4.BeautifulSoup(res.text, 'lxml', from_encoding='utf-8')

    # Find the url of the comic image.
    # <div id="comic">
    #   <img src="//imgs.xkcd.com/comics/geochronology.png"
 # title="'The mountains near here formed when the ... Newfoundland ... 
 # microplate collided with, uhh ... Labrador.' 'Ok, now you're definitely just naming dogs.' 
 #'Wait, no, that's actually almost correct.'"
 # alt="Geochronology" srcset="//imgs.xkcd.com/comics/geochronology_2x.png 2x"> 

    comicElem = bs.select('#comic img')
    if comicElem == []:  # list가 비었는경우, 태그가 없다면
        print('태그가 발견되지 않았습니다.')
    else:
        # comicElem[0]: 첫번째 list 요소인 img 태그의 src 속성을 찾아 
        comicURL = comicElem[0].get('src').strip('//')  # // 없앰
        # Download the image.
        print('Downloading images %s... '  %(comicURL))
        res = requests.get('http://' + comicURL)
        res.raise_for_status()

        # ./xkcd 폴더에 이미지 저장
        # os.path.basename(comicURL): 순수 이미지명만 추출
        # os.path.join('xkcd', 파일명): /xkcd/파일명의 형태로 조합
        imageFile = open(os.path.join('xkcd', os.path.basename(comicURL)), 'wb')
        for chunk in res.iter_content(100000):  # 100,000 바이트씩 기록
            imageFile.write(chunk)                   # 파일 기록
        imageFile.close()                               # 파일 닫기

    # 이전 주소로 이동
    # <a rel="prev" href="/1828/" accesskey="p">Prev</a>
    prevLink = bs.select('a[rel="prev"]')[0]  
    # href 속성의 값 --> http://xkcd.com/1828 산출
    url = 'http://xkcd.com' + prevLink.get('href') 
    
print('실행 종료')




-------------------------------------------------------------------------------------
 

[실습] 자신의 다음 블로그 article에서 이미지를 모두 다운받는 프로그램을 제작하세요.
<img src="https://t1.daumcdn.net/cfile/blog/2223594F58FA34B322" class="txc-image"....

nameList = bsObj.findAll("img", {"class":"txc-image"})

▷ crawler1.daum_blog.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import requests, os, bs4

# 다음 블로그
url    = 'http://blog.daum.net' 
os.makedirs('daum_blog', exist_ok=True) 

res = requests.get(url)
res.raise_for_status() # 200 OK 코드가 아닌 경우 에러 발생
    
# res.text: 내용 추출
bs = bs4.BeautifulSoup(res.text, 'lxml', from_encoding='utf-8')

tags = bs('div', {'class': 'cont_post'})
print(type(tags))  # <class 'bs4.element.ResultSet'>
print(tags)  # list
print('갯수: ' + str(len(tags)))
print('------------------------------------------------------')        

for item in tags:
    print(item.getText())


print('실행 종료')





-------------------------------------------------------------------------------------

 

 

 

728x90

댓글