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使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
详解python while 函数及while和for的区别
Sep 07 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
python实现while循环打印星星的四种形状
Nov 23 Python
Python urllib2运行过程原理解析
Jun 04 Python
python 从list中随机取值的方法
Nov 16 Python
python 发送get请求接口详解
Nov 17 Python
scrapy-splash简单使用详解
Feb 21 Python
Golang Web 框架Iris安装部署
Aug 14 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
前端构建工具之gulp的语法教程
2017/06/12 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
Python中__call__用法实例
2014/08/29 Python
python绘制规则网络图形实例
2019/12/09 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
函授本科自我鉴定
2014/02/04 职场文书
个人投资计划书
2014/05/01 职场文书
购房委托书
2014/10/15 职场文书
预备党员入党感想
2015/08/10 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Pytest中conftest.py的用法
2021/06/27 Python