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 ...
随机推荐
- JS正则四个反斜杠的含义
我们首先来看如下代码,在浏览器中输出的是什么? // 在浏览器中输出的 console.log('\\'); // 输出 \ console.log('\\\\'); // 输出 \\ 一:js正则直 ...
- Spring Boot2.0使用Spring Security
一.Spring Secutity简介 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性 ...
- 基于 HTML5 结合互联网+的电力接线图
前言 “互联网+”思维让数据的搜集和获取更加便捷,并且随着大数据的深度开发和应用,数据分析预测对于提升用户体验有非常重要的价值,同时也为不同行业.不同领域的合作提供了更广阔的空间.传统的发电企业是一个 ...
- codeforces#439 D. Devu and his Brother (二分)
题意:给出a数组和b数组,他们的长度最大1e5,元素范围是1到1e9,问你让a数组最小的数比b数组最大的数要大需要的最少改变次数是多少.每次改变可以让一个数加一或减一 分析:枚举a数组和b数组的所有的 ...
- pyspider安装出现问题参考
File "c:\users\13733\appdata\local\programs\python\python37\lib\site-packages\pyspider\run.py&q ...
- OracleSql语句学习(二)
--DQL语句--查询语句用来检查数据使用--SELECT子句用来指定要查询的字段,若写“*”则表示查询所有字段.FROM子句用来指定数据来源的表.--SELECT * FROM emp_weiyij ...
- 初次使用Mybatis
目录 mybatis简介 导入jar包 创建数据库以及数据库表 创建实体类 创建mapper.xml文件 配置mybatis 测试mybatis 三种查询方式 selectOne selectList ...
- python之路4-文件操作
对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 f = open('lyrics','r',encoding='utf-8') read_line = f.r ...
- 使用Spring表达式语言进行装备--SpEL
本文主要想记录最近的两个使用spring框架实现通过配置文件装备Bean,以及使用SpEL装备Bean. 1.使用配置文件装备Bean: 当我们写某些Bean的时候是希望这个Bean当中的属性是可以通 ...
- 16.kubernetes的RBAC
role 分为clsterrole和role 我们从普通的role 开始理解起 [root@master ~]# kubectl create role pod-read --verb=get,lis ...