python requests库爬取豆瓣电视剧数据并保存到本地详解


Posted in Python onAugust 10, 2019

首先要做的就是去豆瓣网找对应的接口,这里就不赘述了,谷歌浏览器抓包即可,然后要做的就是分析返回的json数据的结构:

https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start=0

这是接口地址,可以大概的分析一下各个参数的规则:

  • type=tv,表示的是电视剧的分类
  • tag=国产剧,表示是国产剧的分类
  • sort参数,这里猜测是一个排序方式
  • page_limit=20,这个一定就是每页所存取的数据数量了
  • page_start=0,表示的是这页从哪条数据开始,比如第二页就为page_start=20,第三页为page_start=40,以此类推
  • 最终我们要用到的主要是page_start和page_limit两个参数

下面这里是返回的json数据格式,可以看出我们要的是json中subjects列表中的每条数据,在之后的程序中会把每一个电视剧的信息保存到文件里的一行

python requests库爬取豆瓣电视剧数据并保存到本地详解

有了这些,就直接上程序了,因为感觉程序还是比较好懂,主要还是遵从面向对象的程序设计:

import json
import requests


class DoubanSpider(object):
  """爬取豆瓣热门国产电视剧的数据并保存到本地"""

  def __init__(self):
    # url_temp中的start的值是动态的,所以这里用{}替换,方便后面使用format方法
    self.url_temp = 'https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start={}'
    self.headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    }

  def pass_url(self, url): # 发送请求,获取响应
    print(url)
    response = requests.get(url, headers=self.headers)
    return response.content.decode()

  def get_content_list(self, json_str): # 提取数据
    dict_ret = json.loads(json_str)
    content_list = dict_ret['subjects']
    return content_list

  def save_content_list(self, content_list): # 保存
    with open('douban.txt', 'a', encoding='utf-8') as f:
      for content in content_list:
        f.write(json.dumps(content, ensure_ascii=False)) # 一部电视剧的信息一行
        f.write('\n') # 写入换行符进行换行
    print('保存成功!')


  def run(self): # 实现主要逻辑
    num = 0
    while True:
      # 1. start_url
      url = self.url_temp.format(num)
      # 2. 发送请求,获取响应
      json_str = self.pass_url(url)
      # 3. 提取数据
      content_list = self.get_content_list(json_str)
      # 4. 保存
      self.save_content_list(content_list)
      if len(content_list) < 20:
        break
      # 5. 构造下一页url地址,进入循环
      num += 20 # 每一页有二十条数据


if __name__ == '__main__':
  douban_spider = DoubanSpider()
  douban_spider.run()

上面是利用循环遍历每一页,后来我又想到用递归也可以,虽然递归效率可能不高,这里还是展示一下,只需要改几个地方而已:

import json
import requests


class DoubanSpider(object):
  """爬取豆瓣热门国产电视剧的数据并保存到本地"""
  def __init__(self):
    # url_temp中的start的值是动态的,所以这里用{}替换,方便后面使用format方法
    self.url_temp = 'https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start={}'
    self.headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    }
    self.num = 0

  def pass_url(self, url): # 发送请求,获取响应
    print(url)
    response = requests.get(url, headers=self.headers)
    return response.content.decode()

  def get_content_list(self, json_str): # 提取数据
    dict_ret = json.loads(json_str)
    content_list = dict_ret['subjects']
    return content_list

  def save_content_list(self, content_list): # 保存
    with open('douban2.txt', 'a', encoding='utf-8') as f:
      for content in content_list:
        f.write(json.dumps(content, ensure_ascii=False)) # 一部电视剧的信息一行
        f.write('\n') # 写入换行符进行换行
    print('保存成功!')


  def run(self): # 实现主要逻辑
    # 1. start_url
    url = self.url_temp.format(self.num)
    # 2. 发送请求,获取响应
    json_str = self.pass_url(url)
    # 3. 提取数据
    content_list = self.get_content_list(json_str)
    # 4. 保存
    self.save_content_list(content_list)
    # 5. 构造下一页url地址,进入循环
    if len(content_list) == 20:
      self.num += 20 # 每一页有二十条数据
      self.run()


if __name__ == '__main__':
  douban_spider = DoubanSpider()
  douban_spider.run()

最终文件得到的结果:

python requests库爬取豆瓣电视剧数据并保存到本地详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python安装教程
Feb 28 Python
django启动uwsgi报错的解决方法
Apr 08 Python
python学生信息管理系统(完整版)
Apr 05 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
python批量解压zip文件的方法
Aug 20 Python
Python爬虫 urllib2的使用方法详解
Sep 23 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
浅析python标准库中的glob
Mar 13 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
python实现邮件发送功能
Aug 10 #Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 #Python
python selenium登录豆瓣网过程解析
Aug 10 #Python
python matplotlib库绘制散点图例题解析
Aug 10 #Python
python matplotlib库绘制条形图练习题
Aug 10 #Python
Python OpenCV实现鼠标画框效果
Aug 19 #Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 #Python
You might like
Snoopy类使用小例子
2008/04/15 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
php动态函数调用方法
2015/05/21 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
在Python中使用Mako模版库的简单教程
2015/04/08 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
django主动抛出403异常的方法详解
2019/01/04 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
什么是View State?
2013/01/27 面试题
酒店秘书求职信范文
2014/02/17 职场文书
成绩单家长评语大全
2014/04/16 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
Docker下安装Oracle19c
2022/04/13 Servers
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers