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 ...
随机推荐
- centos7 python环境安装
https://blog.csdn.net/LeonTom/article/details/81289326
- Spring Cloud:Security OAuth2 自定义异常响应
对于客户端开发或者网站开发而言,调用接口返回有统一的响应体,可以针对性的设计界面,代码结构更加清晰,层次也更加分明. 默认异常响应 在使用 Spring Security Oauth2 登录和鉴权失败 ...
- PWC6345: There is an error in invoking javac. A full JDK (not just JRE) is required
今天在使用jetty运行一个项目的时候报这个错误,仔细看了下,应该是eclipse配置的jdk或者jre出错. 看了下环境变量,发现有些配置没有配置完全. 我个人的解决方法: 在path中,添加%JA ...
- mariadb集群配置(主从和多主)
mariadb主从 主从多用于网站架构,因为主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构 ...
- idea注册码到期,破解idea
http://idea.lanyus.com/
- [官网]Using PuTTY
Previous | Contents | Next Chapter 3: Using PuTTY Section 3.1: During your session Section 3.1.1: Co ...
- 这才是你想要的 Python 可视化神器
Plotly Express 是一个新的高级 Python 可视化库:它是 Plotly.py 的高级封装,它为复杂的图表提供了一个简单的语法. 受 Seaborn 和 ggplot2 的启发,它专门 ...
- jap篇 之 JSTL标签库
JSTL标签库: JSTL: JSP Standard Tag Library 作用:和[EL配合]使用,可以让用户[尽可能少的使用java源码]. 1,导入jar包 导入(复制粘贴到项目中的lib目 ...
- Java多线程处理某个线程超时的问题
ExecutorService exec = Executors.newFixedThreadPool(4); List<Future<Integer>> futures = ...
- ExKMP(Z Algorithm) 讲解
目录 问题引入 CaiOJ 1461 [EXKMP]最长共同前缀长度 算法讲解 匹配过程 next 的求解 复杂度证明 代码解决 一些例题 UOJ #5. [NOI2014]动物园 CF1051E V ...