看完爬虫基础,是不是有点心动手痒了呢?那么接下来就让我们一起学习如何爬虫吧。
写在爬虫之前
选这个题目的初衷:本人是一个学生党,经济来源较少但平时又特别爱看电影,又没时间关注电影票价的变动,有了这个爬虫之后,这将会极大的缓解我的苦恼。
爬取网页的说明:我们选择美团旗下的猫眼电影页面进行爬取,但不得不承认美团网站页面的反爬虫机制还是很厉害的。所以,我们将目标锁定在了它的客户端页面。
页面地址: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:oceanus.feedback@maoyan.com">oceanus.feedback@maoyan.com</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>
小结
我们发现页面中,也是不存在票价信息的,那么这些信息是哪里来的呢?我只能告诉你这是动态加载的。如何实现动态数据的爬取呢,或许我们要留到下次再讲了。