分析

分析网站寻找需要的网址

用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图:



在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图:



圈住的部分是我们需要的数据,然后复制它的网址为https://www.douyu.com/gapi/rknc/directory/yzRec/1,出于学习目的只爬取第一页(减少服务器压力)。然后把网址放到浏览器中测试是否可以访问。如图:

结果正常。

分析json数据,提取图片链接

最后分析发现json中的data里面的rl是每个房间的信息,大概有200条左右,拿出其中的一条查询里面的图片链接。

  1. {
  2. "rid": 1282190,
  3. "rn": "大家要开心啊~",
  4. "uid": 77538371,
  5. "nn": "鲸鱼欧尼",
  6. "cid1": 8,
  7. "cid2": 201,
  8. "cid3": 581,
  9. "iv": 1,
  10. "av": "avatar_v3/201908/d62c503c603945098f2c22d0d95c3b2e",
  11. "ol": 610574,
  12. "url": "/1282190",
  13. "c2url": "/directory/game/yz",
  14. "c2name": "颜值",
  15. "icdata": {
  16. "217": {
  17. "url": "https://sta-op.douyucdn.cn/dy-listicon/king-web.png-v3.png",
  18. "w": 0,
  19. "h": 0
  20. }
  21. },
  22. "dot": 2103,
  23. "subrt": 0,
  24. "topid": 0,
  25. "bid": 0,
  26. "gldid": 0,
  27. "rs1": "https://rpic.douyucdn.cn/live-cover/appCovers/2019/08/01/1282190_20190801002745_big.jpg/dy1",
  28. "rs16": "https://rpic.douyucdn.cn/live-cover/appCovers/2019/08/01/1282190_20190801002745_small.jpg/dy1",
  29. "utag": [
  30. {
  31. "name": "呆萌鲸鱼",
  32. "id": 111405
  33. },
  34. {
  35. "name": "美美美",
  36. "id": 41
  37. },
  38. {
  39. "name": "萌萌哒",
  40. "id": 520
  41. },
  42. {
  43. "name": "刀神老婆",
  44. "id": 132367
  45. }
  46. ],
  47. "rpos": 0,
  48. "rgrpt": 1,
  49. "rkic": "",
  50. "rt": 2103,
  51. "ot": 0,
  52. "clis": 1,
  53. "chanid": 0,
  54. "icv1": [
  55. [
  56. {
  57. "id": 217,
  58. "url": "https://sta-op.douyucdn.cn/dy-listicon/web-king-1-10-v3.png",
  59. "score": 994,
  60. "w": 0,
  61. "h": 0
  62. }
  63. ],
  64. [
  65. ],
  66. [
  67. ],
  68. [
  69. ]
  70. ],
  71. "ioa": 0,
  72. "od": ""
  73. }

测试发现rs16是房间的图片,如果把链接最后的/dy1去掉的话,图片就成大图了,心里美滋滋。

代码实现

  1. import gevent
  2. import json
  3. from urllib import request
  4. from gevent import monkey
  5. # 使用gevent打补丁,耗时操作自动替换成gevent提供的模块
  6. monkey.patch_all()
  7. # 图片存放的目录
  8. ROOT = "./images/"
  9. # 设置请求头,防止被反爬虫的第一步
  10. header = {
  11. "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 "
  12. }
  13. def download(img_src):
  14. # 把每个链接最后的/dy1去掉
  15. img_src: str = img_src.replace("/dy1", "")
  16. # 提取图片名
  17. file_name: str = img_src.split("/")[-1]
  18. response = request.urlopen(request.Request(img_src, headers=header))
  19. # 保存到本地
  20. with open(ROOT + file_name, "wb") as f:
  21. f.write(response.read())
  22. print(file_name, "下载完成!")
  23. if __name__ == '__main__':
  24. req = request.Request("https://www.douyu.com/gapi/rknc/directory/yzRec/1", headers=header)
  25. # 把json数据转换成python中的字典
  26. json_obj = json.loads(request.urlopen(req).read().decode("utf-8"))
  27. tasks = []
  28. for src in json_obj["data"]["rl"]:
  29. tasks.append(gevent.spawn(download, src["rs16"]))
  30. # 开始下载图片
  31. gevent.joinall(tasks)

