파파비의 블로그

[python/파이썬] 여러 페이지를 한번에 크롤링하기 본문

개발/python

[python/파이썬] 여러 페이지를 한번에 크롤링하기

N. Dave 2021. 6. 13. 20:39
반응형

일단 필요한 개념부터 정리하면

 

Query

웹서버에 get 요청을 보낼 때, 조건에 맞는 정보를 위한 변수

자세한 내용은

https://velog.io/@pear/Query-String-%EC%BF%BC%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A7%81%EC%9D%B4%EB%9E%80

 

Query String 쿼리스트링이란?

사용자가 입력 데이터를 전달하는 방법중의 하나로, url 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것을 말한다.http://host:port/path?querystringquery parameters( 물음표 뒤에 = 로 연결된 key valu

velog.io

여기가 설명이 잘 되어 있다

 

requests에 get request를 보낼 때, params 매개변수로 딕셔너리 형태의 key-value pair를 넣음으로써 쿼리를 지정할 수 있다.

 

url = "https://www.google.com/search"
result = requests.get(url, params = {"q" : "python"})

구글에 python을 검색하면 url이

https://www.google.com/search?q=python  이렇게 찍히는데, 위 표현은 해당 url을 의미한다.

 

 

 

HTML의 tag/attributes

html에는 여러 종류의 tag와 속성이 있습니다.

<div class="cls", id="123"></div>

div - 태그

class, is = 속성

 

 

어떤 속성들이 있는지는 .attrs 라는 키워드를 사용

soup.find("div").attrs

 

속성 값에 접근하려면, 딕셔너리 형태의 방식으로 접근

div = soup.find("div")
div['class']

#class의 속성 값이 도출됨

 

하이퍼링크를 걸어주는 <a> 태그에, hrerf 의 값은 url을 나타내는데,

soup.find("a")['href'] ## url이 나오게 됨

이렇게 해당 url 값에 접근할수 있음

 

 

 

 

Children, Name 

Children : 어떤 태그가 포함하고 있는 태그,

Name : 태그의 이름을 나타냄

 

<div>
	
    <span>span 1</span>
    <span>span 2</span>
    <p>p tag</p>
    <img ...>
    
</div>

div라는 태그 안에, 4개의 childern 이 있는 것

각 children의 속성이름은 span, p img

children = soup.find("div").children
#span, p, img 태그를 갖는 리스트를 도출


for child in children:
	print(child.name)
    
#span, span, p, img 를 출력함
    
   

 

 

 

이제 제대로 크롤링을 해보자

스포츠동아의 연예 부분에 1-5페이지까지의 기사 제목들을 크롤링해본다고 하자

 

해당 페이지들은

https://sports.donga.com/ent?p=1

https://sports.donga.com/ent?p=21 

https://sports.donga.com/ent?p=41 ...

 

이런 규칙으로 페이지가 1->2로 하나씩 늘어날 때 마다

쿼리 부분의 p의 값이 20씩 커지는 규칙을 갖고 있다.

 

해당 url들을, string + string형태를 통해 만들수도 있지만

request의 get 메소드 사용시 params 매개변수를 통해서도 할 수 있다.

 

 url = "https://sports.donga.com/ent"
    
    for i in range(0, 5):
        req = requests.get(url, params = {'p' : 1+20*i})
        soup = BeautifulSoup(req.text, "html.parser")

이렇게도 가능하다

 

 

 

반응형
Comments