暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

未闻 Code·知识星球周报总结(一)

未闻Code 2021-08-29
766

知识星球周报总结是对未闻 Code·知识星球上的每周内容进行汇总,完全干货!


一、常识科普


常识1.非对称加密讲解中提及交换私钥,99.99%是个乱说的装逼货。

理由:在非对称加密里面,公钥可以随便乱传,随便给别人看,随便泄漏。但是私钥只能你自己知道。一旦某个操作需要你把私钥从你的一个电脑传到另外一台电脑,那一定是你某个地方搞错了。


常识2. 不是全职写程序却要格式化Windows,然后用Linux做日常办公的人,立刻停止你的浪费时间的行为。

理由:Windows几乎可以解决日常办公所有事情,而Linux擅长的领域是服务器领域。而服务器领域,你使用终端命令,ssh连远程服务器就足够了。对Linux图形界面再熟练也不等于对Linux熟练。你要熟悉Linux的命令,才是熟悉Linux。用电脑就是用软件,熟悉Linux本质上是熟练掌握Linux上面功能强大的软件。而Linux功能强大的软件基本都是命令行下的软件。安卓手机也是基于Linux的图形界面操作系统,难道你天天用安卓手机就等于天天用Linux了?


有些人说什么因为Linux是自由软件,用Linux做什么事情都是用户的自由。但我要说的是,电脑是工具,是用它来帮助你,而不是你去适应他。Linux图形界面很多功能就是比不上Windows,折腾Linux图形界面就是浪费时间。


如果你的主要工作是写程序,主要做软件开发,那么你用Linux没有问题。Linux下面软件开发的生态确实比Windows好不少。你格式化Windows以后安装Linux没有问题。但日常你只是一个学生,你并不是主要在Linux下面做开发,那么即使你要尝试Linux,也应该用Windows+Linux,你应该结合两个系统,而不是为了用Linux而格式化了Windows。 


二、问题解答

1

把RFC变成代码实现考验的是哪方面的能力呢?感觉编程水平进入了瓶颈,看人家的代码都看得懂,还能发现不足,发现bug并知道怎么改,但是自己对着正真的RFC文档确有些头大,不知道如何下手,用asyncio实现bitorrent协议,只完成了一部分,但对于复杂部分还是有些力不从心。那么如何提高这方面的能力呢?

点击空白处查看答案

 1. 需要先确认一下你现在的编程水平处于什么阶段。你自己完整开发过一个超过1w行代码的项目吗?(改别人的代码不算、给开源项目贡献部分代码也不算)。2. 如果你自己开发过一个大型的项目,那么,接下来,你可以试着实现一些简单的协议。3. 你可以看看 Redis 的通信协议,你看看你能不能自己实现一个Redis 客户端。如果这个都做不到的话,你就不要试图去尝试实现复杂的协议了。4. 记住,要先有需求,然后再去实现。别人实现了 bt 协议,是因为他有 BT 下载的需求,他先知道要做一个 BT 客户端需要有哪些功能。然后他带着这些功能,去看对应的RFC。而不是反过来。就像是我直接给你一个 API 接口文档,有一个类 xxx,里面有 A 方法,有 B 方法,有 C 方法,它们分别接收什么参数。然后问你,这个 API 接口能用来做什么事情?这样毫无道理。你要先根据需求,拆分他,分析要实现这些需求,需要哪些功能,这些功能在 RFC 上面是怎么写的。

2

请问该如何选择爬取数据的存储方式?比如说根据数量的不同选择不同方式?还是说最好都用数据库,只不过选择不同的数据库?

点击空白处查看答案

1. 考虑数据量有多少。如果只有十几条,那你直接print打印出来就可以了。2. 如果数据量足够多,请总是使用非关系型数据库来储存,例如MongoDB。因为它用起来足够简单,并发量足够高。3. 如果你有后续ETL流程,那么,数据清洗整理以后,用什么数据库都可以,取决于业务需要。

3

使用selenium(chrome/firefox)请求网页,代理使用隧道代理,如何在不新开session的情况下,更改ip?

点击空白处查看答案


隧道ip本来每次请求就会自动更换ip,不需要做任何额外设置



4

