#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 |