知识星球周报总结是对未闻Code·知识星球上的每周内容进行汇总,完全干货!
一、开发经验
用代码来约束开发者,而不是用文档。
之前发了一篇关于Python的black库格式化代码的文章一日一技:如何用一行命令格式化 Python 代码?,有人问:Pycharm就能格式化代码,为什么还要这个第三方库呢?
其实原因很简单,你会用Pycharm格式化代码,但不代表你的同事会。有些人就是不遵守编码规范。这就好像当我们用Python开发,有时候你要反复跟组员说不能乱用lambda函数,不能一个变量赋值不同类型的数据,不要什么数据都往字典堆一层套一层。但过两天他们还是要违反。所以你可以把black放到ci里面,无论是谁把代码提交到了远程仓库里面,Jenkins或者其他ci系统就会自动对代码进行格式化。
同理,如果你希望所有人在开发代码的时候,使用类型标注,并且不准给一个变量赋值不同类型的数据,你不应该在文档或者早会上面反复强调。你应该在ci里面使用mypy。如果他不遵守,那么他的代码就无法合并进入仓库。
二、问题解答
1
南哥,我在写一个协程爬虫里面单独定义了一个解析数据的函数(也是协程),是使用 yield返回的生成器换回一个生成器,但是我不知道怎么获取解析函数返回的生成器,还是协程里面不能这样写
点击空白处查看答案
parse_resp不涉及任何io操作,不需要用async来定义,成普通的生成器就行。然后
for g in result:
print(g)
2
提问:1.在做获取试卷的爬虫,网站A和网站B的某一套试卷可能会相同(但试卷标题和试卷内容不会完全相同),爬虫A的内容存到了Mongo的集合A,爬虫B的内容存到了集合B,怎么对比爬取的试卷是否重复了呢?通过类似jieba分词这样去判断相似值吗?
点击空白处查看答案
一道题怎么算是重复?需要文字和标点符号和选项顺序一模一样才算吗?还是文字可以不一样但意思需要一样?如果是前者,不用分词,直接对比就可以了。如果是后者,就需要用nlp做语义识别。这就很麻烦了。
3
接问题2,我是按分类将网站A爬虫存到集合A,网站B爬虫存到集合B,是需要通过迭代集合A的每一条数据然后去和集合B每一条数据比较吗?感觉这样似乎不太高效,还是说我应该一开始就统统存到一个集合,每次入库之前先判断下呢?
点击空白处查看答案
如果你可以一条一条分开,可以分别把他们读到Python的两个set里面。然后做交集就是相同的,做差集就是不同的。
4
如果爬取内容里有图片链接,是一个完整的url,怎么处理才能让前端直接显示访问url后的图片呢?我在数据清洗入库的时候怎么做比较好呢?
点击空白处查看答案
数据入库的时候就保留完整的URL。前端通过img标签加载这个URL对应的图片。
5
南哥,请教一个问题:git submodule 拉子模块的时候,如何不拉取指定格式的文件。例如我想忽略其中的*.c,*.h,似乎没找到可以设置这个规则的地方?
点击空白处查看答案
git update-index --assume-unchanged 文件绝对路径
6
提问:1.查看redis和scrapy_redis的日志,发现redis里已经没有request请求了,只有爬虫名:dupefilter,但日志显示还在不停爬取,这是因为我在make_requests_from_url定义了dont_filter=True的缘故吗?如果是的话,且我不关闭scrapy,这样岂不是一直在对网站发请求了吗?我应该去改动什么设置来改变这种情况吗?
点击空白处查看答案
可以开pycharm的调试模式,跟踪一下请求,看看哪几行代码一直在重复运行。
7
提问:"C:\Program Files\Google\Chrome\Application\chrome.exe" http://2523.browurl.com/gh10 后面那个是病毒吗?我把它删了谷歌主页才能自选。我是不是被追踪定位劫持了,过多几天会不会也强行改我的启动主页?
点击空白处查看答案
是的,这就是浏览器劫持的一种方法。杀毒。再不行就格式化硬盘重装系统。
8
提问:cpu密集型任务,python 除了分布式 有啥办法达到1s上千并发量
点击空白处查看答案
那单机单节点很难达到上千并发。你多开几个进程也不容易,毕竟cpu就那么几个核
END