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 的列表遍历删除实现代码
Apr 12 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
详解python之配置日志的几种方式
May 22 Python
Python绘制七段数码管实例代码
Dec 20 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
Python实现Event回调机制的方法
Feb 13 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
python和js交互调用的方法
Jun 23 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 如何获取数组第一个值
2013/08/06 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
PHP引用返回用法示例
2016/05/28 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
繁简字转换功能
2006/07/19 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
javascript基本语法
2016/05/31 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
HEMA法国:荷兰原创设计
2019/02/21 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
师范应届生教师求职信
2013/11/05 职场文书
《雾凇》教学反思
2014/02/17 职场文书
《阳光》教学反思
2014/02/23 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
结婚主持人致辞
2015/07/28 职场文书
高考升学宴主持词
2019/06/21 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书