剖析灵魂,为什么aiohttp默认的写法那么慢?
在上一篇文章中,我们提到了aiohttp官方文档中的默认写法速度与requests单线程请求没有什么区别,需要通过使用asyncio.wait
来加速aiohttp的请求。今天我们来探讨一下这背后的原因。
在上一篇文章中,我们提到了aiohttp官方文档中的默认写法速度与requests单线程请求没有什么区别,需要通过使用asyncio.wait
来加速aiohttp的请求。今天我们来探讨一下这背后的原因。
听说过异步爬虫的同学,应该或多或少听说过aiohttp
这个库。它通过 Python 自带的async/await
实现了异步爬虫。
使用 aiohttp,我们可以通过 requests 的api写出并发量匹敌 Scrapy 的爬虫。
关于Kafka的第三篇文章,我们来讲讲如何使用Python读写Kafka。这一篇文章里面,我们要使用的一个第三方库叫做kafka-python
。大家可以使用pip
或者pipenv
安装它。下面两种安装方案,任选其一即可。
作为一个爬虫工程师,Kafka 对你而言就是一个消息队列,你只需要掌握如何向里面写入数据,以及如何读取数据就可以m’ys’q作为一个爬虫工程师,Kafka 对你而言就是一个消息队列,你只需要掌握如何向里面写入数据,以及如何读取数据就何读取就可以可了。
请谨记:使用 Kafka 很容易,但对 Kafka 集群进行搭建、维护与调优很麻烦。Kafka 集群需要有专人来维护,不要以为你能轻易胜任这个工作。
GNE(GeneralNewsExtractor)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容、标题、作者、发布时间、正文中的图片地址和正文所在的标签源代码。GNE在提取今日头条、网易新闻、游民星空、 观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻等数百个中文新闻网站上效果非常出色,几乎能够达到100%的准确率。
这篇文章不会涉及到Kafka 的具体操作,而是告诉你 Kafka 是什么,以及它能在爬虫开发中扮演什么重要角色。
假设你有一个函数connect,它有一个参数address,这个参数可能是一个字符串,也可能是一个元组。例如:
1 | connect('123.45.32.18:8080') |
你想在代码里面兼容这两种写法,于是你可能会这样写代码:
1 | def connect(address): |
这种写法简单直接,但是如果参数的类型更多,那么你就需要写很长的 if-elif-elif-...-else
。代码看起来就非常不美观。
学习过 Java 的同学,应该对函数重载比较熟悉,可以定义几个名字相同的函数,但是他们的参数类型或者数量不同,从而实现不同的代码逻辑。
在 Python 里面,参数的数量不同可以使用默认参数来解决,不需要定义多个函数。那如果参数类型不同就实现不同的逻辑,除了上面的 if-else
外,我们还可以使用functools
模块里面的singledispatch
装饰器实现函数重载。
任意给出一个正整数,例如4523
,如何快速统计它的二进制值里面有几个1
?
在知乎上有这样一个问题:《如果当年汉字真的拼音化了会怎么样?》,下面有一个高赞回答写道:
这个答主的逻辑非常简单,因为《施氏食狮史》这个小故事,全篇只有shi
与si
两种发音,如果用汉语拼音,那么完全无法读懂。只有通过不同的中文汉字,才能正确读懂故事的意思。因此中文汉字比汉语拼音强,信息量比汉语拼音大。
然而这个答主忽略了一个问题,这个小故事实际上只有生活在汉字环境中的人才能想出来。对于完全生活在拼音环境中的人来说,他们的思维方式决定了根本不可能有这个故事产生。
当我们想从 Redis 的列表里面持续弹出数据的时候,我们一般使用lpop
或者rpop
:
1 | import redis |
但这种写法有一个问题,就是每弹出1条数据都要连接一次 Redis 服务器,当你要把1000万条数据从列表里面弹出来的时候,实际上超过一半的时间都消耗在了网络请求上面。