크롤링

체인지영·2021년 5월 21일
0

[백준X파이썬]

목록 보기
6/6

기초 html,css 웹페이지 구조

-네이버 사이트 개발자 도구 , 글자 변경 등

html,css 정리링크

오브콜스

  • html,css 코드로 간단한문서작성 하기

class 문법

데이터와 기능을 함께 묶는 방법을 제공
Python , C++ , Java 등에서 주로 사용 ( 객체지향 프로그래밍

클래스

apple = {
	"name" : "apple",
    "flaver" : "sweet",
    "cost" : 5000,
    "have" :3,
}

pear = {
	"name" : "pear",
    "flavor" : "littlesweet",
    "cost" : 6000,
    "have" :1,
    
def apple_change():
	apple['cost'] +=500
    apple['have'] += 1000
    
def pear_change():
	pear['cost'] +=500
    pear['have'] +=1000
class fruit:
	def __init__ (self,name,flavor,cost,have):
    	self.name = name,
        self.flavor = flavor,
        self.cost = cost,
        self.have = have
    def change(self):
    	self.cost +=500
        self.have +=1000

init : 생성자 함수
self : 인스턴스 본인을 의미, 본인 스스로의 값에 접근 가능

가상환경

가상환경
가상환경, 독립된공간 -> 프로젝트별로 개발환경구축
가상환경은 독립적!
1. python get -pip.py (window)
sudo apt-get install python3-pip(mac
2. pip --version

  1. pip install pipenv(window
    pip3 install pipenv(mac
  2. pipenv --version

폴더이동
5. pipenv shell
6. pipnev install request
7. pipenv install bs4

크롤링

인터넷상에 존재하는 웹 문서들을 추적하여 필요한 정보를 수집하는 기법
HTML 페이지를 가져와서, HTML/CSS등을 파싱하고, 필요한 데이터만 추출하는 기법
무분별하게 해당 웹사이트에서 데이터를 가져와서 상업적으로 이용하면 안됨

크롤링으로 수집한 데이터로 이익을 취하면 문제가 될 수 있음
각 사이트에서는 크롤러가 요청을 해도 되거나,
해서는 안되는 사항들을 robots.txt 에서알수있다

beautifulsoup4 - HTML과 XML 문서를 파싱하기 위한 파이썬 패키지

soup.find('p')
soup.find('div',{'class':'클래스 네임명'})
soup.find('img',{'id':'아이디 네임명'})
soup.find_all('div')
soup.select('p')
soup.select('.클래스 네임명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
soup.select('#아이디명')
soup.select('#아이디명 > 태그명.클래스명)
soup.select('태그명[속성1=값1]')

1.웹 사이트 url에 get요청
2.find나 select 함수를 이용해서 원하는 HTML Element 가져오기
3.원하는 데이터 결과 값 형태로 가공하기

Query String
https://search.shopping.naver.com/search/all.nhn?변수1=값1&변수2=값2

  • get 요청을 보낼 때, 주로 query에 변수를 담아 정보를 전송함
  • Url 주소 뒤에 ?로 시작
  • 변수와 값의 쌍으로 구성 (각 쌍은 &로 구분)

https://search.shopping.naver.com/search/all?pagingIndex=2&pagingSize=80&query=노트북'

  • 2번째 페이지
  • 한 페이지에는 80개의 검색 결과
  • 검색어는 노트북
import requests
from bs4 import BeautifulSoup
# 우리가 정보를 얻고 싶어 하는 URL
NOTEBOOK_URL = f'https://search.shopping.naver.com/search/all?pagingIndex=1&p
agingSize=80&query=노트북'
# get 요청을 통해 해당 페이지 정보를 저장
notebook_html = requests.get(NOTEBOOK_URL)
# bs4 라이브러리를 통해 불러온 html을 우리가 원하는 형태로 파싱
notebook_soup = BeautifulSoup(notebook_html.text,"html.parser")
print(notebook_soup)

직접 홈피 보면서 쿼리 확인하기
파일열기

notebook_list_box = notebook_soup.find("ul",{"class":"list_basis"})
notebook_list = notebook_list_box.find_all("li",{"class":"basicList_item__2XT81"})
title = notebook_list[0].find("div",{"class":"basicList_title__3P9Q7"}).find("a").string
price = notebook_list[0].find("div",{"class":"basicList_price_area__1UXXR"}).find("span",{"class":"price_num__2WUXn"}).text
print(title)
for notebook in notebook_list:
title = notebook.find("div",{"class":"basicList_title__3P9Q7"}).find("a").string
price = notebook.find("div",{"class":"basicList_price_area__1UXXR"}).find("span",{"class":"price_num__2WUXn"}).text
detail_lists = notebook.find("div",{"class":"basicList_desc__2-tko"}).find_all("a",{"class","basicList_detail__27Krk"})
detail = []
for detail_list in detail_lists:
  detail.append(detail_list.text)
  notebook_info = {
  'title': title,
  'price': price,
  'detail': detail
  }
  result.append(notebook_info)

텍스트 추출

  1. string(태그 직접하위 문자열, 문자열 없으면 none)
  2. text(하위 자식태그의 텍스트까지 문자열로 반환)

CSV파일

CSV (comma-separated values)
① 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일
② 엑셀 프로그램으로 열기 가능
③ 이후, DB에 직접 넣을 수 있는 파일 형식

f-string
fstring

import requests
from bs4 import BeautifulSoup
from note_book import extract_info
import csv
file = open('note_book.csv', mode='w', newline='')
writer = csv.writer(file)
writer.writerow(["title","price","detail"])
final_result = []
for page in range(30):
  NOTEBOOK_URL = f'https://search.shopping.naver.com/search/all?pagingIndex={page}&pagingSize=80&query=노트북'
  notebook_html = requests.get(NOTEBOOK_URL)
  notebook_soup = BeautifulSoup(notebook_html.text,"html.parser")
  notebook_list_box = notebook_soup.find("ul", {"class" : "list_basis"})
  notebook_list = notebook_list_box.find_all('li', {"class" : "basicList_item__2XT81"})
  final_result += extract_info(notebook_list)
  
for result in final_result:
  row = []
  row.append(result['title'])
  row.append(result['price'])
  row.append(result['detail'])
  writer.writerow(row)
print(final_result)

CSV

profile
Startup, FrontEnd, BlockChain Developer

0개의 댓글