aiohttp使用队列
获取百度的搜索结果,然后把百度的长链接,获取到真实的url
import time
import aiofiles
import aiohttp
import asyncio
from lxml import etree
from asyncio import Queue
from itertools import product
import async_timeout
MAX_THREADS = 50
class BaiduSpider:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"
"(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"}
self.q = Queue()
self.q2 = Queue()
def url_generator(self):
with open('keyword.txt', 'r', encoding='utf8') as f:
for key in product(f, range(0, 5)):
yield f"https://www.baidu.com/s?wd={key[0].strip()}&pn={key[1]}"
async def fetch(self, session, url):
try:
with async_timeout.timeout(1):
async with session.get(url, headers=self.headers) as resp:
if resp.status in [200, 201]:
return await resp.text()
except Exception as e:
pass
async def work(self, session):
while not self.q.empty():
url = await self.q.get()
html = await self.fetch(session, url)
datas = await self.parser(session, html)
self.q.task_done()
async def parser(self, session, html):
if html:
tree = etree.HTML(html)
datas = tree.xpath('//h3[@class="t"]/a')
for data in datas:
title = data.xpath('string(.)')
link = data.xpath('@href')[0]
data = [title, link if title else '']
self.q2.put_nowait(data)
await self.work2(session)
async def work2(self, session):
while not self.q2.empty():
data = await self.q2.get()
try:
with async_timeout.timeout(1):
async with session.get(data[1], headers=self.headers) as resp2:
print(resp2.url, data[0])
async with aiofiles.open('links.txt', 'a', encoding='utf-8') as fd:
if str(resp2.url) not in 'links.txt':
await fd.write(f"{data[0]},{resp2.url}\n")
except Exception as e:
pass
async def download(self):
urls = self.url_generator()
conn = aiohttp.TCPConnector(verify_ssl=False) # 防止ssl报错
[self.q.put_nowait(url) for url in urls]
async with aiohttp.ClientSession(connector=conn) as session:
tasks = [asyncio.ensure_future(self.work(session)) for _ in range(MAX_THREADS)]
await asyncio.wait(tasks)
def run(self):
start_time = time.time()
loop = asyncio.get_event_loop()
tasks1 = asyncio.gather(self.download())
loop.run_until_complete(tasks1)
print(f'全程用时{time.time() - start_time}秒')
if __name__ == '__main__':
baidu = BaiduSpider()
items = baidu.run()
aiohttp使用队列的更多相关文章
- Python开发【模块】:aiohttp(一)
AIOHTTP 用于asyncio和Python的异步HTTP客户端/服务器 主要特点: 支持客户端和HTTP服务器. 支持服务器WebSockets和 客户端WebSockets开箱即用,没有回调地 ...
- aiohttp的模板
import aiohttp import asyncio import async_timeout from urllib.parse import urljoin,urldefrag root_u ...
- aiohttp web服务端(server)样例 (非client)
python版本 python3.6 (其他版本需要小改,版本>python3.4) 参考网址:https://www.cnblogs.com/ameile/p/5589808.html as ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- Beanstalkd一个高性能分布式内存队列系统
高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
随机推荐
- 容器中的JVM资源该如何被安全的限制?
前言 Java与Docker的结合,虽然更好的解决了application的封装问题.但也存在着不兼容,比如Java并不能自动的发现Docker设置的内存限制,CPU限制. 这将导致JVM不能稳定服务 ...
- JS 函数节流与防抖
前言 事件的触发权很多时候属于用户,可能会出现下列问题: 向后台发送数据,用户频繁触发,对服务器造成压力: 一些浏览器事件,如window.onresize,window.mousemove等,触发的 ...
- Ubuntu 系统安装详解 19.04最新版本
Ubuntu 19.04版本系统安装详解 1 .镜像的下载 推荐 阿里云镜像下载 2.安装 1.1.新建虚拟机 注意硬件的兼容性问题 当前只有5.x可以用,其他兼容各位可以尝试下,我也都试过,但只有5 ...
- 关于token登录逻辑分析
前言: token登录上一家公司也写过,迷迷糊糊的, 现在做一个APP,需求为每次调用接口都会传token,登录注册等特殊的除外, 逻辑整理一下还是比较简单的 主要的问题还是,如何在框架中找到较好的插 ...
- springboot2.0整合shiro出现ShiroDialect报错 找不到org/thymeleaf/processor/attr/AbstractTextChildModifierAttrPr
包版本过低,找最新包 https://mvnrepository.com/ <dependency> <groupId>com.github.theborakompanioni ...
- 【Machine Translation】CMU的NMT教程论文:最全面的神经机器翻译学习教程
这是一篇CMU发的神经机器翻译教程论文,很全很详细,适合新手阅读,即使没有什么MT.DNN.RNN的基础知识. 另外它还配套了CMU自己的一个框架DyNet的练习. 全文共9章,从统计语言模型到DNN ...
- python常用的基本操作
打开cmd,pip list 可以查看python安装的所以第三方包
- vue2.0实现过滤
vue1.0和vue2.0差别还是挺多的,之前的vue1.0还有过滤器功能,到了2.0过滤器只能通过自己编写.以下是写的一个小demo: HTML <div id="app" ...
- 倍增\ tarjan求lca
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...
- Django_rbac_demo 权限控制组件框架模型
rbac 权限控制组件 基于角色的权限控制 本质每个权限即为一个 URL 项目组件结构 表结构 Role (title, permission) -(ManyToManyField)- User ...