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发布模块的步骤分享
Feb 21 Python
python生成指定尺寸缩略图的示例
May 07 Python
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
在CMD命令行中运行python脚本的方法
May 12 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
详解python读取image
Apr 03 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python Json数据文件操作原理解析
May 09 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 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学习之运算符相关概念
2011/06/09 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
php适配器模式简单应用示例
2019/10/23 PHP
设定php简写功能的方法
2019/11/28 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
Javascript----文件操作
2007/01/18 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
python图形用户接口实例详解
2019/12/16 Python
python 回溯法模板详解
2020/02/26 Python
Python序列化pickle模块使用详解
2020/03/05 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
营业经理岗位职责
2013/11/10 职场文书
大家检讨书5000字
2014/02/03 职场文书
村党支部书记承诺书
2014/05/29 职场文书
vue实现登陆页面开发实践
2022/05/30 Vue.js