• Python协程理解——基于爬虫举例


    当前代码在工作当中没有太大的含义,但是对于大家理解协程的基础概念是相当有好处的
    协程最直接的可以理解为程序当中一个没有返回的功能块儿
    我们之前有学过多线程,所谓的多线程不论是异步并发,还是并发强调的时候将功能放到不同的线程上分别运行的过程
    但是协程不是这样的,协程强调的是在同一个线程上进行运行,这样免去了线程生产、消费、抛弃的损耗
    站在生产消费者模式来看
    多线程主张的是
    生产者生产
    生产的内容放入缓存
    然后取出使用

    协程的主张是
    生产者生产
    然后生产函数终止
    然后消费函数启动
    消费完成接着生产

    闲话不多说,上代码。

     1 #coding:utf-8
     2 import requests
     3 from time import sleep
     4 from lxml import etree
     5 
     6 def setUp(fun):
     7     """
     8     启动生成器
     9     :param fun: 生成器函数
    10     """
    11     def inner(**kwargs):
    12         k = fun(**kwargs)  #调用生成器
    13         next(k) #执行一次,效果类似初始化
    14         return k
    15     return inner
    16 
    17 @setUp
    18 def getSrc():
    19     """
    20         根据内容获取链接
    21     """
    22     a = 1
    23     while True:
    24         content = yield a
    25         html = etree.HTML(content)
    26         imglist = html.xpath('//div[@id="content-left"]//img')
    27         for img in imglist:
    28             src = "http"+img.attrib.get("src")
    29             print(src)
    30 @setUp
    31 def getData():
    32     """
    33     根据地址获取内容
    34     :return:
    35     """
    36     while True:
    37         url = "https://www.qiushibaike.com/pic/page/%s/?s=5144861"
    38         page = yield url
    39         if page == 1:
    40             Referer = "https://www.qiushibaike.com"
    41             url = "https://www.qiushibaike.com/pic/"
    42         else:
    43             Referer = url%page
    44             url = url % page
    45         print(url)
    46         headers = {
    47             "Referer": Referer,
    48             "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
    49         }
    50         request_data = requests.get(url = url,headers = headers)
    51         content = request_data.content
    52         img = getSrc()
    53         img.send(content)
    54         sleep(1)
    55 
    56 def getPage():
    57     """
    58     启动,获取所有的页码
    59     """
    60     d = getData()
    61     page = 0
    62     while page < 35:
    63         page += 1
    64         d.send(page)
    65 
    66 if __name__ == "__main__":
    67     getPage()
  • 相关阅读:
    Thinkphp3.2 PHPMailer 发送邮件
    13 代理模式
    12 状态模式
    11 组合模式
    10 迭代器模式
    9 模板方法模式
    8 外观模式
    MySQL Network--Localhost与127.0.0.1的差异
    MySQL Memory--内存分配相关参数
    mysqldump命令之single-transaction
  • 原文地址:https://www.cnblogs.com/bianjinhui/p/10037341.html
Copyright © 2020-2023  润新知