目标是爬取2000年到2016年的电影,并进行数据分析。
本文适合新手
下面以2016年的电影为例:
这是我们需要爬取的网页链接:
https://movie.douban.com/tag/2016
进入网页
按Fn+F12,我们就能看到:
通过正则表达式解析获取数据:
pattern = re.compile('<table width=".*?<div class="pl2">.*?>(.*?)</a>.*?class="pl">(.*?)</p>'
+ '.*?<span class="rating_nums">(.*?)</span>.*?class="pl">(.*?)</span>', re.S)
items = re.findall(pattern, html)
实现循环翻页
我们可以发现
第一页的网址为:https://movie.douban.com/tag/2016?start=0&type=T
第二页的网址为:https://movie.douban.com/tag/2016?start=20&type=T
第三页的网址为:https://movie.douban.com/tag/2016?start=40&type=T
……
=.= 得到规律,跳转到下一页只需将start加20;
代码如下:
def main(start):
url = 'https://movie.douban.com/tag/2007?start='+str(start)+'&type=T'
html = get_one_page(url)
if __name__ == '__main__':
for i in range(196):
main(i*20)
range中的数即为页数。
写入文档
利用json.dumps()将dict转化成str格式。
def write_to_file(content):
with open('2007.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
源代码
import requests
from requests.exceptions import RequestException
import re
import json
def get_one_page(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
def parse_one_page(html):
pattern = re.compile('<table width=".*?<div class="pl2">.*?>(.*?)</a>.*?class="pl">(.*?)</p>'
+ '.*?<span class="rating_nums">(.*?)</span>.*?class="pl">(.*?)</span>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'title': item[0].split("/")[0],
'time': item[1].split("/")[0],
'actor': item[1].split("/")[1:],
'average': item[2],
'content': item[3],
}
def write_to_file(content):
with open('2016.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
f.close()
def main(start):
url = 'https://movie.douban.com/tag/2016?start='+str(start)+'&type=T'
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
if __name__ == '__main__':
for i in range(84, 194):
main(i*20)
记事本如图:
接着把2000年到2015年的数据都爬取下来。
嗯。方法很蠢。
把记事本中的文字导入excel
发挥自己强大的excel技能你就能得到
数据分析
我在excel里制作了图表。
我们可以得到2000年以来,电影数量逐年递增,电影质量却呈现下降的趋势,评价人数则上下波动。
进行筛选还可以得到高分热评电影,高分冷门电影……
再也不用纠结周末要看什么电影啦[捂脸]🙃
网友评论
with open('2016.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
f.close()