获取百度的搜索结果,然后把百度的长链接,获取到真实的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使用队列的更多相关文章

  1. Python开发【模块】:aiohttp(一)

    AIOHTTP 用于asyncio和Python的异步HTTP客户端/服务器 主要特点: 支持客户端和HTTP服务器. 支持服务器WebSockets和 客户端WebSockets开箱即用,没有回调地 ...

  2. aiohttp的模板

    import aiohttp import asyncio import async_timeout from urllib.parse import urljoin,urldefrag root_u ...

  3. aiohttp web服务端(server)样例 (非client)

    python版本 python3.6 (其他版本需要小改,版本>python3.4) 参考网址:https://www.cnblogs.com/ameile/p/5589808.html  as ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  6. Beanstalkd一个高性能分布式内存队列系统

    高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...

  7. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  8. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  9. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

随机推荐

  1. AI 强化学习

    强化学习(reinforcement learning,简称RL), agent policy state action 目标  最大化累计reward 参考链接: https://en.wikipe ...

  2. MySQL数据类型的选择

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据类型的选择时间:2019年2月22日内容:MySQL数据类型的选择范式参考重点:主要讲述MyS ...

  3. 【问题解决方案】ImportError: No module named 'openpyxl'/‘xlrd’

    背景: 在jupyter notebook to_excle: 运行将dataframe保存为excel文件 df.to_excel('dataframe.xlsx') 时报错openpyxl rea ...

  4. mpvue-Vant Weapp踩坑记

    微信开发者工具:开发.调试和模拟运行微信小程序的最核心的工具了,所以必须安装 # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 mpvue- ...

  5. 基于stm32智能车的设计(ucosiii)---北京之行

    实物演示视频:https://v.youku.com/v_show/id_XMzc3MDE3NjMyNA==.html?x&sharefrom=android&sharekey=172 ...

  6. python之pymongo

    引入 在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库. MongoDB 数据库安 ...

  7. Magento2 Service contracts 服务合同

    服务合同 Magento是一个模块化系统,它使第三方开发人员能够定制和覆盖其框架的核心部分.然而,这种灵活性是有代价的. 业务逻辑倾向于泄漏Magento系统的各个层,这表现为重复且不一致的代码. 商 ...

  8. Magento2.X 后端开发简要1

    Megento2.X 后端开发简要 根目录位置 组件的根目录是其文件夹和文件所在的组件的顶级目录.根据您安装的MaMeto开发环境,组件的根目录可以位于两个位置: 1.<Magento inst ...

  9. 平衡树splay学习笔记#1

    这一篇博客只讲splay的前一部分的操作(rotate和splay),后面的一段博客咕咕一段时间 后一半的博客地址:[传送门] 前言骚话 为了学lct我也是拼了,看了十几篇博客,学了将近有一周,才A掉 ...

  10. [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】

    题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...