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中Switch/Case实现的示例代码
Nov 09 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
Python一行代码实现快速排序的方法
Apr 30 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
python 爬取京东指定商品评论并进行情感分析
May 27 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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
配置支持SSI
2006/11/25 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP中的替代语法简介
2014/08/22 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
.NET remoting的两种通道是什么
2016/05/31 面试题
大学四年个人总结
2015/03/03 职场文书
个人原因辞职信模板
2015/05/13 职场文书
机关工会工作总结2015
2015/05/26 职场文书
好员工观后感
2015/06/17 职场文书
JavaScript数组 几个常用方法总结
2021/11/11 Javascript