利用Python爬取豆瓣电影

目标:使用Python爬取豆瓣电影并保存MongoDB数据库中

我们先来看一下通过浏览器的方式来筛选某些特定的电影:

利用Python爬取豆瓣电影

我们把URL来复制出来分析分析:

https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE

有3个字段是非常重要的:

  1.sort=T

  2.range=0,10

  3.tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE

具体分析方法如下:

  1.sort:表示排序方式,可以看到它有3中排序方式

利用Python爬取豆瓣电影

利用Python爬取豆瓣电影

利用Python爬取豆瓣电影

根据上图可以直到每个字母表示的含义:

 T:热度排序,

    R:时间排序,

    S:评价排序:

 

  2.range=0,10;表示一个范围,具体是什么范围呢?

利用Python爬取豆瓣电影

  range参数我们也搞定了,它就是表示评分区间!

    默认评分区间是:0-10

 

  3.tags:同样的原理,这是一个标签

    我们选中的标签有:电影,爱情,美国,黑帮4个标签,但是在tags里面我们看到的不是这写汉字,而是被编码过的形式!

    %E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE)

    那如何知道这些字符是表示什么呢?

  我们可以到网上进行解码看看正不正确?

利用Python爬取豆瓣电影

利用Python爬取豆瓣电影

 

 

  4.那么还有没有可以选择的参数呢?

  我们还有2个参数可以选择!

    playbale=1:表示可播放

    unwatched=1:表示还没看过的

利用Python爬取豆瓣电影

至此,我们就已经把URL中的查询参数全都弄明白了!

 

但是,又有一个问题了,当我们在浏览器中点击"加载更多"按钮时,这个地址栏中的URL并没有发生变化,但是电影信息可以加载出来了!这是为什么?

  如果知道AJAX加载技术的读者可能知道这个原理,实际上就是异步加载,服务器不需要刷新整个网页,只需要刷新局部网页就可以把数据展示到网页中,这样不仅可以加快速度,也可以减少服务器的压力.

 

重点来了:

  抓包结果:

利用Python爬取豆瓣电影

 

看看浏览器地址栏的URL与Request URL有什么不一样的地方?

  我们在浏览器地址栏中看到的URL是:

https://movie.douban.com/tag/#/?

      sort=S&range=5,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD&playable=1&unwatched=1

  实际浏览器发送的Request URL是:

https://movie.douban.com/j/new_search_subjects?

sort=S&range=5,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD&playable=1&unwatched=1&start=0

  除了被红色标记的地方不同之外,其他地方都是一样的!那我们发送请求的时候应该是用哪一个URL呢?

  在上面我就已提到了,在豆瓣电影中,是采用异步加载的方式来加载数据的,也就是说在加载数据的过程中,地址栏中的URL是一直保持不变的,那我们还能用这个URL来发送请求吗?当然不能了!

既然不能用地址栏中的URL来发送请求,那我们就来分析一下浏览器实际发送的Request URL:

  我们把这个URL复制到浏览器中看看会发生什么情况!

利用Python爬取豆瓣电影

我们可以看到这个URL的响应结果恰恰就是我们想要的数据,采用json格式.在Python中,我们可以利用一些工具把它转换成字典格式,来提取我们想要的数据.

 

距离我们成功还有一小步:

  在这个URL中,我们看到还有一个参数:start,这个是干嘛的呢?

  这个数值表示偏移量,来控制每一次加载的偏移位置是在哪里!比如我们把它设置成20,表示一次请求的电影数量.那么得到的结果如下:

利用Python爬取豆瓣电影

到这里,该案例的思路,难点就已经全都捋清楚了,剩下的就是代码的事情了!

 

项目结构:

利用Python爬取豆瓣电影

完整的代码如下:

利用Python爬取豆瓣电影