SiLaure's Data
[selenium] 01. 사이트에 로그인하여 데이터 크롤링하기 본문
- 다음 뉴스 댓글 개수 크롤링
In [42]:
import requests
import json
HTTP 상태 코드
- 1xx (정보): 요청을 받았으며 프로세스를 계속한다
- 2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용하였다
- 3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요하다
- 4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다
- 5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다
url = 'https://comment.daum.net/apis/v1/posts/133493400/comments?parentId=0&offset=0&limit=3&sort=POPULAR&isInitial=true&hasNext=true&randomSeed=1627804639'
resp = requests.get('https://comment.daum.net/apis/v1/posts/133493400/comments?parentId=0&offset=0&limit=3&sort=POPULAR&isInitial=true&hasNext=true&randomSeed=1627804639', headers=headers)
resp
<Response [401]>
다시 request 로 가서 header를 dict로 구성한 뒤,
호출할 때 header를 같이 호출한다.
headers = {
'Origin': 'https://news.v.daum.net'
'Referer: https://news.v.daum.net/v/20190728165812603'
'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"'
'sec-ch-ua-mobile: ?0'
'Sec-Fetch-Dest: empty'
'Sec-Fetch-Mode: cors'
'Sec-Fetch-Site: same-site'
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
resp = requests.get(url, headers=headers)
# print(resp.text)
data = resp.json()
data
[{'id': 393703026,
'userId': 21828062,
'postId': 133493400,
'forumId': -99,
'parentId': 393676277,
'type': 'COMMENT',
'status': 'S',
'flags': 256,
'rating': 0,
'content': '전부 다 같이 자율주행한다면 성공하지 않을까요?\n100년뒤면 어찌될지 몰라요ㅋ',
'createdAt': '2019-07-28T19:29:57+0900',
'updatedAt': '2019-07-28T19:29:57+0900',
'childCount': 0,
'likeCount': 0,
'dislikeCount': 0,
'recommendCount': 0,
'screenedByKeeper': False,
'user': {'id': 21828062,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://k.kakaocdn.net/dn/cOdsNe/btq73jy63nu/Is8EOLpWJYlWJPgLUkE6JK/img_110x110.jpg',
'username': 'KAKAO:711489446',
'roles': 'ROLE_USER,ROLE_KAKAO,ROLE_IDENTIFIED',
'providerId': 'KAKAO',
'providerUserId': '105848184',
'displayName': '.ㄱ견우왕자님',
'description': '',
'commentCount': 607},
'parent': {'id': 393676277,
'userId': -557848722,
'postId': 133493400,
'forumId': -99,
'parentId': 0,
'type': 'COMMENT',
'status': 'D',
'flags': 256,
'rating': 0,
'content': '',
'createdAt': '2019-07-28T18:04:45+0900',
'updatedAt': '2019-07-29T19:39:05+0900',
'childCount': 2,
'likeCount': 5,
'dislikeCount': 7,
'recommendCount': -2,
'screenedByKeeper': False,
'post': {'id': 133493400,
'forumId': -99,
'userId': 0,
'postKey': '20190728165812603',
'type': 'AUTO',
'status': 'S',
'flags': 0,
'createdAt': '2019-07-28T16:59:33+0900',
'updatedAt': '2021-08-01T17:18:59+0900',
'title': '일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"',
'url': 'https://news.v.daum.net/v/NHT9NtZWBe',
'icon': 'https://img1.daumcdn.net/thumb/S1200x630/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg',
'commentCount': 42,
'childCount': 9,
'officialCount': 0},
'user': {'id': -557848722,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://t1.daumcdn.net/profile/vJnnkYDzPbI0',
'url': '',
'username': 'DAUM:BKFW2',
'roles': 'ROLE_USER,ROLE_DAUM,ROLE_IDENTIFIED',
'providerId': 'DAUM',
'providerUserId': 'BKFW2',
'displayName': '한인생',
'description': '',
'commentCount': 65}}},
{'id': 393690060,
'userId': -118726600,
'postId': 133493400,
'forumId': -99,
'parentId': 0,
'type': 'COMMENT',
'status': 'S',
'flags': 256,
'rating': 0,
'content': '시대는 이재 바야흐로 영적진화 와 과학 진화가 공존 하는 새상이 곳 도래 하갯군',
'createdAt': '2019-07-28T18:48:57+0900',
'updatedAt': '2019-07-28T18:48:57+0900',
'childCount': 0,
'likeCount': 0,
'dislikeCount': 0,
'recommendCount': 0,
'screenedByKeeper': False,
'user': {'id': -118726600,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://t1.daumcdn.net/profile/wIW3Q.DCC_g0',
'url': '',
'username': 'DAUM:82ada',
'roles': 'ROLE_USER,ROLE_DAUM,ROLE_IDENTIFIED',
'providerId': 'DAUM',
'providerUserId': '82ada',
'displayName': '생명의빚으로',
'description': '',
'commentCount': 7809}},
{'id': 394002136,
'userId': 3015947,
'postId': 133493400,
'forumId': -99,
'parentId': 0,
'type': 'COMMENT',
'status': 'S',
'flags': 0,
'rating': 0,
'content': '실제 아이언맨이라고 불리는 얼론 머스크 잘 알고 있습니다. 항상 발전하는 모습 보고있고 언젠가 우리도 그의 기술을 사용하며 편의를 즐기는 날이 올것 갔습니다. 우주에서도 많은 계획이 있다고 들었습니다. 화이팅',
'createdAt': '2019-07-29T16:06:10+0900',
'updatedAt': '2019-07-29T16:06:10+0900',
'childCount': 0,
'likeCount': 3,
'dislikeCount': 0,
'recommendCount': 3,
'screenedByKeeper': False,
'user': {'id': 3015947,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://t1.daumcdn.net/profile/klq2XglmGLU0',
'url': '',
'username': 'DAUM:9wdBs',
'roles': 'ROLE_USER,ROLE_DAUM,ROLE_IDENTIFIED',
'providerId': 'DAUM',
'providerUserId': '9wdBs',
'displayName': '진성표',
'description': '',
'commentCount': 62}}]
data['commnetCount']
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-49-e39a5d39f79c> in <module>
----> 1 data['commnetCount']
TypeError: list indices must be integers or slices, not str
학습목표
- 다음 뉴스 댓글 개수 크롤링
- 로그인 하여 크롤링 하기
import requests
import json
url = 'https://comment.daum.net/apis/v1/posts/133493400/comments?parentId=0&offset=0&limit=3&sort=POPULAR&isInitial=true&hasNext=true&randomSeed=1627804639'
resp = requests.get('https://comment.daum.net/apis/v1/posts/133493400/comments?parentId=0&offset=0&limit=3&sort=POPULAR&isInitial=true&hasNext=true&randomSeed=1627804639', headers=headers)
resp
<Response [401]>
다시 request 로 가서 header를 dict로 구성한 뒤,
호출할 때 header를 같이 호출한다.
headers = {
'Origin': 'https://news.v.daum.net'
'Referer: https://news.v.daum.net/v/20190728165812603'
'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"'
'sec-ch-ua-mobile: ?0'
'Sec-Fetch-Dest: empty'
'Sec-Fetch-Mode: cors'
'Sec-Fetch-Site: same-site'
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
resp = requests.get(url, headers=headers)
# print(resp.text)
data = resp.json()
data
[{'id': 393703026,
'userId': 21828062,
'postId': 133493400,
'forumId': -99,
'parentId': 393676277,
'type': 'COMMENT',
'status': 'S',
'flags': 256,
'rating': 0,
'content': '전부 다 같이 자율주행한다면 성공하지 않을까요?\n100년뒤면 어찌될지 몰라요ㅋ',
'createdAt': '2019-07-28T19:29:57+0900',
'updatedAt': '2019-07-28T19:29:57+0900',
'childCount': 0,
'likeCount': 0,
'dislikeCount': 0,
'recommendCount': 0,
'screenedByKeeper': False,
'user': {'id': 21828062,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://k.kakaocdn.net/dn/cOdsNe/btq73jy63nu/Is8EOLpWJYlWJPgLUkE6JK/img_110x110.jpg',
'username': 'KAKAO:711489446',
'roles': 'ROLE_USER,ROLE_KAKAO,ROLE_IDENTIFIED',
'providerId': 'KAKAO',
'providerUserId': '105848184',
'displayName': '.ㄱ견우왕자님',
'description': '',
'commentCount': 607},
'parent': {'id': 393676277,
'userId': -557848722,
'postId': 133493400,
'forumId': -99,
'parentId': 0,
'type': 'COMMENT',
'status': 'D',
'flags': 256,
'rating': 0,
'content': '',
'createdAt': '2019-07-28T18:04:45+0900',
'updatedAt': '2019-07-29T19:39:05+0900',
'childCount': 2,
'likeCount': 5,
'dislikeCount': 7,
'recommendCount': -2,
'screenedByKeeper': False,
'post': {'id': 133493400,
'forumId': -99,
'userId': 0,
'postKey': '20190728165812603',
'type': 'AUTO',
'status': 'S',
'flags': 0,
'createdAt': '2019-07-28T16:59:33+0900',
'updatedAt': '2021-08-01T17:18:59+0900',
'title': '일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"',
'url': 'https://news.v.daum.net/v/NHT9NtZWBe',
'icon': 'https://img1.daumcdn.net/thumb/S1200x630/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg',
'commentCount': 42,
'childCount': 9,
'officialCount': 0},
'user': {'id': -557848722,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://t1.daumcdn.net/profile/vJnnkYDzPbI0',
'url': '',
'username': 'DAUM:BKFW2',
'roles': 'ROLE_USER,ROLE_DAUM,ROLE_IDENTIFIED',
'providerId': 'DAUM',
'providerUserId': 'BKFW2',
'displayName': '한인생',
'description': '',
'commentCount': 65}}},
{'id': 393690060,
'userId': -118726600,
'postId': 133493400,
'forumId': -99,
'parentId': 0,
'type': 'COMMENT',
'status': 'S',
'flags': 256,
'rating': 0,
'content': '시대는 이재 바야흐로 영적진화 와 과학 진화가 공존 하는 새상이 곳 도래 하갯군',
'createdAt': '2019-07-28T18:48:57+0900',
'updatedAt': '2019-07-28T18:48:57+0900',
'childCount': 0,
'likeCount': 0,
'dislikeCount': 0,
'recommendCount': 0,
'screenedByKeeper': False,
'user': {'id': -118726600,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://t1.daumcdn.net/profile/wIW3Q.DCC_g0',
'url': '',
'username': 'DAUM:82ada',
'roles': 'ROLE_USER,ROLE_DAUM,ROLE_IDENTIFIED',
'providerId': 'DAUM',
'providerUserId': '82ada',
'displayName': '생명의빚으로',
'description': '',
'commentCount': 7809}},
{'id': 394002136,
'userId': 3015947,
'postId': 133493400,
'forumId': -99,
'parentId': 0,
'type': 'COMMENT',
'status': 'S',
'flags': 0,
'rating': 0,
'content': '실제 아이언맨이라고 불리는 얼론 머스크 잘 알고 있습니다. 항상 발전하는 모습 보고있고 언젠가 우리도 그의 기술을 사용하며 편의를 즐기는 날이 올것 갔습니다. 우주에서도 많은 계획이 있다고 들었습니다. 화이팅',
'createdAt': '2019-07-29T16:06:10+0900',
'updatedAt': '2019-07-29T16:06:10+0900',
'childCount': 0,
'likeCount': 3,
'dislikeCount': 0,
'recommendCount': 3,
'screenedByKeeper': False,
'user': {'id': 3015947,
'status': 'S',
'type': 'USER',
'flags': 0,
'icon': 'https://t1.daumcdn.net/profile/klq2XglmGLU0',
'url': '',
'username': 'DAUM:9wdBs',
'roles': 'ROLE_USER,ROLE_DAUM,ROLE_IDENTIFIED',
'providerId': 'DAUM',
'providerUserId': '9wdBs',
'displayName': '진성표',
'description': '',
'commentCount': 62}}]
data['commnetCount']
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-49-e39a5d39f79c> in <module>
----> 1 data['commnetCount']
TypeError: list indices must be integers or slices, not str
나는 whyrano ㅠ
- 로그인하여 데이터 크롤링하기
- 특정한 경우, 로그인을 해서 크롤링을 해야만 하는 경우가 존재
- 예) 쇼핑몰에서 주문한 아이템 목록, 마일리지 조회 등
- 이 경우, 로그인을 자동화 하고 로그인에 사용한 세션을 유지하여 크롤링을 진행
- 로그인 후 데이터 크롤링 하기
- endpoint 찾기 (개발자 도구의 network를 활용)
- id와 password가 전달되는 form data찾기
- session 객체 생성하여 login 진행
- 이후 session 객체로 원하는 페이지로 이동하여 크롤링
import requests
from bs4 import BeautifulSoup
- endpoint 찾기
url = 'https://www.kangcom.com/member/member_check.asp'
- id, password로 구성된 form data 생성하기
data = {
'id': 'macmath22',
'pwd': 'Test1357!'
}
- login
- endpoint(url)과 data를 구성하여 post 요청
- login의 경우 post로 구성하는 것이 정상적인 웹사이트!
s = requests.Session()
resp = s.post(url, data=data)
print(resp.status_code)
500
- crawling
- login 시 사용했던 session을 다시 사용하여 요청
mypage = 'https://www.kangcom.com/mypage/'
resp = s.get(mypage)
soup = BeautifulSoup(resp.text)
mileage = soup.select_one('td.a_bbslist55:nth-child(3)')
print(mileage.get_text())
5,040원
'Records of > Learning' 카테고리의 다른 글
[DB] 02. 관계형 데이터베이스(Relationship Database - RDB) (0) | 2021.08.04 |
---|---|
[DB] 01. 데이터베이스 (0) | 2021.08.04 |
[BeautifulSoup] 02~04. id class 속성/CSS/정규표현식을 이용하여 원하는 값 추출하기 (0) | 2021.08.01 |
[Kaggle] Titanic Competition (0) | 2021.07.30 |
[beautifulsoup] 01. beautifulsoup 모듈 사용하여 HTML 파싱하기(parsing) (0) | 2021.07.29 |