目标:抓取豆瓣电影的导演、评分、电影名、url,并保存于本地excel。
我们采用:requests(获取)——json——pandas(储存)
废话不多说,先上结果与代码:
# -*- coding: utf-8 -*-
import requests
import json
import pandasas pd
#1:把所有url放入urls这个列表里。2:用for循环实现翻页
urls= ['https://movie.douban.com/j/new_search_subjects?sort=S&range=0,' \
'10&tags=%E7%94%B5%E5%BD%B1&start={}'.format(i*20) for iin range(0,10)]
comments= [] #创建一容器来放爬去的内容
for url in urls:
r= requests.get(url).json() #获取json文件
jsons= r['data'] #获取data键中的数据
for it in jsons:
author= it['directors'] #获取导演
# if['directors']中值为空,则author = it['casts']
if author==None:
print('none')
else:
author= it['casts']
rate= it['rate']
title= it['title']
url= it['url']
comments.append({'authors':author,'rates':rate,'titles':title,'urls':url})
df= pd.DataFrame.from_dict(comments) #定义DataFrame对象并赋给df
df.to_excel('D://db_dy.xlsx') #把结果输出为excel,存在D盘
前言:
①:了解网页的两种加载方法
同步加载:改变网址上的某些参数会导致网页发生改变,例如:www.itjuzi.com/company?page=1(改变page=后面的数字,网页会发生改变)
异步加载:改变网址上的参数不会使网页发生改变,例如https://movie.douban.com/tag/#/(翻页后网址不会发生变化)
②:判断是何种加载方法
把JavaScript由“允许”改为“阻止”,重新刷新页面,若网页正常加载,说明该网页的加载方式是同步加载,若网页没有正常加载,说明该网页的加载方式是异步加载,如图:
③:网上很多例子大都是抓取top250,因为那网址属于同步加载,很容易抓取(参考第二篇)。
我们这篇top200,属于异步加载,如图:
现重点讲解代码中间部分
一:真实的urls
异步加载中,真实的url并非https://movie.douban.com/tag/#/?sort=S&range=0,10&tags=%E7%94%B5%E5%BD%B1,真正的url需要我们通过抓包获取,流程如图:
所以我们得出真实url:https://movie.douban.com/j/new_search_subjects?sort=S&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=0
通过加载更多,我们发现url中start随之同步变化,变化的间隔为20,即start=0(第一页),start=20(第二页),以此类推,所以我们得出.format(i*20),大家可以对比第二篇的翻页。
二:comments
我们抓取了img、name、text需要有序的排列,即采用append函数,依次把他们放入comments。
三:json
之前我们用得.text是需要网页返回文本的信息,而这里返回的是json文件,所以用.json
有些电影的导演与影员是同一个人,所以我们用if...else来判断
取出字典中的值,需要在方括号中指明值对应的键
总结:
1:翻页,就是寻找url中的规律,大家可以对比第二篇的翻页。
2:豆瓣评分最高的居然是 《地球脉动2:奇迹世界》,大家一定要去看看哦
2:建议大家放慢抓取速度哦,运用import time time.sleep(1)。
下一篇文章,将继续扩大难度,抓取知乎内容,需要运用到请求头(headers):豆瓣就像大门没有上锁,而知乎上了锁,headers就像一把钥匙,这样解释是不是很形象呢。
有不清楚的地方,大家可以留言,点赞,我看到了,会第一时间回复你。