python2019. 12. 27. 15:24
#tips
#속성 값을 dict 형태로 가져 올 수 있음.
#크롤링으로 가져온 링크에 또 다시 크롤링하여 디테일한 데이터를 가져올 수 있다.
#참고 : select_one을 사용할 경우, 리스트가 아닌 selector에 해당하는 단 한개의 데이터만 가져올 수 있다.


import requests
from bs4 import BeautifulSoup
import openpyxl



excel_file = openpyxl.load_workbook
excel_file = openpyxl.Workbook()
#기본 sheet 삭제 및 새로운 sheet 생성
#excel_file.remove(excel_file['Sheet'])
excel_file.remove(excel_file.active)
excel_sheet = excel_file.create_sheet('best 100 items in fasion')

excel_sheet.column_dimensions['A'].width = 10
excel_sheet.column_dimensions['B'].width = 100
excel_sheet.column_dimensions['C'].width = 80
excel_sheet.column_dimensions['D'].width = 80
excel_sheet.column_dimensions['E'].width = 80
excel_sheet.column_dimensions['F'].width = 80


excel_sheet.append(['rank','name','company','ceo','tel','link'])
#셀 정렬
cell_A1 = excel_sheet['A1']
cell_A1.alignment = openpyxl.styles.Alignment(horizontal='center') 

cell_A1 = excel_sheet['B1']
cell_A1.alignment = openpyxl.styles.Alignment(horizontal='center') 

cell_A1 = excel_sheet['C1']
cell_A1.alignment = openpyxl.styles.Alignment(horizontal='center') 

cell_A1 = excel_sheet['D1']
cell_A1.alignment = openpyxl.styles.Alignment(horizontal='center') 

cell_A1 = excel_sheet['E1']
cell_A1.alignment = openpyxl.styles.Alignment(horizontal='center') 

cell_A1 = excel_sheet['F1']
cell_A1.alignment = openpyxl.styles.Alignment(horizontal='center') 

site = 'http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G06'
res = requests.get(site)

soup = BeautifulSoup(res.content, 'html.parser')
##gBestWrap > div > div:nth-child(6) > div:nth-child(3) > ul > li:nth-child(1) > a
#selector = '#gBestWrap > div > div:nth-child(6) > div > ul > li > a'
selector = 'div.best-list > ul > li'
data= soup.select(selector)


for item in data:
    
    rank = item.find('p').get_text()
    name = item.find('a','itemname').get_text()
    #태그의 속성은 dict처럼 접근 가능!
    link = item.find('a','itemname')['href']
    if rank != 'PLUS':
        
        #print(rank,name,link)        
        res_sub = requests.get(link)
        soup_sub = BeautifulSoup(res_sub.content, 'html.parser')
        selector_sub = 'dl.exchange_data.seller_data > dd'
        data_sub = soup_sub.select(selector_sub)
        #참고 : select_one을 사용할 경우, 리스트가 아닌 selector에 해당하는 단 한개의 데이터만 가져올 수 있다.
        #data_sub = soup_sub.select_one(selector_sub)
      
        vendor_name = data_sub[0].get_text()
        ceo_name = data_sub[1].get_text()
        phone_number = data_sub[2].get_text()
        
        print(vendor_name,ceo_name,phone_number)
        
        excel_sheet.append([rank,name,vendor_name,ceo_name, phone_number,link])
    
excel_file.save('best100report.xlsx')
excel_file.close()

 

google sheet의 경우 

https://console.developers.google.com/

google sheet API 및 google drive API에 대한 권한을 먼저 획득 한 후,

json 형태의 사용자 정보를 가져온다. (코드에서 해당 파일을 로딩함)

 

받아온 키를 열어보면 아래의 line이 존재하며,

해당 계정을 google drive 에서 editor 권한을 주어야만 사용이 가능하다

 

  "client_email": "googlesheeteditor@first-trial-177512.iam.gserviceaccount.com",

 

 

#구글 sheet 사용법

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('first-trial-5176235391ae.json',scope)
client = gspread.authorize(creds)


sheet = client.open('report').sheet1
#data = sheet.get_all_records()
#print(data)

string = "I'm inserting a new row into a spreadsheet using python"
row = string.split()
index = 3 
sheet.insert_row(row, index)


 

 

위의 크롤링 데이터를 아래와 같이 google sheet에 저장할 수 있다.

 


import requests
from bs4 import BeautifulSoup
import gspread
from oauth2client.service_account import ServiceAccountCredentials


#구글 시트 가져오기
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('first-trial-5176235391ae.json',scope)
client = gspread.authorize(creds)


worksheet = client.open('report').sheet1
worksheet.clear()
worksheet.insert_row(['rank','name','company','ceo','tel','link'],1)


#크롤링 정보 가져오기
site = 'http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G06'
res = requests.get(site)

soup = BeautifulSoup(res.content, 'html.parser')
##gBestWrap > div > div:nth-child(6) > div:nth-child(3) > ul > li:nth-child(1) > a
#selector = '#gBestWrap > div > div:nth-child(6) > div > ul > li > a'
selector = 'div.best-list > ul > li'
data= soup.select(selector)

row=1
for item in data:
    
    rank = item.find('p').get_text()
    name = item.find('a','itemname').get_text()
    #태그의 속성은 dict처럼 접근 가능!
    link = item.find('a','itemname')['href']
    if rank != 'PLUS':
        
        #print(rank,name,link)        
        res_sub = requests.get(link)
        soup_sub = BeautifulSoup(res_sub.content, 'html.parser')
        selector_sub = 'dl.exchange_data.seller_data > dd'
        data_sub = soup_sub.select(selector_sub)
        #참고 : select_one을 사용할 경우, 리스트가 아닌 selector에 해당하는 단 한개의 데이터만 가져올 수 있다.
        #data_sub = soup_sub.select_one(selector_sub)
      
        vendor_name = data_sub[0].get_text()
        ceo_name = data_sub[1].get_text()
        phone_number = data_sub[2].get_text()
        row += 1
        print(vendor_name,ceo_name,phone_number)
        worksheet.insert_row([rank,name, vendor_name,ceo_name,phone_number,link],row)
        
  

'python' 카테고리의 다른 글

형변환 연습  (0) 2020.01.16
python 가상환경 설정  (0) 2020.01.02
정규표현식 연습 2. 반복  (0) 2019.12.26
정규표현식 연습 1.  (0) 2019.12.26
자주 쓰는 string 함수  (0) 2019.12.26
Posted by easy16