04-26

파이썬 requests패키지

API
requests 라이브러리는 매우 직관적인 API를 제공하는데요. 어떤 방식(method)의 HTTP 요청을 하느냐에 따라서 해당하는 이름의 함수를 사용하면 됩니다.

  • GET 방식: requests.get()
  • POST 방식: requests.post()
  • PUT 방식: requests.put()
  • DELETE 방식: requests.delete()
  • import requests # requests 라이브러리 설치 필요
    
    r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
    rjson = r.json()
    
    print(rjson['RealtimeCityAir']['row'][0]['NO2'])

    여기서 공부할떄 이건왜 .get인지 .json인지이런거 외우려고하는게 아니고 requests를 만든사람이 이렇게쓰라고 했다. 이렇게 이해해야한다.


    크롤링에서 가장중요한거 2가지 첫번째. 브라우저를 키지않고 요청하는거 두번쨰. 요청된거 가지고 온 html들중 내가원하는 정보 잘 걸러내는거 걸래는거 역할이 BeautifulSoup의 역할이다.

    정리하면 python에서는 requests로 요청하고 BeautifulSoup으로 걸러낸다.

    import requests
    from bs4 import BeautifulSoup # bs4에서 BeautifulSoup만 import한거임 그래서 bs4다른거사용못함
    
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    print(soup)

    항상 제일중요한거 무엇을처음할때나 테스트할떄 print나 console로 찍어보는거

    headers왜붙이느냐 코드에서 요청할떄 기본적인 요청을 막아두는사이트들이많다.
    브라우저에서 엔터친거마냥 효과를내기위해서다. headers=headers
    그다음 url들어가고 그다음 beatifulSoup을통해서 솎아내서 찍어주는것이다.

    이전에 크롬에서 원하는곳에서 검사누르고 이제 그태그를 copy에서 copyselector를 누른다.

    bs4사용방법은 크게2가지가있다.
    1. select_one
    2. select
    이렇게2가지
    select_one은 당연히 하나나오는거
    select는 여러개나오는거

    Tip: HTML Parser란 HTML 문법 규칙을 바탕으로 웹페이지의 내용을 해석하고, 의미와 구조를 분석하는 프로그램입니다.

    select는 이제 타고타고가서 어디있는지 알려주는것 역할을한다!!!

    title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
    
    print(title)
    <a href="/movie/bi/mi/basic.nhn?code=171539" title="그린 북">그린 북</a> 결과화면

    즉 태그를 가져오는거고 저기서이제 내용을 뽑을려면 title.text이렇게하면된다.
    만약 속성을 가져오고싶으면 title['href'] 딕셔너리인가요 이렇게생각하면안된다.
    이거 bs4만든사람마음이라서 모른다.

    크롤링 여러개 가져오고싶은면이제 select인대 이거할떄 html구조를 보고가져와야한다.

    #old_content > table > tbody > tr:nth-child(2)
    #old_content > table > tbody > tr:nth-child(3) 이걸보고 어딘가 다른지 보고 다른부분뗴어버림
    #old_content > table > tbody > tr 이렇게하면 이것에해당하는친구들이 다나오게된다.

    trs = soup.select('#old_content > table > tbody > tr') # select는 결과를 list로반환한다.

    #old_content > table > tbody > tr:nth-child(2) > td.title > div > a
    trs = soup.select('#old_content > table > tbody > tr') # select는 결과를 list로반환한다.
    
    for tr in trs:
        a_tag = tr.select_one('td.title > div > a')
        print(a_tag)

    이런식으로 찾으곳에서 또 들어가서 찾는거 내생각에는 select는 이제 태그로 어디위치찾을지
    알려주는역할 정해주는 함수인거같다.

    데이터베이스는 하나의 서버로보면될것같다. 데이터베이스서버접속한다 막이러는거(robo3t로)
    그래서 데이터베이스(서버)에서 데이터를 저장해두었다가 필요할때 이제 데이터를 가져오거나 할수있도록하기위해서 데이터베이스를 사용한다.

    보관만목적이라기보다는 잘갖다사용하기위해 데이터베이스를 사용하는것이다.

    NoSQL은 한줄한줄은 딕셔너리형태로들어가서 이메일이들어가기도하고 없기도하고 이렇게된다.
    SQL은 열/행을 미리정해놓아야한다. 이미정해져있어서 뽑아가는게 편하고 일관적이다.
    NoSQL은 데이터하나하나가 다다르다

    궁금증: DB서버라고부르는대 DB를 하나의서버로 생각해도되는가??
    컴퓨터안에 localhost 포트번호를 사용하는대 어떻게보면 거기가 서버인거같기도하고..
    파이썬으로 mongoDB조작하려면 pymongo라는라이브러리가 필요하다.

    엑셀을 파이썬으로 조작하려면 엑셀을 파이썬조작할수있도록 남이 만들어 놓은 라이브러리를 쓰면 편하듯이 pymongo도 이러한 라이브러리다

    DB연결 - MongoClient
    MongoDB에 연결하는 방법은 두 가지가 있다. 
    첫 번째 방법은 실행 중인 MongoDB 서버의 URI를 MongoClient의 파라미터로 입력하는 것이고, 
    두 번째 방법은 DB 서버의 IP와 포트 번호 두 가지 값을 각각 파라미터로 입력하는 것이다. 
    나는 로컬 환경에서 MongoDB를 실행 중이어서 고정IP 대신 localhost를 입력하였다.
    
    from pymongo import MongoClient
    
    # 방법1 - URI
    # mongodb_URI = "mongodb://localhost:27017/"
    # client = MongoClient(mongodb_URI)
    
    # 방법2 - IP, PORT
    client = MongoClient('localhost', 27017)
    
    print(client.list_database_names())
    ['admin', 'config', 'local']
    • NoSQL에 대해서

    Collection
    Collection은 MongoDB Document의 그룹입니다.
    Document들이 Collection내부에 위치하고 있습니다.
    RDMS의 table과 비슷한 개념입니다만 RDMS와 달리 schema를 따로 가지고 있지않습니다. Document 부분설명에 나와있듯이 각 Document들이 동적인 schema를 가지고 있으니까요.
    즉 table이 document 대신 NoSQL이니까 schema를 가지고있지않는다. document가 동적인 schema를가지기떄문에

    결론: collection을 테이블로이해하면된다. 그리고 레코드는 document로 이해하자

    from pymongo import MongoClient
    client = MongoClient('localhost', 27017) # mongodb접속
    db = client.dbsparta # dbsparta라는 db이름으로 접속할건대 없으면 자동으로만들어준다 데이터베이스이름
    
    # insert / find / update / delete 4가지만 알면된다.
    doc = {'name':'john','age':27} # 몽고디비는 딕셔너리 쌓이는거 그래서 딕셔너리
    db.users.insert_one(doc) # users라는테이블(nosql에서는 콜렉션) 
    # recorde는 document
    

    same_ages = list(db.users.find({'age':21},{'_id':False})) # _id값은 나타내지말아라 라는뜻
    list로 변형안시킬경우

    <pymongo.cursor.Cursor object at 0x019AE340>

    list로 변형시킬경우
    [{'name': 'bobby', 'age': 21}, {'name': 'jane', 'age': 21}]
    list(db.users.find({},{'_id':False})) # 조건없이 다가져오는경우

    user = db.users.find_one({'name':'bobby'}) 하나만가져오는대 bobby가여려명이여도
    제일위에 있는 애만 갖고온다.

    밥먹는시간을 제외하고 코딩공부했습니다.

    좋은 웹페이지 즐겨찾기