Requests

WEB CRAWLING 1

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

Requests

  • Requests 패키지는 크롤링 하고자 하는 페이지를 url 값을 통해 가져와 객체로 변환 해주는 기능을 가지고 있다.

1. Installation

  • Requests 를 이용하기 위해 package 를 설치해준다.
    1
    $ pip3 install requests

  • request를 이용하면서, json 형식으로의 크롤링과, html 형식으로 css selecting 을 위한 크롤링을 실습해 볼 것이므로, BeautifulSoup Package 역시 같이 설치해준다. (BeautifulSoup은 html parser 를 이용해보기 위함이다.)
  • python-forecastio 는 dark sky 의 api를 활용해 날씨 데이터를 받아올때 사용해보기 위해 설치한다.
    1
    2
    $ pip3 install bs4
    $ pip3 install python-forecastio
  • import 할 것들
    1
    2
    3
    4
    import requests
    import forecastio
    from bs4 import BeautifulSoup
    from pandas.io.json import json_normalize

2. [ jSON ] Dark Sky api 활용 날씨정보 가져오기

  • DarkSky api 는 위도와 경도를 입력하면, 날씨 정보를 주는 api 이다.

  • https://darsky.net/dev/ 에 가입 후, TOKEN 을 받는다.

  • 위에서 받은 개인의 TOKEN 을 활용해 url 을 먼저, formating을 해준다.

  • requests의 get 메소드를 활용해 url 의 정보를 받아온다.

  • 받아온 정보를 requests 의 json 메소드로 json 형식으로 변환해준다.

  • json 을 확인하고 원하는 정보를 return 해준다.

    1
    2
    3
    4
    5
    def forecast(lat, lng):
    url = "https://api.darksky.net/forecast/{}/{},{}".format(TOKEN, lat, lng)
    response = requests.get(url)
    json_obj = response.json()
    return json_obj["hourly"]["summary"]

3. [ html ] BS4 활용 html selecting 해서 가져오기

  • 네이버의 실시간 검색순위 부분의 text 를 크롤링 해보자
  • html 파일을 BS4 를 활용해 받아온뒤, CSS selecting 으로 원하는 text data 를 가져온다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from bs4 import BeautifulSoup
def naver():
url = "https://www.naver.com"
df = pd.DataFrame(columns=["rank", "keyword"])
response = requests.get(url)
dom = BeautifulSoup(response.content, "html.parser")

# BeautifulSoup(markup, features, builder, parse_only, from_encoding, exclude_encodings)

for keyword in keywords:
df.loc[len(df)] = {
"rank":keyword.select_one('.ah_r').text,
"keyword":keyword.select_one('.ah_k').text
}
return df
  • print(response.content)의 모양을 보자.
  • 따라서, BeautifulSoup 으로 html 형식으로 parsing 해주고, css 를 활용해 selecting 해준다.
  • .select 는 여러개의 엘리먼트를 선택 -> 결과가 리스트
  • .select_one은 하나의 엘리먼트를 선택 -> 결과가 하나의 객체