多线程生产者消费者模型爬虫

import queue

import requests
from bs4 import BeautifulSoup
import threading
import time
import random def craw(url):
r = requests.get(url=url)
return r.text def parse(html):
soup = BeautifulSoup(html, "html.parser")
links = soup.find_all("a", class_="post-time-title")
return [(link["href"], link.get_test()) for link in links] def do_craw(url_queue: queue.Queue, html_queue: queue.Queue):
while True:
url = url_queue.get()
html = craw(url)
html_queue.put(html)
print(threading.current_thread().name, url)
time.sleep(random.randint(1,2)) def do_parse(html_queue:queue.Queue, f_out):
while True:
html = html_queue.get()
results = parse(html)
for result in results:
f_out.write(str(result) + "\n")
print(threading.current_thread().name, html_queue.qsize())
time.sleep(1) if __name__ == '__main__':
url_queue = queue.Queue()
html_queue = queue.Queue()
for url in ["https://www.cnblogs.com/#p{}".format(i) for i in range(1, 25)]:
url_queue.put(url) for idx in range(3):
t = threading.Thread(target=do_craw, args=(url_queue, html_queue), name=f"craw-{idx}")
t.start() file = open("02.data.txt", "w")
for idx in range(2):
d = threading.Thread(target=do_parse, args=(html_queue, file), name=f"parse-{idx}")
d.start()

多线程池爬虫

from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
from bs4 import BeautifulSoup spider_url = ["https://www.cnblogs.com/#p{}".format(i) for i in range(1, 25)] def craw(url):
r = requests.get(url=url)
return r.text def parse(html):
soup = BeautifulSoup(html, "html.parser")
links = soup.find_all("a", class_="post-time-title")
return [(link["href"], link.get_test()) for link in links] # craw
with ThreadPoolExecutor() as pool:
htmls = pool.map(craw, spider_url)
htmls = list(zip(spider_url, htmls))
for k, v in htmls:
print(k, len(v)) with ThreadPoolExecutor() as pool:
futures = {}
for url, html in htmls:
future = pool.submit(parse, html)
futures[future] = url # for k, v in futures.items():
# print(v, k.result())
for future in as_completed(futures):
print(futures[future], future.result())

协程

import asyncio
import aiohttp spider_url = ["https://www.cnblogs.com/taozhengquan/p/14966535.html"]*50 # 信号量控制爬虫数量
semaphore = asyncio.Semaphore(10) async def async_craw(url):
async with semaphore:
print("craw url:", url)
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
result = await resp.text()
print(url, len(result)) loop = asyncio.get_event_loop()
tasks = [
loop.create_task(async_craw(item)) for item in spider_url
]
loop.run_until_complete(asyncio.wait(tasks))

Python 多线程、线程池、协程 爬虫的更多相关文章

  1. python之路32 网络并发线程方法 线程池 协程

    多进程实现TCP服务端并发 服务端: import socket from multiprocessing import Process def get_server(): server = sock ...

  2. python进程.线程和协程的总结

    I.进程: II.多线程threading总结 threading用于提供线程相关的操作,线程是应用系统中工作的最小单位(cpu调用的最小单位). Python当前版本的多线程没有实现优先级,线程组, ...

  3. 互斥锁 线程理论 GIL全局解释器锁 死锁现象 信号量 event事件 进程池与线程池 协程实现并发

    目录 互斥锁 multiprocessing Lock类 锁的种类 线程理论 进程和线程对比 开线程的两种方式(类似进程) 方式1 使用Thread()创建线程对象 方式2 重写Thread类run方 ...

  4. 11.python之线程,协程,进程,

    一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

  5. 05网络并发 ( GIL+进程池与线程池+协程+IO模型 )

    目录 05 网络并发 05 网络并发

  6. python全栈开发 * 线程队列 线程池 协程 * 180731

    一.线程队列 队列:1.Queue 先进先出 自带锁 数据安全 from queue import Queue from multiprocessing import Queue (IPC队列)2.L ...

  7. python并发编程-进程池线程池-协程-I/O模型-04

    目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...

  8. python 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)

    1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...

  9. python简单线程和协程学习

    python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结 threading库可用来在单独的线程中执行任意的p ...

  10. Day037--Python--线程的其他方法,GIL, 线程事件,队列,线程池,协程

    1. 线程的一些其他方法 threading.current_thread()  # 线程对象 threading.current_thread().getName()  # 线程名称 threadi ...

随机推荐

  1. js推送网页到扩展屏上

    需求: 电脑上有两个屏幕,想在主屏上的网页中点击一个按钮,副屏就可以显示需要推送过去的网页 实现方法: 本方法使用的是js来实现的,亲测可行,支持火狐,但是不支持谷歌 demo: 主屏网页:1.htm ...

  2. openGauss/MogDB-3.0.0 dcf测试(非om安装)

    openGauss/MogDB-3.0.0 dcf 测试(非 om 安装) 本文出处:https://www.modb.pro/db/402037 IP 地址 ... LERDER ... FOLLO ...

  3. 将 Github Pages 个人博客录入搜索引擎(以 Bing 为例)

    目录 关于 Bing Webmaster Tools 步骤一:登录 步骤二:添加网站 步骤三:验证网站 步骤四:添加网站地图 验证 & 总结 相关链接 笔者最近准备将 Gitee Pages ...

  4. 面试连环炮系列(二十️五):RocketMQ怎么保证消息不丢失

    RocketMQ怎么保证消息不丢失? A. 从Producer的视角来看:如果消息未能正确的存储在MQ中,或者消费者未能正确的消费到这条消息,都是消息丢失. B. 从Broker的视角来看:如果消息已 ...

  5. Kubernetes 部署集群1.28.2版本(无坑)

    初步搭建一个一个主节点和两个从节点Kubernetes 1.28.2 集群.先准备好机器 | host | hostname | os | role | hardware | | --- | --- ...

  6. OceanBase初体验之查看OceanBase的执行计划

    前置条件 包含obd和obclient的中控机 OceanBase 测试集群 独立的测试租户 BenchmarkSQL 工具(可选) 为了能够方面的查看复杂SQL的执行计划,我们先用TPCC模拟一些数 ...

  7. PolarDB-X迎来开源后首个重大版本升级,2.1版本新增5大特色功能

    ​简介:2022 年 5 月25日,阿里云开源 PolarDB-X 升级发布新版本!PolarDB-X 从 2009 年开始服务于阿里巴巴电商核心系统, 2015 年开始对外提供商业化服务,并于 20 ...

  8. 我在阿里巴巴做 Serverless 云研发平台

    简介: Serverless 云研发平台经过这半年多的蜕变,已经从简单的解决工程链路的平台演进成一个面向研发.上线.运维的全生命周期研发平台,后续要解决的命题会集中在用户低门槛上. 作者 | 林昱(苏 ...

  9. 阿里开源支持10万亿模型的自研分布式训练框架EPL(EasyParallelLibrary)

    ​简介:EPL背后的技术框架是如何设计的?开发者可以怎么使用EPL?EPL未来有哪些规划?今天一起来深入了解. ​ 作者 | 王林.飒洋 来源 | 阿里技术公众号 一 导读 最近阿里云机器学习PAI平 ...

  10. HTML中元素分类与对应的CSS样式特点

    元素就是标签,布局中常用的有三种标签,块元素.内联元素.内联块元素,了解这三种元素的特性,才能熟练的进行页面布局. 块元素 块元素,也可以称为行元素,布局中常用的标签如:div.p.ul.li.h1~ ...