目标网址url:
https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=
使用谷歌浏览器的检查功能对网站进行分析,发现需要爬取的内容在class‘movie-list-item playable unwatched’下。
ok,我们按照之前的方式来爬取一下看看。
url='https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action='
res=requests.get(url)
res.encoding= 'utf-8'#该网页是以utf-8的编码形式显示的
soup=BeautifulSoup(res.text, 'html.parser')#使用美丽汤解析网页内容
print(soup)
检查打印结果,发现get的信息中没有任何关于电影信息的。这是为什么呢?因为这个网页的所有电影信息都是动态加载的。
转动鼠标滚轮,使页面朝下拉,你会发现,有更多的内容被加载进来了,查看监视器,class‘movie-list-item playable unwatched’的列数增加了。看来,静态网站的那一套在动态加载的网站上行不通了,那么该如何解决呢?
点击监视器的Network--->XHR。继续朝下滑动滚轮,你会发现Name下的文件增加了!
点击文件末尾为start=0&limit=20与start=20&limit=20的文件,比较检查,我们发现这正是我们要寻找的信息。
通过比较,我们现在可以大胆猜想start指的是显示起始的电影序号,limit是每次请求显示的电影数目,信息是通过json的格式存储的。我们再点击Headers,发现如下内容:
发现,获得的内容是通过GET url:‘https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20’来获取的。
ok,现在我们知道怎么获取数据了,经测试,实际上我们可以直接start=0 limit=256,来直接获取全部top10的数据。但我们还是按照网站请求的方式每次20部,来获取。代码如下:
import requests
import json
#爬取豆瓣电影分类排行榜 - 动作片top10%的电影名、评分和豆瓣链接
url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start={}&limit=20'
filminfolist=[]#存放结果
for i in range(0,300,20):
aimurl=url.format(i)
res=requests.get(aimurl)
jd=json.loads(res.text)#改成json格式方便读取数据
for j in jd:
filminfo={}#以字典存储单条数据
filminfo['title']=j['title']
filminfo['score'] = j['score']
filminfo['url'] = j['url']
filminfolist.append(filminfo)
打印filminfolist结果如下:
{'title': '这个杀手不太冷', 'score': '9.4', 'url': 'https://movie.douban.com/subject/1295644/'}
{'title': '七武士', 'score': '9.2', 'url': 'https://movie.douban.com/subject/1295399/'}
{'title': '蝙蝠侠:黑暗骑士', 'score': '9.1', 'url': 'https://movie.douban.com/subject/1851857/'}
{'title': '指环王3:王者无敌', 'score': '9.1', 'url': 'https://movie.douban.com/subject/1291552/'}
{'title': '搏击俱乐部', 'score': '9.0', 'url': 'https://movie.douban.com/subject/1292000/'}
{'title': '指环王2:双塔奇兵', 'score': '9.0', 'url': 'https://movie.douban.com/subject/1291572/'}
{'title': '将军号', 'score': '9.0', 'url': 'https://movie.douban.com/subject/1292778/'}
{'title': '指环王1:魔戒再现', 'score': '8.9', 'url': 'https://movie.douban.com/subject/1291571/'}
......
拓展一下:
DataFrame初识
使用Data Frame格式把刚才的数据保存进excel,通过使用套件pandas来实现。
代码如下:
import pandas
df=pandas.DataFrame(filminfolist)
df.to_excel('D:\\douban.xlsx')
总结:动态加载的网页,需要多观察监视器,分析得出真实的抓取页面。美丽汤是分析html格式的,json是分析json格式的,当然也可以使用正则表达式来分析。