结果

由于使用的是协程,比线程效率更高,不到1秒就把第一页的图片全部爬取下来了。效果如图:

此案例仅用于学习gevent的使用。

python协程gevent案例:爬取斗鱼美女图片的更多相关文章

  1. 单线程多任务协程vip电影爬取

    单线程多任务协程vip电影爬取 ​ --仅供学习使用勿作商用如有违规后果自负!!! 这几天一直在使用python爬取电影,主要目的也是为了巩固前段时间强化学习的网络爬虫,也算是一个不错的检验吧,面对众 ...

  2. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  3. python 多协程异步IO爬取网页加速3倍。

    from urllib import request import gevent,time from gevent import monkey#该模块让当前程序所有io操作单独标记,进行异步操作. m ...

  4. python 爬虫入门----案例爬取上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. ...

  5. Python协程 Gevent Eventlet Greenlet

    https://zh.wikipedia.org/zh-cn/%E5%8D%8F%E7%A8%8B 协程可以理解为线程中的微线程,通过手动挂起函数的执行状态,在合适的时机再次激活继续运行,而不需要上下 ...

  6. python 协程 gevent 简单测试

    串行测试 from gevent import monkey; monkey.patch_all()#有IO才做时需要这一句 import gevent import requests,time st ...

  7. python进程池爬取下载美女图片(xpath)--lowbiprogrammer

    # -*- coding: utf-8 -*-import requests,osfrom lxml import etreeimport multiprocessingfrom retrying i ...

  8. 用Python爬取斗鱼网站的一个小案例

    思路解析: 1.我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数 2.浏览网页源代码,查看我们需要的数据的定位标签 3.在代码中发送一个http请求,获取到网页返回的html(需要注意的是 ...

  9. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

随机推荐

  1. CodeForces 707D Persistent Bookcase ——(巧妙的dfs)

    一个n*m的矩阵,有四种操作: 1.(i,j)处变1: 2.(i,j)处变0: 3.第i行的所有位置1,0反转: 4.回到第k次操作以后的状态: 问每次操作以后整个矩阵里面有多少个1. 其实不好处理的 ...

  2. flask 第七篇 路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  3. link和Import区别

    本篇文章重点: link引用CSS时,在页面载入时同时加载: import需要页面完全载入后加载: link支持使用javascript控制DOM去改变样式,而Import不支持 下面待我娓娓道来: ...

  4. smarty中ifelse、foreach以及获取数组中键值名的一个实例

    <{if empty($history)}> <tr> <td colspan="6">Not any records!</td> ...

  5. Mybatis多值传递的方式

    一共有三种方式 1.参数传入Map 2参数使用@params 3.直接使用时用#{0},#{2} 参考网址 :https://www.2cto.com/database/201409/338155.h ...

  6. php的core问题

    我们在编写代码的时候,可能会发现,路径下多了一个类似这样的文件, 拿php举例  :  core.php_bin.4528.1379650721 这是因为我们在编写代码时候,出现了指针溢出,段错误等问 ...

  7. Fiddler抓包原理和使用详解

    iddler抓包工具在APP开发过程中使用非常频繁,对开发者理解HTTP网络传输原理以及分析定位网络方面的问题非常有帮助.今天抽点时间出来总结一下Fiddler在实际开发过程中的应用. 我开发过程中使 ...

  8. 算法 - 插入排序交换次数 - Binary Indexed Tree

    场景:快速得到一段数组元素的和 题目:Insertion Sort Advanced Analysis | HackerRank 算法:binary-indexed-tree :: HackerRan ...

  9. Servlet 表单数据 接收get post 参数实例

    Servlet 表单数据 很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. GE ...

  10. Linux LAMP源码安装

    查看编译参数 # httpd cat /app/httpd24/build/config.nice # mysql cat /app/mysql/docs/INFO_BIN # php php -i ...