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登陆asp网站页面的实现代码
Jan 14 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
Python字符串处理实例详解
May 18 Python
python在非root权限下的安装方法
Jan 23 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
Python笔记之代理模式
Nov 20 Python
python科学计算之scipy——optimize用法
Nov 25 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
如何用python爬取微博热搜数据并保存
Feb 20 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
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
开源Web应用框架Django图文教程
2017/03/09 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
python实现图像全景拼接
2020/03/27 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
什么是会话Bean
2015/05/14 面试题
Python如何定义一个函数
2015/09/01 面试题
2014法制宣传日活动总结范文
2014/11/01 职场文书
管辖权异议上诉状
2015/05/23 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS