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中使用摄像头实现简单的延时摄影技术
Mar 27 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
Python线程创建和终止实例代码
Jan 20 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Python实现的ftp服务器功能详解【附源码下载】
Jun 26 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
python模拟实现斗地主发牌
Jan 07 Python
opencv+python实现均值滤波
Feb 19 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 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
WHOIS类的修改版
2006/10/09 PHP
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
Python建立Map写Excel表实例解析
2018/01/17 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Python  Django 母版和继承解析
2019/08/09 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python shutil模块用法实例分析
2019/10/02 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
工作过失检讨书
2014/02/23 职场文书
春节晚会主持词
2014/03/24 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
2014年党务公开方案
2014/05/08 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL