一、介绍
平时知乎首页给推的问题有点看腻了,而且推荐算法的味道太重,我想看点不一样的东西,并且要考虑问题的关注量和被浏览量,那就自己动手爬取吧。
二、原理
易发现知乎问题的地址为"https://www.zhihu.com/question/"+一串数字,如下:
但是不是所有数字都可以搜到问题,所以存在一个有效性的问题。
分析源代码:
关注者量和被浏览量分别被保存在class为“NumberBoard-itemValue”的两个strong标签的title属性里。
如果是无效地址是不会有这两个量的,所以可以根据关注者量和被浏览量来判断某一地址是否有效,同时这也可以为我们筛选较受关注问题提供依据。
三、完整代码
import urllib
from bs4 import BeautifulSoup
Eff_url=[] #保存有效地址
f = open('temp.txt','w') #将关注者量或浏览量足够高的问题地址写入文档里,方便以后查看
######################################定义函数
def Find_Eff(url):
html = urllib.urlopen(url)
bsobj = BeautifulSoup(html.read())
namelist=bsobj.findAll("strong",{"class":"NumberBoard-itemValue"})
#如果是有效地址,namelist应该包含两个元素,分别为关注者量和浏览量的标签
if len(namelist)>1:
Eff_url.append(url)
print url + '\0\0' + namelist[0]['title'] + '\0\0' + namelist[1]['title']
#如果关注者量大于100或浏览量大于10000则判定为较受关注问题,写入文档
if int(namelist[0]['title']) > 100 or int(namelist[1]['title']) > 10000:
f.write(url + '\0\0' + namelist[0]['title'] + '\0\0' + namelist[1]['title'])
f.write('\r\n')
else:
print url
######################################
num = 365224610 #初始数字,可更改
for i in range(100):
num += 1
url = "https://www.zhihu.com/question/" + str(num)
Find_Eff(url)
f.close()