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多进程机制实例详解
Jul 02 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
对YOLOv3模型调用时候的python接口详解
Aug 26 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 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
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
node后端服务保活的实现
2019/11/10 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python中使用print输出中文的方法
2018/07/16 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
Django中的session用法详解
2020/03/09 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
css3实现动画的三种方式
2020/08/24 HTML / CSS
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
法制宣传月活动总结
2014/04/29 职场文书
厂区绿化方案
2014/05/08 职场文书
Tomcat配置访问日志和线程数
2022/05/06 Servers