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将动态GIF图片倒放播放的方法
Nov 02 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 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编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
python 读写、创建 文件的方法(必看)
2016/09/12 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
公司营业员的工作总结自我评价
2013/10/05 职场文书
智能电子应届生求职信
2013/11/10 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
保护环境倡议书范文
2014/05/13 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
话题作文之生命的旋律
2019/12/17 职场文书