豆瓣电影TOP250,一直被奉为优质电影排行榜的权威。学了一段时间的python后,打算学以致用,发掘下豆瓣电影TOP250榜单背后的秘密。
巧妇难为无米之炊,没有现成的数据,只好自己动手造轮子了。
打开网页,发现榜单上每部电影只介绍了一部分信息,要爬取详细信息,还是得去每部电影的主页。
点击进入其中一部电影主页(例:肖申克的救赎),用chrome浏览器开发者工具(右键“检查”)看下源代码,还是熟悉的配方:
1、导入要用的第三方模块
import requests
from bs4 import BeautifulSoup
import re
import time
import pandas as pd
from pandas import Series,DataFrame
2、将网址传到requests模块,并进行解析,由于会多次用到,直接封装成函数:
def getsoup(url):
res=requests.get(url)
res.encoding='utf-8'
return BeautifulSoup(res.text,'html.parser')
3、观察源码结构,提取需要的字段信息,如电影名、编剧、主演信息提取:
movie_name=soup.select('#content h1 span')[0].text
info=soup.select('#info')[0].text
director=re.findall('导演:\s(.*?)\s编剧:',info)[0].split('/')
scriptwriter=re.findall('编剧:\s(.*?)\s主演:',info)[0].split('/')
4、print打印出来,发现是我们所需要的信息:
5、接下来开始批量获取电影信息,观察榜单网址(https://movie.douban.com/top250?start=0&filter=)发现,翻页只会改变start后的数字:
u=r'https://movie.douban.com/top250?start={}&filter='
for i in range(0,250,25):
newurl=u.format(i)
for site in getsoup(newurl).select('.pic a'):
url=site['href']
soup=getsoup(url)
6、把提取出来的数据转换成DataFrame格式,方便后续的分析:
movie={'rank':num,'name':movie_name,'director':director,'scriptwriter':scriptwriter, 'actor':actor,'genres':genres,'state':state,'language':language,'release_date':release_date,'duration':duration,'prize':prize,'grade':grade,'pjrs':pjrs,'star':star_level }
df=DataFrame(movie,columns['rank','name','director','scriptwriter','actor','genres','state','language','release_date','duration','prize','grade','pjrs','star'])
7、数据提取就大功告成了:
当然,也可以保存成Excel格式:df.to_excel(r"C:\Users\muma\Desktop\python_work\top250.xlsx")
最后,谈谈数据爬取过程中出现的一些坑:
1、豆瓣的访问频次限制,可以通过设置代理IP或设置访问频次来解决。因为数据量不多,所以我就直接用了time.sleep(0.1)来解决了,大概4分钟就能把数据爬下来;
2、有两部电影主页无法打开,一部电影没有主演、编剧等信息,影响后续转换成DataFrame格式,就直接当做异常数据去掉了,用try-except捕捉IndexError异常解决,最后成功获取247条记录。
预知如何分析去发掘榜单背后的秘密,且听下回分解。
初学python,水平有限,有不足之处,欢迎各位留言斧正。
领取专属 10元无门槛券
私享最新 技术干货