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 相关文章推荐
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
50行Python代码实现人脸检测功能
Jan 23 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
一文了解Python并发编程的工程实现方法
May 31 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
python 伯努利分布详解
Feb 25 Python
python实现门限回归方式
Feb 29 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
如何利用pycharm进行代码更新比较
Nov 04 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提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
跟老齐学Python之做一个小游戏
2014/09/28 Python
整理Python最基本的操作字典的方法
2015/04/24 Python
python操作redis的方法
2015/07/07 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
几个数据库方面的面试题
2016/07/01 面试题
校园新闻广播稿
2014/01/10 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
银行开业庆典方案
2014/02/06 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
工作岗位说明书模板
2014/05/09 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript