如何找出知乎的所有神回复

  有时候看到神回复,感觉真是惊叹!先上几个看看

你小时候父母为了让你能够努力学习,都用过什么丧尽天良的方法? - 知乎
给了我这张脸

求职者在答应企业面试后,没有任何说明而爽约是否妥当? - 知乎
你们企业也经常说“回去等我们的电话吧”然后没有任何下文啊。

什么叫见过大世面 ? -知乎

能享受最好的,能承受最坏的

  神回复总是言简意赅,吐槽精准,回答到位,甚至是让人忍俊不禁,如何找到知乎的所有神回复,有人说找那些投票多并且回答字数少的answer,对于一个计算机的同学,不可能就是这样一条条去翻一吧,让我们写一个爬虫,抓下知乎的问题,每个问题保留投票最高的回答。首先需要一个得到问题列表,这里列表可以在http://www.zhihu.com/log/questions找到,爬问题列表的代码如下:  

def getQuestions(start,offset=‘20‘):
    #cookies = urllib2.HTTPCookieProcessor()
    #opener = urllib2.build_opener(cookies)
    #urllib2.install_opener(opener)

    header = {"Accept":"*/*",
    "Accept-Encoding":"gbk,utf-8,gzip,deflate,sdch",
    "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",
    "Connection":"keep-alive",
    "Content-Length":"64",
    "Content-Type":"application/x-www-form-urlencoded; charset=utf-8",
    ‘Cookie‘:‘*************‘
    "Host":"www.zhihu.com",
    "Origin":"http://www.zhihu.com",
    "Referer":"http://www.zhihu.com/log/questions",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36",
    "X-Requested-With":"XMLHttpRequest"
    }

    parms = {‘start‘:start,
            ‘offset‘:offset,
            ‘_xsrf‘:‘*************‘}
    url = ‘http://www.zhihu.com/log/questions‘
    req = urllib2.Request(url,headers=header,data=urllib.urlencode(parms))
    content = urllib2.urlopen( req ).read()
    html = gzip.GzipFile(fileobj = cStringIO.StringIO(content)).read()
    html = eval(html)[‘msg‘][1]
    pageSoup = BeautifulSoup(html)
    questions = []
    items = pageSoup.find_all(‘div‘,{‘class‘:‘zm-item‘})
    for item in items:
        url = item.find_all(‘a‘,{‘target‘:‘_blank‘})[0].get(‘href‘).rsplit(‘/‘,1)[1]
        questions.append(url)
    lastId = items[-1].get(‘id‘).split(‘-‘)[1]
    return questions,lastId

  得到问题列表后再抓取每个问题投票最高的回复,代码如下:

def getArticle(url):
    page = getPage(url)
    pageSoup = BeautifulSoup(page)
    title = str(pageSoup.title).replace(‘<title>‘,‘‘).replace(‘</title>‘,‘‘).strip()
    item = pageSoup.find_all(‘div‘,{‘class‘:‘zm-item-answer‘})
    if item is None or len(item) == 0:
        return None
    anwser = item[0].find(‘div‘,{‘class‘:‘fixed-summary zm-editable-content clearfix‘}).get_text().strip()
    vote = item[0].find(‘div‘,{‘class‘:‘zm-item-vote-info ‘}).get(‘data-votecount‘).strip()
    anwser = formatStr(anwser)
    ans_len = len(anwser)
    if ans_len > 100:
        anwser = anwser[0:100]
    title = formatStr(title)
    out = [title, anwser, str(ans_len),vote,url]
    return out

  现在我们得到了每个问题的标题、投票最高的回复、问题链接。接下来我们需要把“回复短投票高”这样的规则进行量化计算,很明显一个回复是神回复的可能性与投票数成正比,与回复文本的长度成反比,但实现上,我们需要注意一些细节,比如有些神配图,一言不语,文本长度为0,所以需要平滑一些,另外回复越段应该越精辟,于是我定义了如下公式:$$Score=\frac{vote}{5+\frac{answer\_len^2}{10}}$$

  这个公式整体来说,认为是神回复的可能与投票数成正比,与回复的长度的平方成反比,加5是为了平滑哪些神配图。

  爬了一个晚上,爬取了2万个问题,然后按Score计算,取Score最大的top 1000,欣赏神回复,请移步至github

  问题爬得太少,更多的精辟神回复没有找出来。

转载请注明出处:http://www.cnblogs.com/fengfenggirl/  

时间: 2024-11-11 16:19:39

如何找出知乎的所有神回复的相关文章

