• 知乎话题结构以及相关内容抓取二(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文件夹下生成一个文件,文件名为话题名称,文件内容为话题相关内容,下面是我一次运行结果:

      

      

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

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

  • 相关阅读:
    cython教程
    CMake 教程
    Python的MySQLdb模块安装,连接,操作,增删改
    python异常处理try,except,else,finally,raise
    python中xrange和range的异同
    AttributeError: 'module' object has no attribute 'Thread'
    Java 中队列的使用
    INFORMIX 时间函数大全
    JMS的样例
    ACdream 1135(MST-最小生成树边上2个值,维护第一个最小的前提下让还有一个最小)
  • 原文地址:https://www.cnblogs.com/prophet-ss/p/9521229.html
Copyright © 2020-2023  润新知