需要安装的库
1 2
| import request from bs4 import BeautifulSoup
|
简介
本爬虫的目的主要是从豆瓣top250中爬取所有电影的排名、名称和简介,为此我们先去
https://movie.douban.com/top250 中观察源代码结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <ol class="grid_view"> <li> <div class="item"> <div class="pic"> <em class="">1</em> <a href="https://movie.douban.com/subject/1292052/"> <img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class=""> </a> </div> <div class="info"> <div class="hd"> <a href="https://movie.douban.com/subject/1292052/" class=""> <span class="title">肖申克的救赎</span> <span class="title"> / The Shawshank Redemption</span> <span class="other"> / 月黑高飞(港) / 刺激1995(台)</span> </a>
<span class="playable">[可播放]</span> </div> <div class="bd"> <p class=""> 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br> 1994 / 美国 / 犯罪 剧情 </p>
<div class="star"> <span class="rating5-t"></span> <span class="rating_num" property="v:average">9.7</span> <span property="v:best" content="10.0"></span> <span>1996961人评价</span> </div>
<p class="quote"> <span class="inq">希望让人自由。</span> </p> </div> </div> </div> </li>
|
看着一段代码,说明了影片的信息是藏在ol里的li里面,这次我们想要爬取的分别是em里的排名信息,span class_=’title’里的名称信息和span class_=’inq’里的简介信息,如果有需要,我们也可以爬取其他标签里的信息
代码步骤
首先我们需要一个爬取网页内容的函数
1 2 3 4 5 6 7 8
| def getHTMLText(url): try: r = requests.get(url, headers = kv) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ""
|
这个函数负责将url里的内容爬取下来,并且返回,这里的kv是一个事先定义好的字典:
1
| kv = {'user-agent':'Mozilla/5.0'}
|
这个是为了把我们的访问信息伪装成火狐浏览器,否则可能会被禁止访问
其次我们需要一个解析HTML源码的函数,把这些信息从代码中找出来
1 2 3 4 5 6 7 8 9 10 11
| def fillList(ulist, html): soup = BeautifulSoup(html, "html.parser") lis = soup.select("ol li") for tr in lis: index = tr.find('em').text title = tr.find('span', class_='title').text if index == '241' or index == '247' or index == '245': inq = " " else: inq = tr.find('span', class_='inq').text ulist.append([index, title, inq])
|
这个函数用到了BeautifulSoup库,主要功能是把“ol li“里的各种我们需要的信息找出来,并且用列表的方式加到一个列表里,也就是列表的元素也是列表。值得注意的是,第241、245、247名电影是没有评语的,所以我加了一个判断条件,如果是这三个电影,评语就用一个空格表示,最后电影的信息以[index, title, inq]这样的形式被加到ulist列表里。
下来是输出函数,用于将列表里的电影信息输出
我们已经获得了一个ulist列表,里面装的是我们爬取的所有信息,接下来我们用一个函数输出他:
1 2 3 4
| def printList(ulist): for i in range(25): u = ulist[i] print("{:^10}\t{:^16}\t{:^20}".format(u[0],u[1],u[2]))
|
非常简单,就是简单的循环遍历
最后,是我们的主函数
1 2 3 4 5 6 7 8 9 10 11 12 13
| def main(): uinfo = [] url = "https://movie.douban.com/top250" url1 = "https://movie.douban.com/top250" for i in range(0, 250, 25): if i == 0: pass else: url1 = url + "?start=" + str(i) + "&filter=" html = getHTMLText(url1) fillList(uinfo, html) printList(uinfo) uinfo = []
|
这段函数就是将url填入到函数里,用于三个函数的连接,要注意的是豆瓣网页上一页只有25个电影,所以我们每爬取一个网站后要在网页参数后加25,这个url在豆瓣网上可以直观的找到规律。
接下来贴上全部的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import requests from bs4 import BeautifulSoup kv = {'user-agent':'Mozilla/5.0'} print("{:^10}\t{:^16}\t{:^20}".format("排名","电影名","电影评语")) def getHTMLText(url): try: r = requests.get(url, headers = kv) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def fillList(ulist, html): soup = BeautifulSoup(html, "html.parser") lis = soup.select("ol li") for tr in lis: index = tr.find('em').text title = tr.find('span', class_='title').text if index == '241' or index == '247' or index == '245': inq = " " else: inq = tr.find('span', class_='inq').text ulist.append([index, title, inq]) def printList(ulist): for i in range(25): u = ulist[i] print("{:^10}\t{:^16}\t{:^20}".format(u[0],u[1],u[2])) def main(): uinfo = [] url = "https://movie.douban.com/top250" url1 = "https://movie.douban.com/top250" for i in range(0, 250, 25): if i == 0: pass else: url1 = url + "?start=" + str(i) + "&filter=" html = getHTMLText(url1) fillList(uinfo, html) printList(uinfo) uinfo = [] main()
|
最后展示下部分效果:
排名 电影名 电影评语
1 肖申克的救赎 希望让人自由。
2 霸王别姬 风华绝代。
3 阿甘正传 一部美国近现代史。
4 这个杀手不太冷 怪蜀黍和小萝莉不得不说的故事。
5 美丽人生 最美的谎言。
6 泰坦尼克号 失去的才是永恒的。
7 千与千寻 最好的宫崎骏,最好的久石让。
8 辛德勒的名单 拯救一个人,就是拯救整个世界。
9 盗梦空间 诺兰给了我们一场无法盗取的梦。
10 忠犬八公的故事 永远都不能忘记你所爱的人。
11 海上钢琴师 每个人都要走一条自己坚定了的路,就算是粉身碎骨。
12 楚门的世界 如果再也不能见到你,祝你早安,午安,晚安。
13 三傻大闹宝莱坞 英俊版憨豆,高情商版谢耳朵。
至此,我们的豆瓣top250电影爬虫就完成了