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引用DLL文件的方法
May 11 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
python设计模式大全
Jun 27 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
Python内置模块turtle绘图详解
Dec 09 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
Django 源码WSGI剖析过程详解
Aug 05 Python
python实现微信小程序用户登录、模板推送
Aug 28 Python
python实现电子词典
Mar 03 Python
Python学习之时间包使用教程详解
Mar 21 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&amp;MYSQL留言板源码
2020/07/19 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
JS实现li标签的删除
2019/04/12 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
使用Python写一个小游戏
2018/04/02 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
详解python中sort排序使用
2019/03/23 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
详解Python绘图Turtle库
2019/10/12 Python
python爬虫如何解决图片验证码
2021/02/14 Python
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
公司人力资源的自我评价
2014/01/02 职场文书
主题教育活动总结
2014/05/05 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
总经理岗位职责范本
2015/04/01 职场文书
教师学习心得体会范文
2016/01/21 职场文书
同学联谊会邀请函
2019/06/24 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
Python中itertools库的四个函数介绍
2022/04/06 Python
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript