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 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
python实现的解析crontab配置文件代码
Jun 30 Python
Windows下python2.7.8安装图文教程
May 26 Python
使用Python对SQLite数据库操作
Apr 06 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
Python中的枚举类型示例介绍
Jan 09 Python
python 字典访问的三种方法小结
Dec 05 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
利用Python将多张图片合成视频的实现
Nov 23 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实现事件监听与触发的方法
2014/11/21 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
python文件操作之目录遍历实例分析
2015/05/20 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python计算二维矩形IOU实例
2020/01/18 Python
网站编辑求职信
2013/10/17 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
搞笑获奖感言
2014/01/30 职场文书
自荐信如何制作?
2014/02/21 职场文书
标准化管理实施方案
2014/02/25 职场文书
中职生求职信
2014/07/01 职场文书
好的旅游活动方案
2014/08/19 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
python元组打包和解包过程详解
2021/08/02 Python