일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 감성분석
- student t분포
- 차원축소
- word2vec
- 텍스트 분류
- 밑바닥부터 시작하는 딥러닝
- 결정계수
- 가설검정
- 최소자승법
- 머신러닝
- 다층 퍼셉트론
- 구글 BERT의 정석
- 기초통계
- 회귀분석
- 기술통계학
- 텐서플로2와 머신러닝으로 시작하는 자연어처리
- 파이썬 pandas
- 모두의 딥러닝
- numpy
- Pandas
- 은준아 화이팅
- 히스토그램
- 코사인 유사도
- 군집화
- rnn
- 밑바닥부터 시작하는 딥러닝2
- 오래간만에 글쓰네
- 자연어 처리
- F분포
- Django
- Today
- Total
데이터 한 그릇
데이터 크롤링(2) 본문
크롤링 허용 여부 확인하기
<크롤링 주소>/robots.txt 를 입력
robots.txt 파일이 검색이 안되면 크롤링이 허락되어 있는 경우며
만일 파일이 검색이 되면 아래의 표를 참조하여 허용여부를 판별해야 한다.
표시 | 허용여부 |
User-agent:* | 모든 접근 허용 |
Disallow: | |
또는 | |
User-agent:* | |
Allow:/ | |
User-agent:* | 모든 접근 금지 |
Disallow:/ | |
User-agent:* | 특정 디렉토리만 접근 금지 |
Disallow:/user/ |
children
어떤 태그의 모든 자식 태그들을 확인할 때 사용.
반환이 iterator
#children
print(bs_obj.ul.children)
a = bs_obj.ul.children
for i in a:
print(i)
print('=========================')
for sub in bs_obj.find_all('ul')[1].children:
print(sub)
print('=========================')
이때 bs_obj.ul은 find와 같은 효과를 가지기 때문에 한 개만 가져온다. 즉 첫 번째 ul 만을 가져온다. 따라서 첫 번째 ul 의 자식 태그들만 가져오기 대문에 find_all 로 바꿔서 해주면 다른 ul 의 자식 태그들도 불러올 수 있다.
next_siblings
previous_siblings
반환이 generator
따라서 값들을 next 함수를 이용해서 가져와야 한다.
print(bs_obj.find('a').next_siblings)
ele = bs_obj.find('a').next_siblings
next(ele)
print(bs_obj.find('a').previous_siblings)
ele = bs_obj.find('a').previous_siblings
next(ele)
generator는 반복문 x, next() 함수로 값 가져오기.
정규식을 이용한 데이터 접근
import re
print(bs_obj.find('a',{'href':'https://www.naver.com/'}))
print(bs_obj.find('a',{'href': re.compile('.+com')}))
print(bs_obj.find('a',{'href':re.compile('.*naver.*')}))
print(bs_obj.find('a',{'href':re.compile('naver')}))
find 함수에서 특정 속성 값을 가지고 있는 특정 태그를 가져올 때 딕셔너리를 사용함을 살펴봤다.
이 딕셔너리의 value 값에 파이썬 정규식을 이용해서 특정 속성을 가지고 있는 태그를 꺼낼 수 있다.
람다식을 이용한 데이터 접근
print(bs_obj.find(href=lambda val : val))
print(bs_obj.find(href=lambda val : val and 'naver' in val))
print('===========================================')
print(bs_obj.find(class_ = lambda val : val))
print(bs_obj.find(class_ = lambda val : val and 'sns' in val))
GET 방식 request
def getDownload( url, param = None, retries = 3 ):
resp = None
try:
resp = requests.get( url, params = param )
resp.raise_for_status()
except requests.exceptions.HTTPError as e:
if 500 <= resp.status_code < 600 and retries > 0:
print( 'Retries : {0}'.format( retries ) )
return getDownload( url, param, retries - 1 )
else:
print( resp.status_code )
print( resp.reason )
print( resp.request.headers )
return resp
class 속성의 값이 2개 이상일 때
import requests
import re
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
url = requests.get('https://news.naver.com/', headers = header)
print(url)
html = bs4.BeautifulSoup(url.text,'lxml')
# print(html)
newsnow = html.find('ul',{'class':'mlist2 no_bg'})
# print(newsnow)
for new_li in newsnow.find_all('li'):
new_strong = new_li.find('strong')
print(re.findall('[a-z가-힣]+', new_strong.text))
406 에러가 뜨기 때문에 앞서 배운 user-agent를 복사해서 가져온다.
그리고 특정 속성을 가지고 있는 특정 태그를 가져오기 위해서 딕셔너리를 이용한다.
그리고 가져온 ul 에서 모든 li 정보를 가져오고 싶기 때문에 find_all 을 사용한다.
html 을 살펴보면 태그에 text가 적혀있음을 확인할 수 있다.
따라서 strong 을 find 해주면 strong 정보를 모두 가져온다.
이때 한글과 영어만 가져오기 위해서 정규식을 사용한다.
정규식을 compile 을 먼저 해주고 단어를 치는 경우도 있지만,
함수로 한번에 처리할 수 있다. new_strong 의 text 부분을 가져오고 싶기 때문에
new_strong.text 을 해주고 정규식을 적용시켜준다.
'크롤링' 카테고리의 다른 글
Selenium 크롤링(2) : 커피빈 크롤링 (0) | 2021.07.01 |
---|---|
Selinium 크롤링(1) (0) | 2021.07.01 |
크롤링 연습_할리스 커피 (0) | 2021.06.30 |
데이터 크롤링(1) (0) | 2021.06.30 |