python协程gevent案例:爬取斗鱼美女图片

分析

分析网站寻找需要的网址

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

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

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

结果正常。

分析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秒就把第一页的图片全部爬取下来了。效果如图:

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

原文地址:https://www.cnblogs.com/lxy0/p/11413976.html

时间: 2024-11-09 11:04:32

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

爬虫协程比线程爬取速度更快?

先做个小示例,不用废话谈理论,没有实践的空谈都是扯蛋误导人. # coding=utf-8 import requests,time count=0 urlx= 'http://www.xxsy.net/' # 'http://www.danmeila.com/' http://www.sina.com.cn/ 'http://www.qingkan9.com/' # # 'http://www.qingkan9.com/' def fun(url): try: print url resp=r

python爬取网站美女图片

今天周五,项目刚刚上线完,有些时间,闲着无聊,继续复习爬虫,这次打算爬取网站的美女图片.得先找到目标,然后目标网站还不会反爬虫,因为自己只是小白,好了开始. 寻找目标,发现了目标,哈哈 http://www.meizitu.com 里面图片按专题分类.先看下页面找出相关源码 页面 源码 即只要抓出来图片集的link跟图片集里面的link对应的jpg就可以了, 可以用beautifulsoup或者正则匹配,我这里用正则匹配需要的link.然后遍历整个网站就可以了 请看源码解释 #!bin/pyth

爬虫小案例 爬取(妹子图片)

import requests #请求库 from bs4 import BeautifulSoup #网页解析库 def get_girl(url): #伪造请求头信息 header = { #用户代理 'User-Agent':"Mozilla/5.0(Windows NT 6.1;WOW64) AppleWebKit/537.1(KHTML,like Gecko) Chrome/22.0.1207.1 Safari/537.1", #上个页面的url 'referer‘:'htt

python2.0_s12_day9_协程&Gevent协程

Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 协程 1.协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程.(操作系统跟不知道它存在),那你指定协程的实现原理是什么吗? 我们来聊聊协程的实现原理: 首先我们知道多个线程在一个单核CPU上进行并发,它的操作过程是,操作系统能调动的最小单位是线程,当操作系统触发多个线

Python核心技术与实战——十五|Python协程

我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多进程模型,这就是解决并发问题的经典模型之一.在最初的互联网世界中,多线程/多进程就在服务器并发中起到举足轻重的作用. 但是随着互联网的发展,慢慢很多场合都会遇到C10K瓶颈,也就是同时连接到服务器的客户达到1W,于是,很多代码就跑崩溃,因为进程的上下文切换占用了大量的资源,线程也顶不住如此巨大的压力

网络编程之协程——gevent模块

网络编程之协程--gevent模块 gevent模块 安装 pip3 install gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程. Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度. #用法 g1=gevent.spawn(func,1,,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如e

tcp_server_协程gevent版本

#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2020/1/23 1:50 # @Author : liuyan # @File : test5_tcp_server_5协程gevent版本.py # @Software: PyCharm import gevent from gevent import monkey; monkey.patch_all() #使用此方法,会将代码中检查一遍,如有time.sleep()等延时方法,会

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht

python协程:yield的使用

本文和大家分享的主要是python协程yield相关内容,一起来看看吧,希望对大家学习python有所帮助. 协程定义 协程的底层架构是在pep342 中定义,并在python2.5 实现的. python2.5 中,yield关键字可以在表达式中使用,而且生成器API中增加了 .send(value)方法.生成器可以使用.send(...)方法发送数据,发送的数据会成为生成器函数中yield表达式的值. 协程是指一个过程,这个过程与调用方协作,产出有调用方提供的值.因此,生成器可以作为协程使用