值得拿出来 看看的

多进程 爬取 (生产) , 解析 (消费) 网页 同时进行,可以作为以后项目扩展使用

from bs4 import BeautifulSoup
import requests
import time
import multiprocessing as mp
import re
from multiprocessing import Queue
# from multiprocessing import JoinableQueue as Queue base_url = 'https://morvanzhou.github.io/' def crawl(url):
html = requests.get(url).text
# 模拟请求时间消耗 0.1 s
time.sleep(0.1)
return html def parse(html):
soup = BeautifulSoup(html,'lxml')
all_anchors = soup.find_all('a',{'href':re.compile(r'^/.+?/$')})
# title = soup.find('meta',{'property':'og:title'})
page_urls = {anchor.get_text().strip():base_url+anchor['href'] for anchor in all_anchors}
main_url = soup.find('meta',{'property':'og:url'})['content']
return main_url,page_urls # print(html) def main():
# unseen 本可以定义多个
unseen = (base_url,)
seen = () # 为了让 html 爬取 与 html 解析 同步进行,所以这里使用 生产者--消费者 模式
html_queue = Queue()
# 开启进程池
# 生产者 即 html 爬取
crawl_pool = mp.Pool(2)
# 消费者 即 html 解析
parse_pool = mp.Pool(2) for url in unseen:
# 若一直 有 要被爬取的 html 则 一直进行
html_queue.put(crawl_pool.apply_async(crawl,args=(url,)).get())
else:
# 已经爬取完成所有 页面
html_queue.put(None) # 此处向队列发送 生产完成信号,不然方法一直被阻塞 results = [] # 开启循环 消费生产出的 html,对其进行解析
while True:
html=html_queue.get()
if html:
results.append(parse_pool.apply_async(parse,args=(html,)).get())
else:
# html_queue.task_done()
break print(results) if __name__ == '__main__':
main()

python 生产者 --- 消费者的更多相关文章

  1. python生产者消费者模型

    业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...

  2. python生产者消费者模型优点

    生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓存区作为桥梁连接,生产者指望里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响 ...

  3. 操作系统OS,Python - 生产者消费者模型

    1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题.(生产者和消费者不直接通信) 2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度. 3. 在并发编程中该模式能解决大多数 ...

  4. python 生产者消费者模型

    import time def consumer(name): print("%s开始吃包子了"%name) while True: ret = yield time.sleep( ...

  5. Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

    Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...

  6. 【Python@Thread】queue模块-生产者消费者问题

    python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 from random import randint from ...

  7. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  8. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  9. Python 使用python-kafka类库开发kafka生产者&消费者&客户端

    使用python-kafka类库开发kafka生产者&消费者&客户端   By: 授客 QQ:1033553122       1.测试环境 python 3.4 zookeeper- ...

随机推荐

  1. Jmeter Beanshell 用法

    Beanshell 的用法 什么是beanshell Beanshell是一种完全符合java语法的脚本语言,并且拥有自己的内置对象和语法 Beanshell是用java写的,一个小型嵌入式java源 ...

  2. git-lfs插件

    Git本地会保存文件所有版本,对于大文件很容易导致仓库体积迅速膨胀 为了解决这个问题,Github在2015.4宣布推出Git LFS(Large File Storage),详见:Announcin ...

  3. 数据库原理 - 序列4 - 事务是如何实现的? - Redo Log解析(续)

    > 本文节选自<软件架构设计:大型网站技术架构与业务架构融合之道>第6.4章节. 作者微信公众号:> 架构之道与术.进入后,可以加入书友群,与作者和其他读者进行深入讨论.也可以 ...

  4. 抽象,接口和Object类

    在面向对象的概念中, 所有的对象都是通过类来表述的, 但并不是所有的类都是用来描绘对象的, 如果一个类中么有包含足够的信息来描绘一类具体的对象, 这样的类就是抽象类. 抽象类往往用来表征对问题领域进行 ...

  5. C#中,三种强制类型转换的对比

    在C#中,我们可以看到三种强制类型转换,比如强制转换成有符号32位整型,可以找到下面三种方式: ① (int)()                ②Convert.ToInt32()          ...

  6. mysql的进阶

    老师的博客:http://www.cnblogs.com/wupeiqi/articles/5713323.html 总结 导出与导入 导出:mysqldump -u root -p 数据库 > ...

  7. springboot 2.1.4 源码默认logback-spring.xml

    logback-spring.xml 是由几个文件组成的,整个的一个xml为 <?xml version="1.0" encoding="UTF-8"?& ...

  8. 前端部署ant+yuicompressor文件压缩+获取版本+SSH公布(部分代码)

    文件压缩: <apply executable="java" parallel="false" failonerror="true" ...

  9. CentOS7 安装配置 MySQL 5.7

    1. 下载 yum 源文件 mysql80-community-release-el7-2.noarch.rpm https://dev.mysql.com/downloads/repo/yum/ 2 ...

  10. postman使用详解

    前言: Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 接口请求流程 一.get请求 GET请求:点击Params,输入参数及value,可输入多个,即时显示在URL ...