웹 서버에 저장된 프로그램을 웹 브라우저로 전달하는 것
이며 URL 중에서 물음표 ?
이후 문자열을 뜻합니다.[파라미터 명]=[파라미터 값]
이 한 세트로 작동하고, 파라미터가 여러 개 일 때는 마찬가지로 위에 빨갛게 마킹해 둔 것처럼 &
로 이어줍니다.참고 : https://www.beusable.net/blog/?p=3798
모듈 설치
> pip install urllib , requests
1) 요청하기
import requests
url = "https://www.google.com/"
res = requests.get(url)
2) 응답상태
import requests
url = "https://www.google.com/"
res = requests.get(url)
res.raise_for_statuse()
3) 응답 내용 확인
url = "https://www.google.com/"
res = requests.get(url)
res.content
url = "https://www.google.com/"
res = requests.get(url)
res.text
pip install bs4
import requests
from bs4 import BeautifulSoup
url = "https://www.google.com/"
res = requests.get(url)
res.raise_for_status
html = res.text
soup = BeautifulSoup(html , "html.parser") # BeaurifulSoup 객체 생성 후 html과 어떤 parser를 사용할지 작성
soup = BeautifulSoup(html , "lxml")
# 우리가 가져온 html 문서를 lxml parser를 통해 BeautifulSoup 객체에 집어 넣어준다.
soup.prettify() : html의 구조를 파악하기 쉽게 바꿔준다.
특정 태그안의 정보를 가져오기
soup.title : title태그의 정보 가져온다.
soup.head
soup.p
soup.a
태그이름과 태그 안의 string 가져오기
soup.tage.name
soup.tage.string
# 테그이름을 만족하는 모든 element를 리스트 형태로 저장한다.
# (리스트 접근 가능)
soup.find_all('태그이름')
soup.select('태그이름')
soup.find_all("a" , attrs = {"class":"title"})
# a 태그의 속성이 class = "title" 인 모든 element를 가져온다.
# 만약 동일한 속성을 가지는 element가 여러개 존재하는 경우 리스트 형태로 접근이 가능하다.
soup.find_all("a" , attrs = {"class":"title"})[2]
여기서 find_all과 select는 동일한 동작을 수행한다.
추출한 element의 text 추출하기
a = soup.find_all("a" , attrs = {"class":"title"})
a.get_text()
from bs4 import BeautifulSoup
import requests
import pprint
import pandas as pd
# 1page에 대한 지역, 매장명, 주소 크롤링
url = "https://www.hollys.co.kr/store/korea/korStore2.do?pageNo=1&sido=&gugun=&store="
res = requests.get(url)
res.raise_for_status
html = res.text
soup = BeautifulSoup(html , "lxml")
tbody_tag = soup.find("tbody")
areas = []
store_ids = []
store_address = []
for tr_tag in tbody_tag.find_all("tr"):
areas.append(tr_tag.find("td" , attrs = {"class" : "noline center_t"}).get_text())
store_ids.append(tr_tag.a.get_text())
store_address.append(tr_tag.find_all("a")[1].get_text())
df = pd.DataFrame({
"지역" : areas,
"매장명 " : store_ids,
"주소" : store_address
})
df
전체 페이지에 대한 정보 크롤링 하기
#1~54page에 대한 지역 , 매장명 , 주소 추출
from bs4 import BeautifulSoup
import requests
import pprint
import pandas as pd
areas = []
store_ids = []
store_address = []
for page in range(1,54):
url = "https://www.hollys.co.kr/store/korea/korStore2.do?pageNo={}&sido=&gugun=&store=".format(page)
res = requests.get(url)
res.raise_for_status
html = res.text
soup = BeautifulSoup(html , "lxml")
tbody_tag = soup.find("tbody")
for tr_tag in tbody_tag.find_all("tr"):
areas.append(tr_tag.find("td" , attrs = {"class" : "noline center_t"}).get_text())
store_ids.append(tr_tag.a.get_text())
store_address.append(tr_tag.find_all("a")[1].get_text())
df = pd.DataFrame({
"지역" : areas,
"매장명 " : store_ids,
"주소" : store_address
})
df
크롤링 결과
from bs4 import BeautifulSoup
import requests
URL = "https://finance.naver.com/item/main.naver?code=005930"
req = requests.get(URL)
html = req.text
bs4 = BeautifulSoup(html , "html.parser")
div_today = bs4.find("div" , attrs={"class": "today"}) # bs4.elment.tag 객체 반환
em = div_today.find("em" , attrs={"class":"no_down"})
price = em.find("span" , {"class" : "blind"}).text # 삼성전자 가격정보 획득
print("가격 : ", price)
company = bs4.find("div" , {"class" : "wrap_company"})
name = company.h2.text
print("이름 : " , name)
code = company.find("div" , {"class" : "description"}).span.text
print("종목코드 : " , code)
table = bs4.find("table" , {"class" : "no_info"})
tds = table.find_all("td")
amount = tds[2].find("span" , {"class": "blind"}).text
print("거래량 : " , amount)
dic = {
"price" : price,
"name" :name,
"code" :code,
"amount" : amount
}
dic
위의 코드를 함수화(url의 code매개변수만 바꾸면 다른 종목의 데이터 정보 반환하는 함수)
from bs4 import BeautifulSoup
import requests
def crawl(code):
URL = f"https://finance.naver.com/item/main.naver?code={code}"
req = requests.get(URL)
html = req.text
bs4 = BeautifulSoup(html , "html.parser")
div_today = bs4.find("div" , attrs={"class": "today"}) # bs4.elment.tag 객체 반환
em = div_today.find("em" , attrs={"class":"no_down"})
price = em.find("span" , {"class" : "blind"}).text # 삼성전자 가격정보 획득
print("가격 : ", price)
company = bs4.find("div" , {"class" : "wrap_company"})
name = company.h2.text
print("이름 : " , name)
code = company.find("div" , {"class" : "description"}).span.text
print("종목코드 : " , code)
table = bs4.find("table" , {"class" : "no_info"})
tds = table.find_all("td")
amount = tds[2].find("span" , {"class": "blind"}).text
print("거래량 : " , amount)
dic = {
"price" : price,
"name" :name,
"code" :code,
"amount" : amount
}
return dic
위의 함수를 이용하여 데이터 프레임으로 저장
import pandas as pd
codes = ["005935" ,"005930" ,"373220" ,"000660" ,"051915" ,"207940"]
result = []
for code in codes:
result.append(crawl(code))
df = pd.DataFrame(result)
df