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基础教程之面向对象的一些概念
Aug 29 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
python读写csv文件的方法
Aug 13 Python
python爬虫增加访问量的方法
Aug 22 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
keras的三种模型实现与区别说明
Jul 03 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
区分python中的进程与线程
Aug 13 Python
python 解决函数返回return的问题
Dec 05 Python
python基础之模块的导入
Oct 24 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中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
smarty表格换行实例
2014/12/15 PHP
详谈PHP编码转换问题
2015/07/28 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
js实现微信聊天界面
2020/08/09 Javascript
介绍Python中的__future__模块
2015/04/27 Python
Python实现多线程抓取妹子图
2015/08/08 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
python自动12306抢票软件实现代码
2018/02/24 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
Android笔试题总结
2014/11/29 面试题
商务英语专业毕业生自荐信
2013/11/05 职场文书
2014年情人节活动方案
2014/02/16 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
党员目标管理责任书
2014/07/25 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
主婚人致辞精选
2015/07/28 职场文书
初中团支书竞选稿
2015/11/21 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript