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求crc32值的方法
Oct 05 Python
Python的subprocess模块总结
Nov 07 Python
python处理html转义字符的方法详解
Jul 01 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
Python 创建空的list,以及append用法讲解
May 04 Python
python使用turtle库绘制树
Jun 25 Python
Sanic框架应用部署方法详解
Jul 18 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
django列表筛选功能的实现代码
Mar 27 Python
jupyter lab文件导出/下载方式
Apr 22 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 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
无线电广播的开始
2002/01/30 无线电
php stripslashes和addslashes的区别
2014/02/03 PHP
php实现word转html的方法
2016/01/22 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
javascript 的Document属性和方法集合
2010/01/25 Javascript
js+css在交互上的应用
2010/07/18 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
python 命名规范知识点汇总
2020/02/14 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
幼儿发展评估方案
2014/06/11 职场文书
公民授权委托书
2014/10/15 职场文书
电工实训报告总结
2014/11/05 职场文书
诚信承诺书
2015/01/19 职场文书
售后服务质量承诺书
2015/04/29 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
Python基础之pandas数据合并
2021/04/27 Python
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS