0%

python豆瓣top250爬虫

需要安装的库

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">&nbsp;/&nbsp;The Shawshank Redemption</span>
<span class="other">&nbsp;/&nbsp;月黑高飞(港) / 刺激1995(台)</span>
</a>


<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
</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电影爬虫就完成了