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实现字典的key和values的交换
Aug 04 Python
你真的了解Python的random模块吗?
Dec 12 Python
python计算日期之间的放假日期
Jun 05 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
python如何实现一个刷网页小程序
Nov 27 Python
Python将string转换到float的实例方法
Jul 29 Python
对django 模型 unique together的示例讲解
Aug 06 Python
Django 限制访问频率的思路详解
Dec 24 Python
解析PyCharm Python运行权限问题
Jan 08 Python
Python流程控制常用工具详解
Feb 24 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP开发中常用的字符串操作函数
2011/02/08 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
js中获取事件对象的方法小结
2011/03/13 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
js实现秒表计时器
2019/12/16 Javascript
js实现简单进度条效果
2020/03/25 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
10张动图学会python循环与递归问题
2021/02/06 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
平面设计的岗位职责
2013/11/08 职场文书
鲜果饮品店创业计划书
2014/01/21 职场文书
《白鹅》教学反思
2014/04/13 职场文书
关于学习的演讲稿
2014/05/10 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
加班费申请报告
2015/05/15 职场文书
Python获取字典中某个key的value
2022/04/13 Python