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自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
进一步了解Python中的XML 工具
Apr 13 Python
详解在Python中处理异常的教程
May 24 Python
利用Python脚本实现ping百度和google的方法
Jan 24 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
如何通过python实现全排列
Feb 11 Python
python如何将图片转换素描画
Sep 08 Python
python hmac模块验证客户端的合法性
Nov 07 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
php实现文章评论系统
2019/02/18 PHP
php精度计算的问题解析
2019/06/21 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
javascript检测两个数组是否相似
2015/05/19 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
vue.js表格分页示例
2016/10/18 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python二分法搜索算法实例分析
2015/05/11 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python unittest单元测试框架总结
2018/09/08 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
python config文件的读写操作示例
2019/09/27 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
生物学学生自我评价
2014/01/17 职场文书
手机被没收的检讨书
2014/10/04 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
Python进行区间取值案例讲解
2021/08/02 Python
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript