2017-02-22 62 views
0

Я большой поклонник stackoverflow и, как правило, нахожу решения своих проблем на этом веб-сайте. Однако следующая проблема беспокоит меня так долго, что это заставило меня зарегистрироваться здесь и спросить прямо:Python соскабливает динамический контент (визуальный, отличный от html исходного кода)

Я пытаюсь усиками по этой ссылке: https://permid.org/1-21475776041 Что я хочу есть строка "TRCS активы класса "и" Валюта ".

Для начала, я использую этот код:

from bs4 import BeautifulSoup 
import urllib2 

url = 'https://permid.org/1-21475776041' 

req = urllib2.urlopen(url) 
raw = req.read() 
soup = BeautifulSoup(raw) 
print soup.prettify() 

HTML-код возвращается (смотри ниже) отличается от того, что вы можете увидеть в вашем браузере при нажатии на ссылку:

<!DOCTYPE html> 
<!--[if lt IE 7]>  <html ng-app="tmsMdaasApp" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--> 
<!--[if IE 7]>   <html ng-app="tmsMdaasApp" class="no-js lt-ie9 lt-ie8"> <![endif]--> 
<!--[if IE 8]>   <html ng-app="tmsMdaasApp" class="no-js lt-ie9"> <![endif]--> 
<!--[if gt IE 8]><!--> 
<html class="no-js" ng-app="tmsMdaasApp"> 
<!--<![endif]--> 
<head> 
    <meta content="text/html; charset=utf-8" http-equiv="content-type"/> 
    <meta charset="utf-8"/> 
    <meta content="ie=edge" http-equiv="x-ua-compatible"/> 
    <meta content="max-age=0,no-cache" http-equiv="Cache-Control"/> 
    <base href="/"/> 
    <title ng-bind="PageTitle"> 
    Thomson Reuters | PermID 
    </title> 
    <meta content="" name="description"/> 
    <meta content="width=device-width, initial-scale=1" name="viewport"/> 
    <meta content="#ff8000" name="theme-color"/> 
    <!-- Place favicon.ico and apple-touch-icon.png in the root directory --> 
    <link href="app/vendor.daf96efe.css" rel="stylesheet"/> 
    <link href="app/app.1405210f.css" rel="stylesheet"/> 
    <link href="favicon.ico" rel="icon"/> 
    <!-- Typekit --> 
    <script src="//use.typekit.net/gnw2rmh.js"> 
    </script> 
    <script> 
    try{Typekit.load({async:true});}catch(e){} 
    </script> 
    <!-- // Typekit --> 
    <!-- Google Tag Manager Data Layer --> 
    <!--<script> 
     analyticsEvent = function() {}; 
     analyticsSocial = function() {}; 
     analyticsForm = function() {}; 
     dataLayer = []; 
    </script>--> 
    <!-- // Google Tag Manager Data Layer --> 
</head> 
<body class="theme-grey" id="top" ng-esc=""> 
    <!--[if lt IE 7]> 
     <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> 
    <![endif]--> 
    <!-- Add your site or application content here --> 
    <navbar class="tms-navbar"> 
    </navbar> 
    <div id="body" role="main" ui-view=""> 
    </div> 
    <div id="footer-wrapper" ng-show="!params.elementsToHide"> 
    <footer id="main-footer"> 
    </footer> 
    </div> 
    <!--[if lt IE 9]> 
    <script src="bower_components/es5-shim/es5-shim.js"></script> 
    <script src="bower_components/json3/lib/json3.min.js"></script> 
    <![endif]--> 
    <script src="app/vendor.8cc12370.js"> 
    </script> 
    <script src="app/app.6e5f6ce8.js"> 
    </script> 
</body> 
</html> 

Кто-нибудь знает, что мне здесь не хватает, и как я могу заставить его работать?

+1

Для визуализации динамического контента ты собираешься необходимости использовать браузер. Отъезд Selenium для этого. –

+0

Возможный дубликат [Веб-соскабливание страницы JavaScript с помощью Python] (http://stackoverflow.com/questions/8049520/web-scraping-javascript-page-with-python) –

ответ

1

Спасибо, Teemu Risikko - комментарий (хотя и не решение) связанного с вами сайта дал мне правильный путь.

В случае, если кто-то сталкивается с одной и той же проблемой, вот мое решение: я получаю данные через запросы, а не через традиционную «очистку» (например, BeautifulSoup или lxml).

  1. Перейдите на страницу website, используя Google Chrome.
  2. Щелкните правой кнопкой мыши на веб-сайте и выберите «Осмотреть».
  3. На верхней панели навигации выберите «Сеть».
  4. Ограничить сетевой монитор на "XHR".
  5. Одна из записей (рынок со стрелкой) показывает ссылку, которая может использоваться с библиотекой запросов.

Screenshot

import requests 
url = 'https://permid.org/api/mdaas/getEntityById/21475776041' 
headers = {'X-AG-Access-Token': YOUR_ACCESS_TOKEN} 
r = requests.get(url, headers=headers) 
r.json() 

Что заставляет меня это:

{u'Asset Class': [u'Units'], 
u'Asset Class URL': [u'https://permid.org/1-302043'], 
u'Currency': [u'CAD'], 
u'Currency URL': [u'https://permid.org/1-500140'], 
u'Exchange': [u'TOR'], 
u'IsQuoteOf.mdaas': [{u'Is Quote Of': [u'Convertible Debentures Income Units'], 
    u'URL': [u'https://permid.org/1-21475768667'], 
    u'quoteOfInstrument': [u'21475768667'], 
    u'quoteOfInstrument URL': [u'https://permid.org/1-21475768667']}], 
u'Mic': [u'XTSE'], 
u'PERM ID': [u'21475776041'], 
u'Quote Name': [u'CONVERTIBLE DEBENTURES INCOME UNT'], 
u'Quote Type': [u'equity'], 
u'RIC': [u'OCV_u.TO'], 
u'Ticker': [u'OCV.UN'], 
u'entityType': [u'Quote']} 
0

Использование пользовательского агента по умолчанию с большим количеством страниц даст вам другую страницу, потому что использует устаревший пользовательский агент. Это то, что говорит вам ваш результат.

Reference on Changing user-agents

Мысль это может быть ваша проблема, это не точно ответить на вопрос о том, чтобы динамически применять изменения на веб-странице. Чтобы получить динамически измененные данные, вам необходимо подражать запросам javascript, которые страница делает при загрузке. Если вы делаете запросы, которые делает javascript, вы получите данные, которые получает javascript.