首页   注册   登录
 dongyx 最近的时间轴更新

dongyx

V2EX 第 62947 号会员,加入于 2014-05-18 01:13:49 +08:00
今日活跃度排名 16990
最近做了个按标签分类的程序员公众号导航,有这个需求吗?
分享创造  •  dongyx  •  2018-05-13 18:09:54 PM  •  最后回复来自 dongyx
3
Google Analytics 在国内能使用吗? 会不会不准?
问与答  •  dongyx  •  24 天前  •  最后回复来自 tomzhou
9
关于开源协议的疑问, 怎么定义"使用", "修改", "分发".
问与答  •  dongyx  •  2018-05-01 04:55:26 AM  •  最后回复来自 msg7086
2
用复数命名集合变量的程序员, 遇到单复同形怎么办?
问与答  •  dongyx  •  2018-04-26 17:26:29 PM  •  最后回复来自 DOLLOR
12
dongyx 最近回复了
http server
17 天前
回复了 tenstone 创建的主题 程序员 如何穿透内网? noip /frp/ngrok ?
我直接 ssh
20 天前
回复了 clecho 创建的主题 程序员 诸位公司项目的代码质量高吗?
@dongyx 另外关于需求和技术的矛盾,我自己有过一些反思。产品和技术的评价标准不一样,如果一个需求会导致按照我们程序员的标准必然导致烂代码,以前的我会觉得特别难受。但是后来发现是我自己被禁锢了,回顾软件工程的历史,我们程序员关于好代码的标准是怎么建立的呢?是在一次一次的实践中建立的,这些标准的最终目的是做出好产品。当市场上绝大部分公司的需求都会破坏这些既定的标准的时候,这说明时代变了,需求的模式变了,而我们软件工程的理论没有变,是我们落后了。我想我们要做的,是去探索新的符合这个时代的软件工程理论和架构模式吧。
20 天前
回复了 clecho 创建的主题 程序员 诸位公司项目的代码质量高吗?
@clecho 我认为求职是个自由市场,如果有其他公司能否给到我们更好的的回报,我们可以选择去新的公司。如果当前公司是我能找到的最好的公司,那我只能想办法把事情做好,以求加薪或者提高选择能力后跳槽。如果能够把现在公司的项目质量提高,对程序员来说是简历上的亮点。什么都很完善了,简历上怎么写了?
20 天前
回复了 clecho 创建的主题 程序员 诸位公司项目的代码质量高吗?
公司雇我们来,就是改善代码质量的。没有 bug,架构完善,给我们那么多钱来做什么呢?我们的任务就是去改进这些东西,而不是抱怨。
@daozhihun 倍增确定上界好赞,送一个感谢给你
@solider245 抱歉,我以为你的需求是确定最大页码,如果你是要爬去所有页面的话,用 while 就行了,二分搜索多此一举。
@solider245 就是一般意义上我们说的二分查找,一般的程序员应该都了解的。 如果你这方面有缺失,我时间不多,只能在这里简单解释一下:假设我有一个有序的整数数组,我想要查询里面一个数的下标,我先拿数组中间的数和目标数对比,如果相等那就找到了,如果小于目标值,就说明目标值在数组的后半部分,那我就去后半部分继续二分,如果大于目标值,说明目标值在数组的前半部分,我就去前部分用同样的方法找。

这样不断地分割数组,我只需要正比于数组长度的对数的时间就能找到值,也就是 1024 长度的数组我只需要找 10 次左右。

对于你的问题,你可以把所有页面看成是一个数组,合法是 0,不合法是 1,这个数组就是[0,0,0,....,1,1,1,1]这样的形式,你要找到最右边的 0,二分搜索就可以了。二分搜索的实现是很容易出 bug 的(除非你很好地掌握了循环不变式的思想, 但是如果你不知道二分搜索,我估计你也不知道循环不变式),所以不建议自己实现。bisect 标准模块已经实现了数组的二分搜索,所以你只需要构造这么一个数组,但是你不能真的去构造数组,不然相当于每个页面都去读取了一次,所以你可以覆盖__getitem__方法,构造一个假的数组,每次读数组的第 i 个值,你去取第 i 个页面就行了。

我给的代码只是简单的 demo,要达到工业强度,还需要一些改进,比如请求失败的处理之类的,祝好运。

PS:while 的做法是每个页码都尝试去读一次,比二分搜索慢了很多,但是如果你的性能需求没有你帖子里说的那么高,那就怎么简单怎么来吧。
我给楼主写一个实现,借助 bisect 标准模块,我们连二分搜索都不用自己实现,bisect_left()会求一个升序数组的 lower_bound,所以我们只需要写一个小类,覆盖__getitem__模拟数组行为,每次取下标 i 都去读站点的第 i 页,如果页面合法就返回 0,否则返回 1,然后调用 bisect_left 就可以了。

下面的例子是二分搜索探寻 Hacker news 的新闻版 ( https://news.ycombinator.com/news?p={page}) 的最大页码。对于 Hacker News 来说,一个页面有帖子当且仅当 HTML 中含有字符串'class='title'",所以可以以这个标准来确定页面是否合法。

V2EX 的回复似乎会忽略缩进,所以我也贴一个 gist:

import requests
import bisect

def valid(resp):
return int('class="title"' in resp.text)

class PageStatus:
def __getitem__(self, page):
r = requests.get("https://news.ycombinator.com/news",
params={"p": page})

return 0 if valid(r) else 1

end = bisect.bisect_left(PageStatus(), 1, lo=1, hi=1024)

print("the page range is [1, {0})".format(end))
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1944 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 13ms · UTC 16:06 · PVG 00:06 · LAX 08:06 · JFK 11:06
♥ Do have faith in what you're doing.