데이터분석을 위해 웹 크롤링을 진행하던 도중 html까지는 불러와지는데 항상해왔던 .select('table') 방식으로 하니 불러지지가 않습니다.

조회수 1105회
### pandas 호출하기
### 웹 크롤링 할 페이지 url이라는 변수에 담기

import pandas as pd 

url = 'https://api.xangle.io/project/exchange/price?lang=ko&currency=krw&page=0&items_per_page=50'

### requests 함수 호출하기 
import requests

### url 문제없는지 체크
print(url)

### headers 지정
headers = {'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'}

### headers type이 dict 형태인지 확인
type(headers)

### resquests 함수의 get 형식으로 요청하기
response = requests.get(url, headers=headers)

### 요청받은 것을 text로 반환
response.text

### BeautifulSoup & lxml을 적용하여 불러오기
from bs4 import BeautifulSoup as bs
html = bs(response.text, 'lxml')
html

### html을 table 단위로 불러오기

### 여기서 문제 html은 불러와지는데 len(table)을 보면 비어있다고 나옵니다.
### table 단위가 아닌 것 같은데 어떻게 해결해야 하는지 몰라 질문을 올립니다.

table = html.select('table')
len(table)

질문사항 : 여기서 문제 html은 불러와지는데 len(table)을 보면 0으로 나옵니다. table 단위가 아닌 것 같은데 어떻게 해야할지 몰라 질문 올립니다. 고수분들 부탁드립니다~

url : https://ko.xangle.io/project/list

1 답변

  • 불러와진 HTML에 테이블이 없을 수도 있습니다. 해당 url 들어가서 소스보기를 해보면 이렇게 나옵니다.

    <!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=robots content="index, follow"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=5"><meta name=msapplication-TileColor content=#ffffff><meta name=theme-color content=#ffffff><meta property=fb:app_id content=2227843314148847><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
            new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
          j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
          'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-N83PQPN');</script><meta name=naver-site-verification content=b85c05f9817a2feb17a00ce5e3d65d3819e10a3f><link rel=icon href=/favicon.ico><link rel=apple-touch-icon sizes=180x180 href=/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/favicon-16x16.png><link rel=manifest href=/site.webmanifest><link rel=mask-icon href=/safari-pinned-tab.svg color=#4219ad><script src=https://developers.kakao.com/sdk/js/kakao.min.js></script><script type=application/ld+json>{
                "@context": "http://schema.org",
                "@type": "Person",
                "name": "Xangle",
                "url": "https://xangle.io",
                "sameAs": [
                    "https://twitter.com/CA_disclosure"
                ]
            }</script><script>var protect_id = 'c491';</script><script async src=//script.boraware.kr/protect_script_ads.js></script><link href=/css/app.c407945d.css rel=preload as=style><link href=/css/node_modules.4d973939.css rel=preload as=style><link href=/css/vuetify.fd8e09c6.css rel=preload as=style><link href=/js/app.7ee34fb3.js rel=preload as=script><link href=/js/node_modules.7235d617.js rel=preload as=script><link href=/js/vuetify.44ff6af3.js rel=preload as=script><link href=/css/vuetify.fd8e09c6.css rel=stylesheet><link href=/css/node_modules.4d973939.css rel=stylesheet><link href=/css/app.c407945d.css rel=stylesheet></head><body class=hide-overlay><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N83PQPN" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><div id=app></div><noscript><strong>We're sorry but crossangle doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><script defer src="https://s3.ap-northeast-2.amazonaws.com/service.xangle.io/xi-widget.min.js?xv=8"></script><script async src="https://www.googletagmanager.com/gtag/js?id=UA-132974252-3"></script><script>window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-132974252-3');</script><script src=//wcs.naver.net/wcslog.js></script><script>if (!wcs_add) var wcs_add={};
      wcs_add["wa"] = "s_15f9acc4cd62";
      if (!_nasa) var _nasa={};
      if(window.wcs){
        wcs.inflow("xangle.io");
        wcs_do(_nasa);
      }</script><script src=/js/vuetify.44ff6af3.js></script><script src=/js/node_modules.7235d617.js></script><script src=/js/app.7ee34fb3.js></script></body></html>
    

    보시다시피 table 태그는 없지요. 그냥 그뿐인 건지도 모릅니다.

    • 답변 너무 감사드립니다. 그러면 이런 데이터는 크롤링이 불가능한건지 아니면 다른 형태로 불러와야하는 걸까요? 결국에는 불러서 dataframe에 넣고 data cleaning을 하려고 하는게 최종 목적입니다:) 알 수 없는 사용자 2021.7.11 16:00
    • 말씀 주신 것을 참고해서 json으로 불러오니 가능하더라고요. 답변 주신게 힌트가 된 것 같습니다. 주말인데도 답변 감사드립니다~ 알 수 없는 사용자 2021.7.11 16:15
    • 방법은 두 가지죠. selenium 같은거 써서 사람이 브라우징 하듯이 기계가 브라우징해서 긁어올 수 있도록 처리하는 방법이 하나고, 다른 하나는 https://api.xangle.io/project/exchange/price?lang=en&currency=usd&page=0&items_per_page=50 같은 내부 API를 뚫는 거구요. 엽토군 2021.7.11 16:16
    • 아직 코딩이나 자료구조가 완벽하게 몸에 익지 않다보니 삽질을 많이 하고 있는 상황입니다. 좋은 정보 감사합니다~ 알 수 없는 사용자 2021.7.11 16:21

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)