You are currently viewing 파이썬 크롤링 코드 정리
파이썬-크롤러

파이썬 크롤링 코드 정리

저번 포스팅에서는 파이썬 크롤링 코드를 통해 짧게 작성하여 원하는 데이터를 얻어내고 데이터를 저장하는 실습을 했습니다. 이번에는 그 코드를 이해하고 확장하여 활용하기 위한 파이썬 코드를 정리해 봤습니다.

저번 파이썬 크롤링 예제 : https://lsrank.com/python/python-parsing/

크롤링을 위한 파이썬 코드 정리

목차

설치할 모듈

pip install requests
pip install pandas
pip install BeautifulSoup4
pip install xlrd
pip install openpyxl

임포트

from bs4 import BeautifulSoup
from urllib.request import urlopen
또는 import requests

urllib는 파이썬에 기본 내장되어 있고 requests는 설치가 필요함.
차이는 있음. urllib는 바이너리 형태로 전송, requests는 get과 post를 명시함 그리고 딕셔너리형태로 전송

requests.get(url,allow_redirects=False)

params1 = { ‘param1’: ‘value1′, value2′, value3’}
res = requests.get( URL, params = params1 )

userdata = {“name”: “lsrank”, “nickname”: “lsrank”, “password”: “lsrankdotcom”}
resp = requests.post(‘http://www.lsrank.com/login’, data=userdata)

import requests, json
data = {‘outer’: {‘inner’: ‘value’}}
res = requests.post(URL, data=json.dumps(data))

headers = {‘Content-Type’: ‘application/json; charset=utf-8’}
cookies = {‘session_id’: ‘sorryidontcare’}
res = requests.get(URL, headers=headers, cookies=cookies)

json디코더가 내장됨
res.request
res.status_code 응답 코드
res.raise_for_status() 200 ok 코드가 아닌 경우 에러
resp.json() : json응답을 딕셔너리 타입으로 변환

resp.text

파서 종류

Parser선언장점단점
html.parserBeautifulSoup(get_html.content,’html.parser’)속도 중간
lxml HTML parserBeautifulSoup(get_html.content,’lxml’) 빠름lxml 설치
lxml XML parserBeautifulSoup(get_html.conten,’ lxml-xml)
BeautifulSoup(get_html.content,’ lxml-xm)
빠름lxml 설치
html5libBeautifulSoup(get_html.content,’html5lib’) HTML5html5lib 설치
느림

요청

html = requests.get(‘https://search.naver.com/search.naver?query=날씨’)

헤더 추가
req = Request(url)
req.add_header(‘User-Agent’, ‘Mozilla/5.0’)
서버에 요청
html = urlopen(req).read()

html 코드안의 요소 찾기

일치하는 태그를 싹 다 찾는 방법 find_all , select

select 메소드를 이용하는 방법


soup.select(“상위태그 또는 id 또는 클래스 > 하위태그 또는 id 또는 클래스”)
id일 경우 #idname
class일 경우 .classname
태그일 경우 tagname
soup.select(“p > #idname > .classname”)

a태그이면서 classname인 항목을 찾고 싶을때 : soup.select(“a .classname”)
a태그 면서 href요소가 있는 항목만 list로 묶어줌 res = soup.select(‘a[href]’)
a 태그 면서 href요소도 있고 특정 class만 묶고 싶을 때 res = soup.select(“a[href] + .classname”)

find_all은 조건에 일치하는 모든 태그를 찾아줌


find_all(name, attrs, recursive, string, limit, **kwargs)
a태그 모두 찾기 : res_list = bs.find_all(‘a’)
클래스가 일치하는 모든 a태그 찾기: res_list = bs.find_all(‘a’, {‘class’:’test_class’})
클래스가 일치하는 2개의 a태그 찾기 res_list = bs.find_all(‘a’, {‘class’:’test_class’}, limit=2)
위에서 찾은 것 중 두번째 요소 res_list[1]
string값 검색 soup.find_all(string=”searchzz”)

특정 조건에 일치하는 것 하나만 찾으면 되는 경우 find

find는 조건에 일치하는 첫 번째 태그를 찾아줌
find(name, attrs, recursive, string, **kwargs)

class명이 일치하는 a태그 찾기 : res_list = bs.find(‘a’, class_=:test)
또는 res = bs.find(‘a’, {‘class’:’test’})
class는 예약어라 class_라고 써줘야함.

id일치 하는 태그 찾기: res = bs.find(id=’test_id’)
또는 res = bs.find(‘ ‘, {‘id’=’test_id’})

태그안에 특정 값만 가져오면 되는 경우

특정 속성 값만 가져오고 싶을 때 get사용
res.get(‘href’)

<title> 태그까지 같이 가져옴
soup.title
soup.find(‘title’)

<title>태그 안에 있는 내용만 가져오고 싶을 때는 string 이나 get_text()이용
soup.title.string
soup.find(‘title’) .get_text()

BeautifulSoup은 웹페이지 소스를 가져오고 파싱할때 이용하는 것

soup = BeautifulSoup(html, ‘html.parser’)
파싱할 때 글자가 깨진다면 인코딩 추가
soup = BeautifulSoup(html, ‘html.parser’, from_encoding=’utf-8′)

더 많은 파이썬 크롤링 코드 예제는
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
다음 링크에 가면 예제 코드가 있습니다.

답글 남기기