第1期:学习知识,然后教会别人

2021/04/25 00:45

见信好:

这是《未闻 Code·会员通讯》第一期邮件。

我在回答什么问题

我们首先来回顾一下本周在读者交流群里面被问到比较多的问题,这些问题我已经在公众号上发布过文章:

为什么Python代码能运行但是PyCharm给我画红线?
为什么Python能运行但是PyCharm画红线(二)

当我们使用 PyCharm 的时候,可能会发现 import xxx 语句有时候被画上了红色的波浪线。这种情况一般来说是没有安装这个模块造成的。但是也有两种情况会导致误报:

  1. 工作区设置不正确
  2. Python 解释器选择不正确

这两篇文章会详细介绍这两种情况为什么会导致误报,以及解决方法。

在Scrapy中如何使用aiohttp?

有同学需要在 Scrapy 中使用代理 IP。他们用的是便宜代理供应商,这种供应商一般会提供一个 HTTP接口,你需要手动请求这个接口拿到当前可用的代理 IP,并把它组装到 Scrapy 中。但是由于 Scrapy 的DownloadMiddleware 里面不能调用 Scrapy 去请求代理 IP,所以他们总是使用 requests 去拉取 IP 地址。这种方式会导致Scrapy 的异步请求被卡住。本文会讲到,如何在 Scrapy 中集成 aiohttp,从而实现拉取代理和爬虫本身的请求同时异步发出,互不阻塞。

为什么每一个爬虫工程师都应该学习 Kafka

有一些同学想知道大型爬虫的架构是什么样的,如果要爬取几十万个网站,应该怎么组织爬虫和数据流。这篇文章,我讲到了如何使用 Kafka 把爬虫的生命周期串联起来,从数据抓取,到数据抽取,到监控报警,到 ETL。

我在学习什么知识

动态隧道代理

本周,我使用 OpenResty实现了一个类似于阿布云动态代理的服务。服务的运行效果如下图所示:

这个代理服务,我是参考openresty正向代理搭建 - 简书这篇文章实现的。不过文章里面,待爬取的 IP 是使用 Redis 列表来存放的,而我的环境里面,待爬取的 IP 是使用Hash 来存储的。因此,为了实现我的需求,我去学习了一些 Lua 的知识。使用 Lua 操作 Redis 的 Hash,从而实现了目的。

但需要注意的是,这篇文章里面的配置有些地方有点问题,我在实现的时候做了修正。我将会单独写一篇文章来讲述这个动态隧道代理的搭建过程。

Vue-Element-Ui

我之前是使用 Vue + Bootstrap4 来写前端网页的,但是由于 Bootstrap4原本应该搭配 JQuery。所以在涉及到强交互的地方,用起来很不顺手,虽然最终效果都能实现,但是像弹出模态框这种功能,我使用了不少 Hack 的方式来实现。

Element才应该是 Vue 的原配框架,所以我尝试使用它来重构了原来的一个前端页面,发现使用起来非常简单。

另外,需要说明的是,无论 Vue 还是 Element,都不一定非要使用 vue-cli。vue-cli 本质是通过 webpack 来构建Vue前端项目,但webpack 这一套技术对新手来说非常的麻烦。实际上,我们只需要使用<script>标签引入Vue 和 Element 对应的 js 程序就可以了。详情可以阅读我的这篇文章:为什么你应该看官方文档而不是搜索博客文章

我在看什么文章

Faster Python with Go shared objects (the easy way)

这篇文章详细介绍了如何在 Python 里面调用 Golang 的程序,并避免内存泄露的问题。

从邮件通讯的流行谈起 – Neverland

看了这篇文章以后,我决定开《未闻 Code·会员通讯》。

使用 Rust 迈出第一步 - Learn | Microsoft Docs

Go 入门 - Learn | Microsoft Docs

这两篇是微软官方出的 Rust 和 Golang 教程。免费,不需要注册。只需要打开网页就能学习。如果对这两个语言有兴趣的同学,强力推荐。

这一期的会员通讯就到这里,我们下周见。

青南
2021-04-25