一、经验分享
- 有时候,我们使用Google想在特定的N个网站进行搜索,这个时候可以使用https://cse.google.com/cse/create/new这个功能相当于网站白名单,可以限定Google的搜索范围,避免搜到垃圾博客的内容。
- Airflow是真的难用。有时候我的代码就只有两三行,但我为了给他定时,写dag文件要写十几行。如果只想有一个分布式的定时系统,大家可以试一试cronsun。
二、问题解答
1、提问:南哥,在我的理解里,python面向对象编程。所以有一个callable的对象,在()内传参的语法蛮亲切的。但是像def ,class ,for,if,py2里的print,async这些 在后面敲一个空格,然后继续编写的(不知道叫什么,姑且叫关键词?)应该如何去理解,或者说自己如何去写一个东西 xxx然后敲个空格,而不是括号,继续编写。
def class for if 这个叫做关键字。
print xxx 这种写法叫做语句(statement)类似的还有
assert xxx
raise xxx
Python的解释器在对你的代码进行词法分析的时候会判断你的关键词后面跟一个空格再跟另外的内容是否合法。正常情况下,你没有办法自定义这种写法。但是可以通过魔改Python的解释器来让它支持。你可以去了解一下编译原理里面的词法分析和语法分析。词法分析把代码提取成token 流。语法分析把token流转换为抽象语法树(AST)。
2、南哥,我的mongo里有几万条数据,每条数据都有一个名字为A的字段,我需要一一比较每两条数据A字段的差,是否在一个范围内,如果在,就认为作比较的两条数据是重复数据。我需要去重,并计算去重后数据的重复数量。去重我实现了,但是去重后的重复数量怎么实现呢?能实现吗?就是去重后的每条数据,在没有去重之前,有多少条是重复的
这个东西直接在MongoDB里面不太好弄,你可以用Python读出来,然后用字典来记录重复的数据。
3、挺好奇大家公司的Python项目是怎么配置初始化变量值的。我们公司有这两种做法:
1. etcd etcd browser,在 python 项目中,会有一个线程去监听值是否发生变化,实时变化一个共享类,这样可以实时同步值。比如说数据采集中,有时需要降速,就直接 etcd 配,不用重启容器;
2. docker 使用 env 进行配置分发。
我们用Apollo来实现
4、南哥,系统不定时产生销售订单,每隔10分钟统计下单用户手机和金额,这种增量爬虫有什么好的策略么?谢谢
订单有接口,目前我是每5分钟访问一次。每天可能就2000-3000条数据,量不大。目前用了笨办法,把数据全部加入列表,去重保存在txt。下次筛选出新增的
点击空白处查看答案
数据量这么小,用redis的集合就可以了。每天一个key。甚至我觉得你现在的方法也没有问题。数据量小,频率低,怎么搞都可以。
5、提问:用浏览器正常访问时输入关键词就会出现相应的下拉列表项,但通过playwright输入相同关键词后下拉菜单项却不出现了。这是怎么回事呢?(进入页面后等待了5秒进行关键词输入)
你这只是一个普通的输入框,里面的自动补全内容是浏览器记住了你以前输入的内容、然后存到一个历史记录里面,优化使用体验的。这不是网站本身的功能。playwright打开的浏览器相当于一个全新的环境,它是读不到普通浏览器的历史记录的。如果手动用playwright打开网页后手动输入关键词又是能正常看到下拉列表项的,说明是这个下拉框的触发方式,用playwright激发不出来。
6、提问:南哥,我这边用 Scrapy-redis 写了一个采集器,在采集大量不同域名的网站。目前一部分域名网站需要不定期的全量采集,一部分网站需要不定期的增量采集。对于采集过的网址用 redis 去重,在 redis 中存储的 key 是对应的域名,value 是域名下已经采集过的 url。
在进行增量采集时,有的时候也需要对历史采集过的网址(N个月之前的)重新再采集一遍,可是 Redis 中只能对 key 做 TTL,如果限制了 key 的 TTL,时间到了整个 key 下的数据都被删除了,这是不行的, 需要实现的是在过滤器中对指定 key 下某个时间段的 value 数据进行删除,还请南哥帮忙指点下
你可以使用redis的有序集合,zset。它很像是集合,但是每个元素有一个属性叫做score,这个score是一个数字,你可以把它设置成过期时间的时间戳。你只需要另写一个程序,从有序集合里面可以把score小于某个值的元素全部删除。
南哥,现在需要找出mongo里相同的数据并且删除,所以对mongo1的集合复制了一份,命名为mongo2,如果mongo1里找到重复数据,就在mongo2里删除,怎么记录mongo2里每条数据重复了多少次呢?(我去重的代码在下面,有更优雅的方式吗?)
是只有一个字段重复,还是每个字段都重复?
每条数据有个叫value的字段,会存在多条value值相等的数据,我想把value值相等的数据只留一条。相当于两条数据的value值相等,那我就认为这两条数据是重复的,我只需要留下一条。图里代码还有个比较value值的逻辑,我给省略了...
可以使用aggregate来基于value统计数量。如下
代码语言:javascript复制col.aggregate(
[
{"$match": 搜索条件此处根find的参数相同},
{"$group": {"_id": "$value", "count": {"$sum": 1}}}
]
)
经南哥帮助,学到了如果想展示其它字段数据的话,
代码语言:javascript复制需要使用$last,如
{"$group":{"_id":"$pic_hash",
"count":{"$sum":1},
"data_id":{"$last":"$_id"}}}
$last需要搭配group使用,作用是返回排序后的文档最后一条数据