知乎话题结构以及相关内容抓取二(Redis存储)

代码路径:https://github.com/prophetss/zhihu-crawl

  接上一篇,知乎的抓取主要是获取所有话题id进而可以得到所有话题url地址然后就可以抓取具体内容了。之前通过根话题递归向下抓取整个话题有向图无环图会缺失很多,原因是不登录无法查看全部话题结构,而登陆后又无法连续抓取。这个问题我确实没想到什么特别好的办法,但是我发现话题是可以搜索的,所以就想出这个细水长流的办法,不断抓取百度知道等关键词然后在知乎上搜索相似话题,然后再扩展搜索到的话题,进而抓取对应内容。

  先说下结果,结果存放在redis数据库中,一共由三个hash表保存

  1.zhTopicMessage哈希表内key-话题id,value-字典{'name':名称, 'questions':问题数, 'followers',关注人数}
  2.zhTopicQuestions哈希表key-话题id,value-字典{'question':问题, 'author':作者, 'contents':'评论数':likes':点赞数,‘href':链接}
  3.zhTopicDAG内key-父话题id,value-子话题id队列

  由于有多个文件所以我传到git上了,下面再大致说下代码流程

  首先keywords_generator.py这个文件是获取关键词文件,里面已经写了百度知道(这里多说一嘴..百度知道我是抓取的实时提问的关键词,包含问题所属的关键词和问题内容包含的关键词,感觉也挺有用的,另外这个刷新是用的pjax技术怎么抓取让我也研究了好一阵时间:( 还有百度知道抓取不需要代理无限抓没事,知乎没代理稍微快一点就会被检测ip异常,不知道如何评价)和百度热点关键词抓取,也可以添加其他的只要最后放进数据库zhTemporaryWords集合中即可,其实也可以把新华词典整个导进去..

  然后zhihu_topic_crawl内会将上面得到的关键词在知乎上搜索抓取其全部搜索结果,再根据前者结果扩充(不断向父子话题全扩展)

  最后zhihu_message_crawl内通过所有得到话题id得到对应url抓取关注认识问题数精华问题等内容

   

   output.py是新添加的一个单独运行的输出文件,运行会将所存储的内容输出显示。因为想更直观的输出呈现和考虑到巨大的数据量和话题结构,目前是使用是按目录结构来存储其内容(windows下路径长度最长为255,而一个话题id为8位,实测在根目录开始存储最大深度可达27层,目前发下的话题深度最大可能也就刚过10层,可行)。每个话题id文件夹下生成一个文件,文件名为话题名称,文件内容为话题相关内容,下面是我一次运行结果:

  知乎话题结构以及相关内容抓取二(Redis存储)知乎话题结构以及相关内容抓取二(Redis存储)

  

  另外还有代理ip问题,我写了一个简单抓取代理ip的方法返回的是requests直接可用结构,实测实际不是很好用,关键有很多是失效的。所以我推荐一个https://github.com/jhao104/proxy_pool此程序,这个程序是不断抓取n多代理ip然后检测可用的保存,很好用。

  最后,代码还在持续改进中,目前实测一小时可以抓取3000个左右话题包括内容问题,代码还不是很完善还在持续更新中。