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