这篇文章主要介绍介绍用Python以及相关的库来抓取豆瓣电影top250排行榜中的相关电影信息,并保存在本地,用来后续的分析和处理。

Python版本:3.5.3
代码用到的库有:
1.urllib.request:用来获取网页代码
2.pandas:建立列表,保存网页信息
3.BeautifulSoup:解析网页源代码,得到需要的电影信息
4.time:让程序终止,防止访问过于频繁导致IP被禁

1
2
3
4
import urllib.request
import pandas as pd
from bs4 import BeautifulSoup
import time

要得到网页信息,首先需要找到相应网页的url,打开Chrome浏览器,找到豆瓣电影top250的网页,发现网址是


往下翻了几页之后发现链接变成了

每页25部电影,一共需要10页便可以抓取全部250部电影的相关网页。通过验证start后面的参数为当前网页起始电影,因此构造url
1
url = 'https://movie.douban.com/top250?start='+str(25*page)+'&filter='

连接中page为传入的网页的页数。

然后用urllib库得到得想相应的网页源代码

1
2
3
4
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
html = response.read()
html = html.decode('utf-8')

打印所得到的结果,发现网页已经被抓下来了

然后用beautifulsoup解析网页,按F10打开开发者模式,首先找到列表的主题位置,如图所示,


用find(),找到当前页面电影的信息,然后再找到每一步电影的信息的位置,如图

然后用find_all()保存在列表中,

1
2
soup = BeautifulSoup(html, "html.parser") # 解析网页
movie_all = soup.find('div', class_='article').find_all('div', class_='info')

打印出的结果如下图所示

然后在上面得到的列表中找到电影的名称,评分,评论人数,导演,年代,国家,类型等信息,主要用到find()用来得到相应信息,然后用repalce()和split()去掉多余的字符。然后根据得到信息的格式将信息分类,调试的时候遇到问题可以直接把得到的结果打印出来然后根据打印的结果来修改代码,具体的实现过程就不详细解释了,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for movie in movie_all:
name = movie.find('span', class_='title').get_text() # 获取电影名称
ratingnum = movie.find('div', class_='star').get_text().replace("\n", " ") # 获取电影评分和评论人数
ratingnum = ratingnum.split(' ')
rating = ratingnum[2] # 获取豆瓣评分
num = ratingnum[4] # 获取评论人数
url = movie.find('a')['href'] # 获取电影豆瓣链接
info = movie.find('p', class_='').get_text() # 获取电影信息
info = info.split('\n')
daoyan = info[1].replace(' ', '').split('\xa0\xa0\xa0')[0].split(':')[1] # 获取导演信息
zhuyan = info[1].replace(' ', '').split('\xa0\xa0\xa0')[1] # 获取主演信息
year = info[2].replace('\xa0', '').split('/')[0].replace(' ', '').replace('\xa0', '') # 获取年代信息
country = info[2].replace('\xa0', '').split('/')[1] # 获取国家信息
type = info[2].replace('\xa0', '').split('/')[2] # 获取类型信息

把得到的电影信息打印出来

为了保存电影的信息,需要先创建一个列表

1
df = pd.DataFrame(columns=['名称', '评分','评论人数', '导演','主演','年代','国家','类型','豆瓣链接'])

然后把得到的电影信息存到列表当中

1
2
3
4
5
6
7
8
9
df.loc[No] = {'名称': name,
'评分': rating,
'评论人数': num,
'导演': daoyan,
'主演': zhuyan,
'年代': year,
'国家': country,
'类型': type,
'豆瓣链接':url}

其中,No为电影的排名

最后将得到的列表存储在本地,便于以后的查看与分析。

1
df.to_csv('movie.csv') # 保存到CSV文件中

用Excel打开movie.csv文件可以看到,所需要的电影信息已经保存下来了。


爬虫的工作到这里就基本上结束了,得到的电影信息可以用来后续的分析和处理