ecsimsw
Crawling / Scraping / 구글 이미지 크롤러 본문
1) urllib / BeautifulSoup
- Beautiful Soup is a Python library for pulling data out of HTML and XML files.
#example1
from bs4 import BeautifulSoup
html ="""
<html>
<body>
<h1> jinhwan </h1>
<p> web page </p>
<p id="point"> main point is... </p>
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.body.h1) # <h1> jinhwan </h1>
print(soup.body.p) # webpage
pointSentence = soup.find(id="point")
print(pointSentence) # <p id="point"> main point is... </p>
pList = soup.find_all("p")
for p in pList:
print(p)
#example2 :: Get naver movie ranking of the date
import urllib.request as req
import urllib.parse as parse
from bs4 import BeautifulSoup
f=open("/movie.txt",'w',-1,"utf-8")
url = "https://movie.naver.com/movie/sdb/rank/rmovie.nhn"
pageNumber=1
movieNumber=1
while(pageNumber<10):
date ={
'sel':'pnt',
'date':'20200102',
'page':pageNumber
}
source = req.urlopen(url+"?"+parse.urlencode(date))
soup = BeautifulSoup(source,'html.parser')
titleList = soup.find_all('div', 'tit5')
pointList = soup.find_all('td','point')
for i in range(len(titleList)):
data = str(movieNumber)+ " : "+titleList[i].text.replace('\n','')+ " "+ pointList[i].text.replace('\n','')
print(data)
f.writelines(data+"\n")
movieNumber += 1
pageNumber +=1
f.close()
2) sellenium
- Selenium is a portable framework for testing web applications. Use when you want to crawling web page with dynamic control, like paging, pushing buttons.
import urllib.request
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
driver = webdriver.Chrome("C:/Users/user/Desktop/chromedriver.exe")
driver.implicitly_wait(30)
url = "https://catalog.antiquorum.swiss/en/auctions/geneva-2019-11-10/lots"
driver.get(url)
body = driver.find_element_by_css_selector('body')
for i in range(100):
body.send_keys(Keys.PAGE_DOWN)
time.sleep(0.1)
soup = BeautifulSoup(driver.page_source,"html.parser")
watches = soup.find_all(class_ = "pt-2 shadow-sm p-2")
for w in watches:
if(w.text.find("Model") != -1):
print(w.text.split('\n')[2])
else:
print("Model : ---")
3) Example :: Google image crawler
https://ecsimsw.tistory.com/entry/Google-image-crawler-Crawling-Scraping-python?category=813255
- 파이썬으로 크롤링을 공부하고 이를 연습해보기 위한 간단한 프로젝트로 구글 이미지 다운로더를 만들었다.
- 구글에서 검색하고자 하는 이미지를, 미리 정의해둔 개수만큼 저장한다. 언어는 python, 라이브러리는 Urllib, BeautifulSoup4, Selenium을 주로 사용하였다.
1. 초기 변수 설정
import sys, os
from bs4 import BeautifulSoup
from selenium import webdriver
import urllib, urllib.request
import requests
import random
import time
from selenium.webdriver.common.keys import Keys
###initial set
folder = ".image/"
url = "https://www.google.com/search"
webDriver = "./chromedriver.exe"
searchItem = "door"
size = 3000
params ={
"q":searchItem
,"tbm":"isch"
,"sa":"1"
,"source":"lnms&tbm=isch"
}
- webDriver : 웹 드라이버 브라우저를 코드로 제어하여 동적인 웹 페이지의 정보를 가져올 수 있도록 한다. 이 코드에서는 웹 드라이버를 자동으로 페이지 다운하여, 한 html 소스에 더 많은 이미지를 담기 위해 사용한다.
2. 브라우저 구동
url = url+"?"+urllib.parse.urlencode(params)
browser = webdriver.Chrome(webDriver)
time.sleep(0.5)
browser.get(url)
html = browser.page_source
time.sleep(0.5)
- 파라미터를 인코딩하여 url 주소에 합치고 webDriver를 구동하여 해당 url를 로드한다. 너무 빠른 처리는 구글에게 제한 당할 수 있기 때문에, 브라우저를 열고 url 로드 전에 한번, 로드 후에 한번 약간의 지연을 줬다.
3. Page Down
### get number of image for a page
soup_temp = BeautifulSoup(html,'html.parser')
img4page = len(soup_temp.findAll("img"))
### page down
elem = browser.find_element_by_tag_name("body")
imgCnt =0
while imgCnt < size:
elem.send_keys(Keys.PAGE_DOWN)
rnd = random.random()
print(imgCnt)
time.sleep(rnd)
imgCnt+=img4page
- 현재 기본 페이지의 html 코드에서 img 태그를 모두 찾아 그 수를 세는 것으로 한 페이지 당 이미지의 개수를 변수로 저장하였다. imgCnt가 미리 정의해둔 size만큼 커질 때까지 페이지를 내린다.
4. html 가공, src 추출
html = browser.page_source
soup = BeautifulSoup(html,'html.parser')
img = soup.findAll("img")
browser.find_elements_by_tag_name('img')
fileNum=0
srcURL=[]
for line in img:
if str(line).find('data-src') != -1 and str(line).find('http')<100:
print(fileNum, " : ", line['data-src'])
srcURL.append(line['data-src'])
fileNum+=1
- 브라우저의 html 코드를 읽고, img 태그의 data-src가 있는 line만 걷어 리스트에 추가한다. fileNum 변수로 이미지의 개수를 센다.
*** line에 data-src가 먼저 있는지 확인하고 line['data-src']를 처리해야한다.
5. 폴더 생성, 파일 저장
### make folder and save picture in that directory
saveDir = folder+searchItem
try:
if not(os.path.isdir(saveDir)):
os.makedirs(os.path.join(saveDir))
except OSError as e:
if e.errno != errno.EEXIST:
print("Failed to create directory!!!!!")
raise
for i,src in zip(range(fileNum),srcURL):
urllib.request.urlretrieve(src, saveDir+"/"+str(i)+".jpg")
print(i,"saved")
- 폴더의 존재 여부를 확인하고, 폴더를 생성 후, 파일을 저장한다.
*** urllib.request.urlretrieve는 폴더를 생성하지 못하는 것 같다. 폴더를 생성하고 그 위치를 지정해줘야 한다.
result
- 한 500개 정도의 문 사진을 저장해보았다.
- 사실 이미 더 좋고 안정적인 모듈이 있어서 직접 데이터 뽑을 때는 사용하지 않을 것 같지만, 연습용으로는 간단하게 재밌었다.
https://github.com/hardikvasa/google-images-download
'Machine Learning' 카테고리의 다른 글
Cross validation / 교차 검증 / 모델 평가 (0) | 2020.01.29 |
---|---|
Support Vector Machine / Random Forest / 언어 구분 학습 (0) | 2020.01.29 |
Scikit-learn / SVM (0) | 2020.01.24 |
Machine Learning / Generic Algorithm (0) | 2019.11.23 |
Teachable machine / teachable machine 사용법 / 구글 티쳐블 머신 (0) | 2019.11.23 |