爬虫实战(一)猫眼电影基础数据爬取

看完爬虫基础,是不是有点心动手痒了呢?那么接下来就让我们一起学习如何爬虫吧。

写在爬虫之前

选这个题目的初衷:本人是一个学生党,经济来源较少但平时又特别爱看电影,又没时间关注电影票价的变动,有了这个爬虫之后,这将会极大的缓解我的苦恼。

爬取网页的说明:我们选择美团旗下的猫眼电影页面进行爬取,但不得不承认美团网站页面的反爬虫机制还是很厉害的。所以,我们将目标锁定在了它的客户端页面。

页面地址: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>

我们发现页面中,也是不存在票价信息的,那么这些信息是哪里来的呢?我只能告诉你这是动态加载的。如何实现动态数据的爬取呢,或许我们要留到下次再讲了。

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