获取百度的搜索结果,然后把百度的长链接,获取到真实的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. UI Automator 常用 API 整理

    主要类: import android.support.test.uiautomator.UiDevice; 作用:设备封装类,测试过程中获取设备信息和设备交互. import android.sup ...

  2. 基于密度峰值的聚类(DPCA)

    1.背景介绍 密度峰值算法(Clustering by fast search and find of density peaks)由Alex Rodriguez和Alessandro Laio于20 ...

  3. Windows 10 安装过程中,在自定义登录页面进入审核模式

    按ctrl-f3进入审核模式 https://msdn.microsoft.com/zh-cn/windows/hardware/commercialize/manufacture/desktop/b ...

  4. 对于for循环中使用let或var时,i的作用域范围的记录

    在for循环中使用let时,结果如下 for内部定义的i在循环结束后不会覆盖外部的i 在for循环中使用var,且不控制i的作用域时,结果如下 第一个for循环内部定义的i并不会创建,而是直接使用外部 ...

  5. 【学习总结】GirlsInAI ML-diary day-11-while循环

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day11 认识while循环执行 对于while/break/continue的认识 新值替换变量 一般while语句 无 ...

  6. Shell命令-文件及内容处理之head、tail

    文件及内容处理 - head.tail 1. head:显示文件内容头部 head命令的功能说明 head 命令用于显示文件头部内容,默认执行 head 命令会输出文件开头的 10 行. head命令 ...

  7. MySQL-基本命令

    一.登录命令 mysql -r 用户名 -p 密码 二.创建用户 create user '用户名'@'主机名' identified by '密码' #主机名:指定该用户在哪个主机上可以登陆,如果是 ...

  8. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  9. Codeforces 629D Babaei and Birthday Cakes DP+线段树

    题目:http://codeforces.com/contest/629/problem/D 题意:有n个蛋糕要叠起来,能叠起来的条件是蛋糕的下标比前面的大并且体积也比前面的大,问能叠成的最大体积 思 ...

  10. P1313 计算系数

    题目描述 给定一个多项式(by+ax)k(by+ax)^k(by+ax)k,请求出多项式展开后xn×ymx^n \times y^mxn×ym项的系数. 输入输出格式 输入格式: 共一行,包含555个 ...