python协程gevent案例 爬取斗鱼图片过程解析


Posted in Python onAugust 27, 2019

分析

分析网站寻找需要的网址

用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图:

python协程gevent案例 爬取斗鱼图片过程解析

在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图:

python协程gevent案例 爬取斗鱼图片过程解析

圈住的部分是我们需要的数据,然后复制它的网址为https://www.douyu.com/gapi/rknc/directory/yzRec/1,出于学习目的只爬取第一页(减少服务器压力)。然后把网址放到浏览器中测试是否可以访问。如图:

python协程gevent案例 爬取斗鱼图片过程解析

结果正常。

分析json数据,提取图片链接

最后分析发现json中的data里面的rl是每个房间的信息,大概有200条左右,拿出其中的一条查询里面的图片链接。

{
        "rid": 1282190,
        "rn": "大家要开心啊~",
        "uid": 77538371,
        "nn": "鲸鱼欧尼",
        "cid1": 8,
        "cid2": 201,
        "cid3": 581,
        "iv": 1,
        "av": "avatar_v3/201908/d62c503c603945098f2c22d0d95c3b2e",
        "ol": 610574,
        "url": "/1282190",
        "c2url": "/directory/game/yz",
        "c2name": "颜值",
        "icdata": {
          "217": {
            "url": "https://sta-op.douyucdn.cn/dy-listicon/king-web.png-v3.png",
            "w": 0,
            "h": 0
          }
        },
        "dot": 2103,
        "subrt": 0,
        "topid": 0,
        "bid": 0,
        "gldid": 0,
        "rs1": "https://rpic.douyucdn.cn/live-cover/appCovers/2019/08/01/1282190_20190801002745_big.jpg/dy1",
        "rs16": "https://rpic.douyucdn.cn/live-cover/appCovers/2019/08/01/1282190_20190801002745_small.jpg/dy1",
        "utag": [
          {
            "name": "呆萌鲸鱼",
            "id": 111405
          },
          {
            "name": "美美美",
            "id": 41
          },
          {
            "name": "萌萌哒",
            "id": 520
          },
          {
            "name": "刀神老婆",
            "id": 132367
          }
        ],
        "rpos": 0,
        "rgrpt": 1,
        "rkic": "",
        "rt": 2103,
        "ot": 0,
        "clis": 1,
        "chanid": 0,
        "icv1": [
          [
            {
              "id": 217,
              "url": "https://sta-op.douyucdn.cn/dy-listicon/web-king-1-10-v3.png",
              "score": 994,
              "w": 0,
              "h": 0
            }
          ],
          [
            
          ],
          [
            
          ],
          [
            
          ]
        ],
        "ioa": 0,
        "od": ""
      }

测试发现rs16是房间的图片,如果把链接最后的/dy1去掉的话,图片就成大图了,心里美滋滋。

代码实现

import gevent
import json
from urllib import request
from gevent import monkey
# 使用gevent打补丁,耗时操作自动替换成gevent提供的模块
monkey.patch_all()
# 图片存放的目录
ROOT = "./images/"
# 设置请求头,防止被反爬虫的第一步
header = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 "
}


def download(img_src):
  # 把每个链接最后的/dy1去掉
  img_src: str = img_src.replace("/dy1", "")
  # 提取图片名
  file_name: str = img_src.split("/")[-1]
  response = request.urlopen(request.Request(img_src, headers=header))
  # 保存到本地
  with open(ROOT + file_name, "wb") as f:
    f.write(response.read())
  print(file_name, "下载完成!")
if __name__ == '__main__':

  req = request.Request("https://www.douyu.com/gapi/rknc/directory/yzRec/1", headers=header)
  # 把json数据转换成python中的字典
  json_obj = json.loads(request.urlopen(req).read().decode("utf-8"))
  tasks = []
  for src in json_obj["data"]["rl"]:
    tasks.append(gevent.spawn(download, src["rs16"]))
  # 开始下载图片
  gevent.joinall(tasks)

结果

由于使用的是协程,比线程效率更高,不到1秒就把第一页的图片全部爬取下来了。效果如图:

python协程gevent案例 爬取斗鱼图片过程解析

此案例仅用于学习gevent的使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之udp端口扫描
Feb 10 Python
Python统计列表中的重复项出现的次数的方法
Aug 18 Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Python微信库:itchat的用法详解
Aug 14 Python
Python 查看文件的编码格式方法
Dec 21 Python
对numpy中array和asarray的区别详解
Apr 17 Python
pandas去除重复列的实现方法
Jan 29 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
Python中Unittest框架的具体使用
Aug 27 #Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 #Python
Python3分析处理声音数据的例子
Aug 27 #Python
python中struct模块之字节型数据的处理方法
Aug 27 #Python
Python的bit_length函数来二进制的位数方法
Aug 27 #Python
使用python将excel数据导入数据库过程详解
Aug 27 #Python
python读取指定字节长度的文本方法
Aug 27 #Python
You might like
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
php使用PDO方法详解
2014/12/27 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
Python面向对象类继承和组合实例分析
2018/05/28 Python
Python 内存管理机制全面分析
2021/01/16 Python
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
师范应届生求职信
2013/11/15 职场文书
电子商务应届生求职信
2013/11/16 职场文书
《母鸡》教学反思
2014/02/25 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
法人委托书范本格式
2014/09/15 职场文书
软件测试专业推荐信
2014/09/18 职场文书
采购员工作总结范文
2015/08/12 职场文书
《给予树》教学反思
2016/03/03 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android