爬蟲實戰(一)貓眼電影基礎數據爬取

看完爬蟲基礎,是不是有點心動手癢了呢?那麼接下來就讓我們一起學習如何爬蟲吧。

寫在爬蟲之前

選這個題目的初衷:本人是一個學生黨,經濟來源較少但平時又特別愛看電影,又沒時間關注電影票價的變動,有了這個爬蟲之後,這將會極大的緩解我的苦惱。

爬取網頁的說明:我們選擇美團旗下的貓眼電影頁面進行爬取,但不得不承認美團網站頁面的反爬蟲機制還是很厲害的。所以,我們將目標鎖定在了它的客戶端頁面。

頁面地址:http://m.maoyan.com/imeituan/

開始寫代碼

按照我們之前學的基礎,我們可以大致的整理出如下代碼:

import requests

res = requests.get('http://m.maoyan.com/imeituan/').text
print(res)

我們遇到了如下的錯誤:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="shortcut icon" href="http://ms0.meituan.com/braavos/static/logo.png">
<title>貓眼訪問控制</title>
<style>...</style>
</head>
<body>
  <header>
    <!-- <h1>MaoYan Access Control System</h1> -->
    <h3>
      <p>很抱歉,您的訪問被禁止了</p>
      <p>如果您認爲我們出錯了,請聯繫我們 <a href="mailto:[email protected]">[email protected]</a></p>
    </h3>
  </header>
  <footer>
    <a href="https://maoyan.com">貓眼電影</a>
  </footer>
</body>
</html>

這是什麼意思呢,就是說我們寫的代碼太Low了,別人已經知道我們會用這樣的方法爬取它的數據。好在我們還有些經驗,試着將我們的爬蟲僞裝成一個瀏覽器,於是在get()方法里加入header參數,參數裏面會包含瀏覽器的版本信息,如下所示。

import requests

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
}
res = requests.get('http://m.maoyan.com/imeituan/',headers=header).text
print(res)

我們發現爬取成功了!頁面部分結果如下所示:

<!DOCTYPE html>
<html class=" unknow">
<head>
  ...
  <title>電影</title>
</head>

<body body-id='c_dmLad' class="">
<header class="navbar">...</header>

<div class="hotList">
  <div class="hotHeader">
    <a href="/imeituan/hot?_v_=yes" data-bid="b_q1Dwc"><p class="more more-weak">查看全部</p></a>
    <p class="title">熱映影片</p>
  </div>
  <div class="hotContent">
    <div class="item">
      <a href="/imeituan/movie/341195?_v_=yes" data-bid="b_RndzV" data-lab="{ movie_id:341195 }">
        <img data-src="//p1.meituan.net/w.h/movie/b9395cd202a461303cf06cea89292071556090.png" alt="正義聯盟"/>
        <p class="movieName">正義聯盟</p>
        <p class="movieScore">8.6分</p>
      </a>
    </div>
    <div class="item">...</div>
    ...
  </div>
</div>

<div id = "filter">...</div>
<script type="text/javascript">...</script>
<footer class="footer">...</footer>
  </div>
</body>
</html>

這輸出的結果對於我們來說是一個好消息,因爲我們得到了電影的信息。但頁面裏卻沒有關於票價的信息,我們觀察了一下頁面數據,發現電影數據下面有每部電影的鏈接地址
"/imeituan/movie/341195?_v_=yes"。
經驗告訴我們只需要如下地址:
"/imeituan/movie/341195"
確切的說完整的是如下地址:
"http://m.maoyan.com/imeituan/movie/341195"。
也就是說我們還要進行字符串的截取和拼接,如果忘了,請回顧一下我們之前學的python第7章字符串的內容。

import requests

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
}
res = requests.get('http://m.maoyan.com/imeituan/movie/341195',headers=header).text
print(res)

上述代碼是我們對電影“正義聯盟”的頁面進行的爬取測試,結果如下:

"D:\Program Files\Anaconda2\envs\py3\python.exe" C:/Users/SCALE/Desktop/bilibili-user-wen/test.py
<!DOCTYPE html>
<html class=" unknow">
<head>
  ...
  <title>正義聯盟</title>
  <script type="text/javascript">...</script>
</head>

<body body-id='c_76cEz' class="">
...
<header class="navbar">...</header>

<div class="movieInfo">
  <img class="movieAlbum" src="//p1.meituan.net/220.300/movie/b9395cd202a461303cf06cea89292071556090.png" alt="正義聯盟">
  <div class="movieContent">
<p class="movieName">正義聯盟</p><p class="movieEName">Justice League</p>    
<div class="movieScore">
      <p class="starWrapper">
        <span class="starBg">...</span>
        <span class="starOut" style="width:86%">...</span>
      </p>
      <p class="scoreNum">8.6</p>
    </div>
    <p class="movieNum">(114171人評分)</p>
    <p class="movieCat">動作,冒險,科幻
      <span class="movieTag">IMAX 3D</span>
    </p>
    <p class="movieSrc">美國 / 120分鐘</p>
<p class="moviePubDesc">2017-11-17大陸上映</p>  </div>
</div>

<div class="movieDate">
  ...
</div>

<div id = "filter">
  ...
</div>

<footer class="footer">
    <div class="footer-links">友情鏈接:<a class="theme-color" href="//m.maoyan.com">貓眼電影</a></div>
    <div class="footer-line footer-copyright">
        <div class="hr"></div>
        <span class="footer-copyright-text">©2017 美團網 <a href="http://www.miibeian.gov.cn/" target="_blank">京ICP證070791號</a></span>
    </div>
</footer>
  </div>
</body>
</html>

我們發現頁面中,也是不存在票價信息的,那麼這些信息是哪裏來的呢?我只能告訴你這是動態加載的。如何實現動態數據的爬取呢,或許我們要留到下次再講了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章