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文件右键找不到IDLE打开项解决办法
Jun 08 Python
python读取和保存视频文件
Apr 16 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
pandas中的series数据类型详解
Jul 06 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
python支持多线程的爬虫实例
Dec 21 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
详解Python中的for循环
Apr 30 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
删除无限级目录与文件代码共享
2006/07/12 PHP
树型结构列出指定目录里所有文件的PHP类
2006/10/09 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
js时间控件只显示年月
2017/01/08 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
Python映射拆分操作符用法实例
2015/05/19 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python日志logging模块使用方法分析
2019/05/23 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
英文演讲稿
2014/05/15 职场文书
员工考勤管理制度
2015/08/06 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python
Nginx配置https的实现
2021/11/27 Servers