见信好:
这是《未闻 Code·会员通讯》第一期邮件。
我在回答什么问题
我们首先来回顾一下本周在读者交流群里面被问到比较多的问题,这些问题我已经在公众号上发布过文章:
为什么Python代码能运行但是PyCharm给我画红线?
为什么Python能运行但是PyCharm画红线(二)
当我们使用 PyCharm 的时候,可能会发现
import xxx语句有时候被画上了红色的波浪线。这种情况一般来说是没有安装这个模块造成的。但是也有两种情况会导致误报:
- 工作区设置不正确
- Python 解释器选择不正确
这两篇文章会详细介绍这两种情况为什么会导致误报,以及解决方法。
有同学需要在 Scrapy 中使用代理 IP。他们用的是便宜代理供应商,这种供应商一般会提供一个 HTTP接口,你需要手动请求这个接口拿到当前可用的代理 IP,并把它组装到 Scrapy 中。但是由于 Scrapy 的DownloadMiddleware 里面不能调用 Scrapy 去请求代理 IP,所以他们总是使用 requests 去拉取 IP 地址。这种方式会导致Scrapy 的异步请求被卡住。本文会讲到,如何在 Scrapy 中集成 aiohttp,从而实现拉取代理和爬虫本身的请求同时异步发出,互不阻塞。
有一些同学想知道大型爬虫的架构是什么样的,如果要爬取几十万个网站,应该怎么组织爬虫和数据流。这篇文章,我讲到了如何使用 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 的程序,并避免内存泄露的问题。
看了这篇文章以后,我决定开《未闻 Code·会员通讯》。
使用 Rust 迈出第一步 - Learn | Microsoft Docs
Go 入门 - Learn | Microsoft Docs
这两篇是微软官方出的 Rust 和 Golang 教程。免费,不需要注册。只需要打开网页就能学习。如果对这两个语言有兴趣的同学,强力推荐。
这一期的会员通讯就到这里,我们下周见。
青南
2021-04-25