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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
Django实现自定义404,500页面教程
Mar 26 Python
numpy中索引和切片详解
Dec 15 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
python操作kafka实践的示例代码
Jun 19 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
python 下载文件的多种方法汇总
Nov 17 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
利用aardio给python编写图形界面
2017/08/21 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python机器学习之决策树算法
2017/12/22 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
python实现简单银行管理系统
2019/10/25 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
使用python计算三角形的斜边例子
2020/04/15 Python
Python中格式化字符串的四种实现
2020/05/26 Python
python线性插值解析
2020/07/05 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
售房协议书
2014/08/19 职场文书
创先争优活动个人总结
2015/03/04 职场文书
2019各种承诺书范文
2019/06/24 职场文书
python 中的@运算符使用
2021/05/26 Python
Golang获取List列表元素的四种方式
2022/04/20 Golang