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+PyQT实现系统桌面时钟
Jun 16 Python
Python实现八皇后问题示例代码
Dec 09 Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 Python
浅析python的Lambda表达式
Feb 27 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
Python中random模块常用方法的使用教程
Oct 04 Python
python 实现性别识别
Nov 21 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
M1芯片安装python3.9.1的实现
Feb 02 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 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运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
PHP7修改的函数
2021/03/09 PHP
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
javascript事件模型介绍
2016/05/31 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
Python 模板引擎的注入问题分析
2017/01/01 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python3安装speech语音模块的方法
2018/12/24 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
策划主管的工作职责
2013/11/24 职场文书
考试不及格检讨书
2014/01/09 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
元旦晚会主持词
2014/03/24 职场文书
学校社团活动总结
2015/05/07 职场文书
让世界充满爱观后感
2015/06/10 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL