使用Python爬取豆瓣电影TOP250

最近在学习Python爬虫,学习并使用了一个非常强大的解析库:gawel/pyquery: A jquery-like library for python,语法和Jquery非常类似,可以非常方便地提取信息,因此也顺便挑战了一下爬取豆瓣电影TOP 250,链接为:https://movie.douban.com/top250?start=0&filter= ,由于刚开始学习爬虫,代码将就着看,也简单的总结了一下。

  1. 豆瓣电影页面采取了反爬虫措施,因此在爬虫时速度不宜过快,使用time.sleep()函数进行休眠,否则会封IP,或者使用代理进行,但我尝试了一些免费代理并没有成功。
  2. 爬虫的文件存储为cvs格式,使用logging进行日志记录,方便查看进度
  3. 由于个别页面并不是统一的格式,如有的电影(如千与千寻)有官方网站,大部分没有,大部分可以正常对应cvs页面,但对于这些特殊的页面则可能存在误差,最终文件我是手动修改的,并将其转换为excel。
  4. 由于还未涉及到数据分析,也就没有对该数据进行分析了

数据的爬取

以下为简单的代码:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from pyquery import PyQuery as pq
import csv
import logging
import time

#豆瓣Top250信息爬取:https://movie.douban.com/top250?start=0&filter=
#使用休眠方法爬取 爬取速度非常慢,防止豆瓣封IP

start_url='https://movie.douban.com/top250?start=%s&filter='

#存储目录
csv_file='douban_top250.csv'

logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(name)s-%(levelname)s-%(message)s')
logger=logging.getLogger(__name__)

head_str='电影名称,年份,概括,导演,编剧,主演,类型,制片国家,语言,上映日期,片长,别名,评分,评价人数,链接'
csv_heads=head_str.split(',')

#写入头信息
with open(csv_file,'w',encoding='utf_8_sig',newline='') as f:
writer=csv.writer(f)
writer.writerow(csv_heads)

real_page=0
for page in range(0,250,25):

logger.info("正在休眠5s,请稍后……")
time.sleep(5)

real_page+=1
logger.info('正在获取第%s页的信息',real_page)
page_url=start_url % page #当前页链接
page_doc=pq(page_url)
single_doc=page_doc('.item') #获取单项信息
for item in single_doc.items():
#电影名称,年份,概括,导演,编剧,主演,类型,制片国家,语言,上映日期,片长,别名,评分,评价人数,链接
info_list=[]
#评分
rate=item('.star .rating_num').text()
#评价人数
rate_nums=item('.star span').eq(3).text()
#概括
quote=item('.bd p').eq(1).text()

#进入详情页面提取信息
detail_url=item('.pic a').attr('href')
detail_doc=pq(detail_url)

#为防止封IP,休眠5s
logger.info("正在休眠3s,请稍后……")
time.sleep(3)

#电影名称和年份
title=detail_doc('h1 span').eq(0).text()
year=detail_doc('h1 .year').text()[1:-1]

info_list.append(title)
info_list.append(year)
info_list.append(quote)

#基本信息
infos=detail_doc('#info').text().split('\n')[:-1]
for index in range(len(infos)):
info=infos[index].split(':')[1]
info_list.append(info)
info_list.append(rate)
info_list.append(rate_nums)
info_list.append(detail_url)

#部分电影有官方链接如https://movie.douban.com/subject/1291561/,去除该链接,但可能会误删,最终手动修复
if len(info_list)==16:
del info_list[7] #删除官方网站

with open(csv_file,'a',encoding='utf_8_sig',newline='') as f:
writer=csv.writer(f)
writer.writerow(info_list)
logger.info('获取------%s------信息成功!',title)

最终爬取的文件截图如下,包括的字段为:电影名称,年份,概括,导演,编剧,主演,类型,制片国家,语言,上映日期,片长,别名,评分,评价人数,链接

下载链接:https://www.lanzous.com/i6317he

简单的数据分析

由于对Python的数据分析还不了解,简单地用Excel进行分析。

豆瓣电影TOP250制片国家分布

豆瓣电影TOP250年份分布

年份占比

豆瓣电影TOP250中,制片国为美国的电影占了118部,而中国大陆仅有14部,20时间90年代后到至今的30年中,TOP250高达86%,而中国电影虽拍的非常多,但高质量的影片依然不足。同问,中国何时能再次拍出“霸王别姬”?

坚持原创技术分享,您的支持将鼓励我继续创作!
0%