Python抓取动态内容(视觉不同于html源代码)

时间:2017-02-22 16:59:17

标签: python web-scraping beautifulsoup

我是stackoverflow的忠实粉丝,通常通过这个网站找到我的问题的解决方案。但是,以下问题困扰了我很长时间,以至于迫使我在这里创建一个帐户并直接询问:

我正试图浏览此链接: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>

有谁知道我在这里缺少什么以及如何让它发挥作用?

2 个答案:

答案 0 :(得分:1)

谢谢你,Teemu Risikko - 你所链接网站的评论(虽然不是解决方案)让我走上了正确的道路。

如果其他人遇到同样的问题,这是我的解决方案:我通过请求获取数据,而不是通过传统的&#34;抓取&#34; (例如BeautifulSoup或lxml)。

  1. 使用Google Chrome浏览器导航至website
  2. 右键点击网站,然后选择&#34;检查&#34;。
  3. 在顶部导航栏中选择&#34;网络&#34;。
  4. 将网络监视器限制为&#34; XHR&#34;。
  5. 其中一个条目(带有箭头的市场)显示了可以与请求库一起使用的链接。
  6. 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']}
    

答案 1 :(得分:0)

使用具有大量页面的默认用户代理将为您提供不同的外观页面,因为它使用的是过时的用户代理。这就是你的输出告诉你的。

Reference on Changing user-agents

认为这可能是您的问题,但它并未完全回答有关在网页上动态应用更改的问题。要获取动态更改的数据,您需要模拟页面在加载时发出的javascript请求。如果你提出javascript正在发出的请求,你将获得javascript所获得的数据。