웹 스크랩 - Angular.js를 통해 JavaScript에 렌더링된 콘텐츠에 액세스하는 방법
공공 사이트 asx.com에서 데이터를 긁어모으려고 합니다.au
http://www.asx.com.au/asx/research/company.do#!/ACB/details 페이지에는div
필요한 정보가 있는 클래스 'view-content'를 사용합니다.
하지만 Python의 Python을 통해 이 페이지를 보려고 하면urllib2.urlopen
div가 비어 있습니다.
import urllib2
from bs4 import BeautifulSoup
url = 'http://www.asx.com.au/asx/research/company.do#!/ACB/details'
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page, "html.parser")
contentDiv = soup.find("div", {"class": "view-content"})
print(contentDiv)
# the results is an empty div:
# <div class="view-content" ui-view=""></div>
그 div의 내용에 프로그래밍 방식으로 접근할 수 있습니까?
편집: 코멘트에 의하면, 컨텐츠는 다음의 방법으로 렌더링 되는 것 같습니다.Angular.js
Python을 통해 그 콘텐츠를 렌더링할 수 있습니까?
이 페이지의 용도JavaScript
서버에서 데이터를 읽고 페이지를 채웁니다.
개발 도구를 사용하시는군요.Chrome
- 탭 참조Network
에XHR
또는JS
요청한다.
다음 URL을 찾았습니다.
이 URL은 거의 JSON 형식으로 모든 데이터를 제공합니다.
하지만 이 링크를 사용하여&callback=angular.callbacks._0
순수 JSON 형식의 데이터를 얻으면json
python 사전으로 변환합니다.
편집: 작업 코드
import urllib2
import json
# new url
url = 'http://data.asx.com.au/data/1/company/ACB?fields=primary_share,latest_annual_reports,last_dividend,primary_share.indices'
# read all data
page = urllib2.urlopen(url).read()
# convert json text to python dictionary
data = json.loads(page)
print(data['principal_activities'])
출력:
Mineral exploration in Botswana, China and Australia.
편집(2020.12.23)
이 답변은 거의 5년이 되었고 Python2용으로 작성되었습니다.이제 Python3에서는,urllib.request.urlopen()
또는requests.get()
하지만 진짜 문제는 이 페이지가 5년 동안 구조와 기술을 바꿨다는 것입니다.(질문 응답에 있는) URL은 더 이상 존재하지 않습니다.이 페이지에는 새로운 분석과 새로운 방법이 필요합니다.
문제가 된 것은 url이었다.
http://www.asx.com.au/asx/research/company.do#!/ACB/details
그러나 현재 페이지는 url을 사용합니다.
https://www2.asx.com.au/markets/company/acb
그리고 다른 URL을 사용합니다.AJAX
,XHR
https://asx.api.markitdigital.com/asx-research/1.0/companies/acb/about
https://asx.api.markitdigital.com/asx-research/1.0/companies/acb/announcements
https://asx.api.markitdigital.com/asx-research/1.0/companies/acb/key-statistics
기타.
다음 URL을 사용하여 더 많은 URL을 찾을 수 있습니다.DevTools
에Chrome
/Firefox
(탭:Network
, 필터:XHR
)
import urllib.request
import json
# new url
url = 'https://asx.api.markitdigital.com/asx-research/1.0/companies/acb/about'
# read all data
page = urllib.request.urlopen(url).read()
# convert json text to python dictionary
data = json.loads(page)
print(data['data']['description'])
출력:
Minerals exploration & development
언급URL : https://stackoverflow.com/questions/35050746/web-scraping-how-to-access-content-rendered-in-javascript-via-angular-js
'programing' 카테고리의 다른 글
DataTables: 정의되지 않은 속성 '길이'를 읽을 수 없습니다. (0) | 2023.03.11 |
---|---|
Jackson을 사용한 두 개의 JSON 문서 병합 (0) | 2023.03.11 |
타이프스크립트:네스트된 객체의 인터페이스를 정의하려면 어떻게 해야 합니까? (0) | 2023.03.11 |
Rails 앱에서 Wordpress 테마를 사용하려면? (0) | 2023.03.11 |
다이내믹 NG 컨트롤러 이름 (0) | 2023.03.11 |