【转】已知一个数出现的次数严格超过了一半,请用O(n)的复杂度的算法找出这个数

原文转自:http://blog.csdn.net/zhq651/article/details/7930284 方法1:既然过半,那么用这个数与其他数配对的话,剩余的数字一定还是过半的这个数字.因此可以通过不断删除不同的2个数,直到没有不同的2个数,那么这个数就是要找的数.证明:最坏情况下,只有这个数同别的数配对,并且被删除,剩下的仍旧是这个数,因此得证. 转自:http://www.cnblogs.com/python27/archive/2011/12/15/2289534.html 例:

Entity Framework 6 Recipes 2nd Edition(9-3)译-&gt;找出Web API中发生了什么变化

9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Frist实现数据访问管理. 本例,我们模拟一个N层场景,用单独的客户端(控制台应用)来调用单独的基于REST服务的Web网站(WEB API应用) . 注意:每层使用单独的Visual Studio 解决方案, 这样更方便配置.调试和模拟一个N层应用. 假设有一个如Figure 9-3所示的旅行社和预订

找出矩阵中含有0最多的一行(find the longest row of zero)

对于一个n*n的矩阵,其中只包含有0,1两种元素且,所有的0都在1之前,请找出矩阵中0最多的一行.(Given an N-by-N matrix of 0s and 1s such that in each row no 0 comes before a 1, find the row with the most 0s in O(N) time.) 初看这题,想到的算法就是每一行都设置一个计数器,记录每行的0的个数,然后找出最大值即可(暴力解法). 算法实现: int* find_the_lon

1.5 快速找出机器故障

题目:假设一个机器只存储一个标号为ID的记录,假设每份数据保存2个备份,这样就有2个机器存储了相同的数据.其中ID是小于10亿的整数. 问题1.在某个时间,如果得到一个数据文件ID的列表.是否能够快速的找到这个表中仅出现一次的ID?即快速找出出现故障的机器存储的数据ID. 问题2.如果有两台机器死机呢?(假设同一个数据的俩个备份不会同时丢失,即列表中缺少的是两个不等的ID) 扩展题.如果所有的机子都有三个备份,也就是说同一ID的机子有三台.而且同时又有三台机子死机,还能用上面的方法解决吗? 如果

485. 找出二进制串中连续的1的个数 Max Consecutive Ones

Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1,1,0,1,1,1] Output: 3 Explanation: The first two digits or the last three digits are consecutive 1s. The maximum number of consecutive 1s is 3. Note: T

找出真凶:谁在连接我的数据库?

qunyingliu 2014.10.31 背景: 数据库迁移需要梳理数据库认证信息,业务的数据库配置信息比较松散,已知的已经修改但是总有一些落单的. 怎么找出真凶? 1.登录数据库服务器查看连接数据库的网络链接: ssh   10.1.1.85 netstat -ntp|grep "数据库IP:数据库端口" 查看数据库服务器上已经建立的连接,如下图所示: tcp   0  0  10.1.1.85:3306    10.2.1.33:3610   ESTABLISHED 13025/

(译)用win7自带工具找出svchost.exe的CPU使用率达到100%的元凶

本文是我对自己上一篇转载的博客 <Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7> 的翻译.本人翻译的原则是力求通顺自然,因此很多地方并没有严格按照原文的词句来,而是争取用更符合我们语言习惯的方式表达类似的意思. =====================================华丽的分割线=================================== S

[算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)

问题描述: 设计一个类,包含如下两个成员函数: Save(int input) 插入一个整数到一个整数集合里. Test(int target) 检查是否存在两个数和为输入值.如果存在着两个数,则返回true,否则返回false 允许整数集合中存在相同值的元素 分析: 与[算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)不同,这里需要算出的是存不存在这两个数,可以在上一篇的基础上修改一下数据结构,HashMap其中key是数值,value是数值个数,然后需要作两步判断,map中存在数

算法:找出有序数组中两数,它俩之和等于输入值

题目:已知按序排列的整数数组,输入任意数number,当数组中某两数之和等于number时,打印出两个数. 要求:复杂度为o(n) 解法: 数组已是有序排列,且两个加数一定满足条件:较小加数<= (number/2) <= 较大加数:那么只需要找出该数组的较小加数和较大加数分界index,以该分界为起点分别往左右两边逐个取值匹配. 若两数之和>number,说明较小加数还要再小,向数组的较小值方向移位取值与原较大值重新匹配. 若两数之和<number,说明较大加数还要再大,向数组的