请教下对于爬虫系统中的数据监控(请求量、成功失败数量、入库数量、项目特有的监测内容等)有什么好的方案?我现在是使用了influxdb+grafana 然后在代码中埋点 但项目数量一起来 维护就很麻烦了 每个项目都有不同的监测内容。

点击空白处查看答案

 1. 这个爬虫是用什么写的?requests 这种类型的纯 http 客户端还是 Scrapy 这种爬虫框架?2. 如果是 Scrapy,那么请求、成功失败、都在日志里面有,你通过 loki+grafana 搜索然后统计就可以了。3. 这篇文章:为什么每一个爬虫工程师都应该学习 Kafka


5

请教一下,如何高效阅读框架源码(比如scrapy的源码)?有什么窍门或者方法建议吗?

点击空白处查看答案

 不要一行一行像读小说那样读,要按功能来读。例如可以先看他的中间件部分。然后看调度器部分,再看pipeline,最后看看下载器部分。它的下载器基于twisted写的,代码很难懂。如果你之前没有完整看过别人的框架,那么你可以先从简单点入手。scrapy是一个很大的项目,看起来难度比较高。我自己写了一个爬虫框架,并且在公众号里面写了他的设计思路。你可以先看看这个框架的源代码。从零开发一个爬虫框架——Tinepeas

6

我想在pipelines异步保存成功后的回调里使用awaitasyncio.sleep(30)异步等待,群友帮助下在success_callback方法上使用了@deferred_f_from_coro_f 发现在本地是有效果的,但是打包到scrapyd里面就会报异常,不知道什么原因。

点击空白处查看答案

 

这是scrapyd本身的限制。它不支持在scrapy中使用asyncio。

7

如何在scrapy中间件中做请求异常处理呢,如状态码异常需要重新请求、请求网站后返回需要进行人机验证的判断?

点击空白处查看答案

 

下载器中间件有一个方法,叫做process_response,它接收三个参数,分别是request,response,spider。你通过response.status就能知道状态码。

如果你要判断其他的异常,例如网络中断,网络超时,DNS解析失败等等,就需要使用process_exception方法,它接受3个参数request,exception,spider。你可以使用isinstance(exception, xxx)判断具体是哪个异常,详细可以看scrapy的官方文档 。

8

对于爬取不规整的网页表单(每个详情页都有网络表格,要爬取表单中一些重要字段但是表格样式多样化),有没有什么好的建议,或者好用的库推荐一下。

点击空白处查看答案

 试一试pandas的read_html,

有奇效!

三、知识讲解

知识1.Python开发的过程中,一定要坚决禁止使用 from xxx import *

讲解:一日一技:如何在Python项目中挖坑害人


知识2. GIL作用在哪里。说PythonGIL,所以在Python里面使用多线程不需要加锁的人,其认识是浅薄和无知的。

讲解:也许你对 Python GIL 锁的理解是错的。 


知识3.使用隧道代理不需要手动更换ip,可以大幅度降低开发负担。但是隧道代理的费用较高。如何使用普通代理自己搭建隧道代理,大大降低成本。

讲解:5分钟,自己做一个隧道代理 


知识4. 有时候,为了让开发者对程序有更多的掌控,我们需要人为降低程序的运行速度。爬虫速度极快,但出了问题你都不知道是谁的锅。为了清楚地划分责任范围,不得不让数据经过很多次中转。

讲解:一个数据爬取和分析系统的演变过程


四、星球专属


专属1.Python 使用 import 导入其他模块的时候,其内部的缓存机制,以及这个机制可能会导致的弊端以及应用。

专属2.使用 PyCharm,会看到出问题的代码被标记了红色波浪线。但不一定是你代码写错了,可能有其他原因。

专属3.Python 代码在 PyCharm 里面可以正常运行,但是在终端里面却运行不了,出现这个问题的原因。

专属4.不要在Python里面大量使用try…except/exception…

 

“星球专属”模块的详解,扫码加入未闻Code.知识星球即可查看。

END

未闻 Code·知识星球开放啦!

一对一答疑爬虫相关问题

职业生涯咨询

面试经验分享

每周直播分享

......

未闻 Code·知识星球期待与你相见~

一二线大厂在职员工

十多年码龄的编程老鸟

国内外高校在读学生

中小学刚刚入门的新人

“未闻 Code技术交流群”等你来!

入群方式:添“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)


文章转载自未闻Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论