별칭 Alias
별칭은 as로
생략 가능하지만 쓰는 것이 가독성 좋음
별칭에 띄어쓰기가 들어가면 따옴표 처리
뭔가의 컬럼에서 제일 상단 혹은 하단의 데이터만 추출할거면
굳이 서브쿼리 사용하지 않고
정렬한 후에 limit으로 행 수 정하고 출력하기
별칭 Alias
별칭은 as로
생략 가능하지만 쓰는 것이 가독성 좋음
별칭에 띄어쓰기가 들어가면 따옴표 처리
뭔가의 컬럼에서 제일 상단 혹은 하단의 데이터만 추출할거면
굳이 서브쿼리 사용하지 않고
정렬한 후에 limit으로 행 수 정하고 출력하기
지마켓 컴퓨터/가전 부분 베스트 상품 타이틀과 가격 추출하기
import requests
from bs4 import BeautifulSoup
res = requests.get('http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G06') : 어디에서 어떻게 페이지 주소가 달라지는지도 유심히 보기
soup = BeautifulSoup(res.content, 'html.parser')
bestitem = soup.select('div.best-list li') : 집합 관계에서 A에 대한 abc추출, B에 대한 abc추출 이렇게 하려면 크게 A B C ... 를 추출한 후에 각각에서 abc를 뽑아내야 하기 때문에 상하위 구조 잘 보고 태그 결정하기
for i in bestitem :
name = i.select_one('a.itemname')
price = i.select_one('.item_price strong') : 가격이라도 정가, 세일가 등등 다를 수 있으므로 공통되는 것이 뭔지 정확히 알기
print(name.get_text() , price.get_text())
상품 상세 페이지의 판매업체까지 추출하기
import requests
from bs4 import BeautifulSoup
res = requests.get('http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G06')
soup = BeautifulSoup(res.content, 'html.parser')
bestitem = soup.select('div.best-list li')
for i in bestitem :
name = i.select_one('a.itemname')
price = i.select_one('.item_price strong')
res_info = requests.get(name['href']) : name태그 하위에 각 상세페이지 주소 있고, 그거 가져오려면 ['하위태그']
soup_info = BeautifulSoup(res_info.content, 'html.parser')
seller = soup_info.select_one('span.text__seller > a')
print(name.get_text() , price.get_text(), seller.get_text())
엑셀 파일로 정리하기
import requests
from bs4 import BeautifulSoup
import openpyxl
| [크롤링 기본] 정규표현식 (0) | 2022.08.20 |
|---|---|
| [크롤링 기본] JSON 포맷과 XML 포맷 (0) | 2022.08.15 |
| [크롤링 기본] Open/Rest API (0) | 2022.08.15 |
| [크롤링 기본] 엑셀 파일로 저장하기 (0) | 2022.08.12 |
| [크롤링 기본] HTTP response code (0) | 2022.08.12 |
특별한 패턴을 가진 데이터를 삭제하거나 변환, 추출해야 하는 경우, 정규표현식을 활용
| 정규 표현식 | 축약 표현 | 설명 |
| [0-9] | \d | 숫자 |
| [^0-9] | \D | 숫자 제외 |
| [ \t\n\r\f\v] | \s | white space(스페이스, 탭, 엔터, ) |
| [^ \t\n\r\f\v] | \S | white space 제외 |
| [a-zA-Z0-9] | \w | 영어, 숫자 |
| [^a-zA-Z0-9] | \W | 영어, 숫자 제외 |
| 표현 | 설명 |
| [.] or \. | 문자 딱 한 개 (줄바꿈 제외) |
| ? | 앞 문자가 0번 또는 1번 |
| * | 앞 문자가 0번 이상 |
| + | 앞 문자가 1번 이상 |
| {n} | 앞 문자가 n번 반복 |
| {m,n} | 앞 문자가 m번~n번 반복 _ {m, n}으로 띄어쓰기 불가능 |
| [abc] | 개별 문자 a,b,c 중 하나라도 |
| [가-힣] | 한글 전체 |
전체 문자열과 똑같은 지가 아니라
전체 문자열중에 해당 패턴이 있는지를 확인해서 출력
import re : 정규표현식 함수를 포함한 라이브러리
정규표현식 패턴 만들기
패턴변수 = re.compile('어쩌구')
대체하기
sub : 데이터에서 특정 패턴을 찾아서 바꾸는 것
re.sub(정규표현식, 바꿀문자열, 원래문자열)
소문자/대문자 구별 o
subed = 패턴변수.sub(바꿀문자열, 원래문자열)
패턴 매칭 확인하기
패턴변수.match("매칭할 텍스트") : 처음부터 매칭되어야 리턴
패턴변수.search("매칭할 텍스트") : 어느 한 부분이라도 만족하면 리턴
패턴변수.findall("매칭할 텍스트") : 매칭되는 모든 부분을 스페이스로 구분해 리스트로 리턴
분리하기
패턴변수 = re.complie('어쩌구')
문자열변수 = 패턴변수.split( '~~어쩌구~~' )
어쩌구 앞뒤로 분리해 리스트로 리턴
정규표현식으로 나타낼 형식에 []가 있으면
정규표현식 [형식] 의 []과 겹치기 때문에
이럴 때에는 \ 역슬래시로 쓰기
re.sub('\[[0-9]+\]
| [크롤링 기본] 실전 크롤링 예제 (0) | 2022.08.21 |
|---|---|
| [크롤링 기본] JSON 포맷과 XML 포맷 (0) | 2022.08.15 |
| [크롤링 기본] Open/Rest API (0) | 2022.08.15 |
| [크롤링 기본] 엑셀 파일로 저장하기 (0) | 2022.08.12 |
| [크롤링 기본] HTTP response code (0) | 2022.08.12 |
JavaScript Object Notation
웹 환경에서 서버와 클라이언트 사이에 테이터를 주고 받을 때 Rest API
형식 _ { "키" : "값" , "키" : "값" , ... }
0. 없으면 설치하기 ) pip install json
1. 라이브러리 가져오기 ) import json
2. 데이터 입력하기 ) data = """
{
json포맷
}
"""
3. 데이터 파싱하기 ) json_data = json.loads (data) _ loads(문자열) : 문자열 파싱
4. 읽기 ) print( json_data[키이름][인덱스번호] ... )
import json
# 네이버 쇼핑에서, android 라는 키워드로 검색한 상품 리스트 결과
data = """
{
"lastBuildDate": "Sat, 22 Jun 2019 14:57:13 +0900",
"total": 634151,
"start": 1,
"display": 10,
"items": [
{
"title": "MHL 케이블 (아이폰, <b>안드로이드</b> 스마트폰 HDMI TV연결)",
"link": "https://search.shopping.naver.com/gate.nhn?id=10782444869",
"image": "https://shopping-phinf.pstatic.net/main_1078244/10782444869.5.jpg",
"lprice": "16500",
"hprice": "0",
"mallName": "투데이샵",
"productId": "10782444869",
"productType": "2"
},
{
"title": "파인디지털 파인드라이브 Q300",
"link": "https://search.shopping.naver.com/gate.nhn?id=19490416717",
"image": "https://shopping-phinf.pstatic.net/main_1949041/19490416717.20190527115824.jpg",
"lprice": "227050",
"hprice": "359000",
"mallName": "네이버",
"productId": "19490416717",
"productType": "1"
}
]
}
"""
json_data = json.loads(data)
print (json_data['items'][0]['title'])
print (json_data['items'][0]['link'])
< 기본 형식 >
import requests
client_id = '아이디'
client_secret = '시크릿'
naver_open_api = ' 요청 url '
headers_params = { 'X-Naver-Client-Id' : 'client_id' , 'X-Naver-Client-Secret' : 'client_secret' }
res = requests.get( naver_open_api , headers = header_params )
if res.status.code == 200 :
data = res.json()
print(data) or for i in data['items'] :
print( i['title'] )
else :
print( 'Error code : ' , res.status_code )
< 1000개 출력해서 엑셀로 저장하기 >
import requests
import openpyxl
client_id = '아이디'
client_secret = '시크릿'
start, num = 1 , 0
excel_file = openpyxl.Workbook()
excel_sheet = excel_file.active
excel_sheet.column_dimensions['B'].width = 100
excel_sheet.column_dimensions['C'].width = 100
excel_sheet.appen( ['랭킹' , '제목' , '링크'] )
for index in range(10) :
start_number = start + (index * 100)
naver_open_api = ' 요청 url ... ? query=키워드 & display=100 & start= ' + str(start_number)
키워드가 들어간 페이지를 100개씩 특정 번호부터
header_params = { 'X-Naver-Client-Id' : client_id , 'X-Naver-Client-Secret' : client_secret }
res = requests.get ( naver_open_api , headers = header_params )
if res.status_code == 200 :
data = res.json()
for i in data['items'] :
num += 1
excel_sheet.append( [num , item['title'] , item['link'] ] )
else :
print( "Error Code : ", res.status_code )
excel_file.save( '파일이름.xlsx')
excel_file.close()
Extensivle Markup Language
Html과 같이 태그 형태로, bs4 BeautifulSoup 사용
형식 ) < 태그명 속성명='속성값' > 내용 < /태그명 >
단, css 아니므로 select 아닌 find로 파싱하기
import requests
from bs4 import BeautifulSoup
service_key = ' 서비스키 '
params = ' &키=값&키=값&...'
open_api = ' 요청 url ?ServiceKey=' + service_key + params _ 네이버는 헤더 정보를 headers에
공공데이터는 주소에 쓰게끔 설정되어 있음
res = requests.get(open_api)
soup = BeautifulSoup(res.content , 'html.parser')
data = soup.find_all('item')
for i in data :
stationname = item.find('stationname')
print( stationname.get_text() )
| [크롤링 기본] 실전 크롤링 예제 (0) | 2022.08.21 |
|---|---|
| [크롤링 기본] 정규표현식 (0) | 2022.08.20 |
| [크롤링 기본] Open/Rest API (0) | 2022.08.15 |
| [크롤링 기본] 엑셀 파일로 저장하기 (0) | 2022.08.12 |
| [크롤링 기본] HTTP response code (0) | 2022.08.12 |
# API (Application Programming Interface)
: 특정 프로그램을 만들기 위해 제공되는 함수 등의 모듈
# Open API
: 누구나 사용할 수 있도록 공개된 API로,
주로 Rest API 기술을 사용해 주소를 만들어 공개
# Rest API (Representational State Transfer API)
: Http 프로토콜을 통해 서버를 제공하는 함수로,
주로 JSON, XML의 형태로 응답을 전달
https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
애플리케이션 등록해서 Client ID / Secret 받기
Documents - 서비스 API - 검색 에서 요청 url 받기
1. Request
2. get에 요청할 url 입력
- 네이버 Developers 사이트의 Documents - 서비스 API - 검색 에서 알맞은 요청 url 복사
- 형식 ) 요청 url + ? + 요청변수 = 어쩌구 & 요청변수 = 어쩌구
ex. https://openapi.naver.com/v1/search/shop.json?query=샤오미&display=100
3. headers에 key와 value 입력
[key] [value]
X-Naver-Client-Id 아이디
X-Naver-Clinet-Secret 시크릿
http의 틀에는 맨 앞에 헤더 정보 / 바디에는 주소 정보가 담겨져서 전송되는데,
주소만 쓰면 헤더는 디폴트값으로 전송되며, headers에 key와 value 입력해서 정보 추가 가능
| [크롤링 기본] 정규표현식 (0) | 2022.08.20 |
|---|---|
| [크롤링 기본] JSON 포맷과 XML 포맷 (0) | 2022.08.15 |
| [크롤링 기본] 엑셀 파일로 저장하기 (0) | 2022.08.12 |
| [크롤링 기본] HTTP response code (0) | 2022.08.12 |
| [크롤링 기본] urllib 라이브러리 (0) | 2022.08.12 |
0. 라이브러리 없으면 설치하기 ) 터미널 모드에서 pip install openpyxl
1. 라이브러리 불러오기 ) import openpyxl
2. 엑셀 파일 만들기 ) excel_file = openpyxl.Workbook()
3. 디폴트 시트 활성화하기 ) excel_sheet = excel_file.active
excel_sheet.title = '시트 이름'
4. 데이터 추가하기 ) 리스트 하나가 한 행으로 추가
excel_sheet.append( ['data1' , 'data2' , 'data3'] )
5. 엑셀 파일로 저장하고 닫기 ) excel_file.save('엑셀파일이름.xlsx')
excel_file.close()
↳ 파일 닫기 안해주면 리소스가 계속 활성화되어 있으므로 닫아주기!
import openpyxl
def create_excel ( filename, sheetname, listdata ) :
excel_file = openpyxl.Workbook()
excel_sheet = excel_file.active
if sheetname != '' :
excel_sheet.title = sheetname
for i in listdata :
excel_sheet.append( i )
excel_file.save(filename)
excel_file.close()
import requests
from bs4 import BeautifulSoup
product_lists = list()
for page_num in range(10) :
if page_num == 0 :
res = requests.get('~주소~')
else :
res = resquests.get( '~주소~' + str(page_num + 1) )
soup = BeautifulSoup( res.content , 'html.parser' )
data = soup.select('상위 태그')
for i in data :
product_name = i.select_one( '상품명태그' )
product_data = i.select_one( '일자태그' )
product_info = [ product_name.get_text() , product_data.get_text() ] _ [상품명, 일자] 리스트 만들기
product_lists.append( product_info ) _ 리스트 내 리스트 만들기
create_excel( '엑셀파일이름.xlsx' , '시트이름' , product_lists)
1. 라이브러리 가져오기 ) import openpyxl
2. 엑셀 파일 열기 ) excel_file = openpyxl.load_workbook( '엑셀파일이름.xlsx' )
↳ 해당 폴더 안에 있는 파일이어야 함
3. 시트 선택하기 )
- 시트 이름 확인 : excel_file.sheetnames _ 시트 이름이 리스트 형태로 반환
- 특정 시트 선택 : excel_sheet = excel_file[ '시트이름' ]
- 시트가 하나뿐 : excel_sheet = excel_file.active
4. 데이터 읽기 ) for row in excel_sheet.rows _ 행을 리스트 형태로 row에 대입
print( row[0].value , row[1].value )
5. 파일 닫기 ) excel_file.close()
+ 셀 사이즈 조정하기
excel_sheet . column_dimention['A'].width = 100 _ A셀의 넓이를 100으로 조정
| [크롤링 기본] JSON 포맷과 XML 포맷 (0) | 2022.08.15 |
|---|---|
| [크롤링 기본] Open/Rest API (0) | 2022.08.15 |
| [크롤링 기본] HTTP response code (0) | 2022.08.12 |
| [크롤링 기본] urllib 라이브러리 (0) | 2022.08.12 |
| [크롤링 기본] 크롤링 기술 Tip (0) | 2022.08.04 |