用Python写一个小白也能懂的分布式知乎爬虫

IT168文库 2018-05-05

      很早就有搜集知乎用户数据的主见,要完结这个主见,需求写一个网络爬虫(Web Spider)。因为在学习 python,正好 python 写爬虫也是极好的选择,于是就写了一个依据 python 的网络爬虫。

  几个月前写了爬虫的初版,后来因为一些原因,暂时放置了下来,最近从头捡起这个主见。首要优化了代码的结构,然后在学弟的提示下,从多线程改成了多进程,一台机器上作业一个爬虫程序,会发起几百个子进程加快抓取。

  但是一台机器的功用是有极限的,所以后来我运用 MongoDB 和 Redis 搭建了一个主从结构的分布式爬取系统,来进一步加快抓取的速度。

  然后我就去好几个服务器厂商恳求免费的试用,比如百度云、腾讯云、Ucloud…… 加上自己的笔记本,断断续续抓取了一个多周,才搜集到300万知乎用户数据。中心还跑坏了作业网站的云主机,还好 自动备份 起作用,数据没有丢掉,但那又是其他一个故事了……

  那么我们怎样从用户主页的源码中获取用户的数据呢?一初步我以为需求挨个匹配页面中对应的部分,但我查看源码的时分发现知乎把用户数据集会合放到了源码的一个当地,那就是 id="data" 的 div 的 src="https://mmbiz.qpic.cn/mmbiz_jpg/1hynXaOnIxwrw1xqn5lpe1o3Zj96OZ0kq72Cxf2libxPBzpSl3kib8Yh9KrkGGDBuljJUynNSn2gM2aeE79ZSbyA/640?wx_fmt=jpeg" />

  从上图我们可以发现,date-state 的特色值中藏有用户的信息,比如我们可以依次找到用户的教育履历(educations)、简介(headline)、参与的 Live 数量(participatedLiveCount)、注重的保藏夹数量(followingFavlistsCount)、被保藏的次数(favoritedCount)、注重他的用户数(followerCount)、注重的论题数量(followingTopicCount)、用户描绘(description)等信息。经过查询我们也可以发现,数据应该是以 JSON 格式存储。

  s = BS(html,'html.parser')# 获得其时页的全部注重用户data = s.find('div',attrs={'id':'data'})['src="https://mmbiz.qpic.cn/mmbiz_jpg/1hynXaOnIxwrw1xqn5lpe1o3Zj96OZ0kIJ92qF1411k7JkH0oryibuWyTkI77EuCLS1lAVgsGapCibxpdqCtDYlQ/640?wx_fmt=jpeg" />

  举个具体的栗子:从一个 urlToken 在 waiting 调会合出现初步,经过一段时间,它被 info_crawler 爬虫程序从 waiting 调会合随机获取到,然后在 info_crawler 爬虫程序中抓取个人信息,假设抓取成功将个人信息存储到主机的 MongoDB 中,将该 urlToken 放到 info_success 调会合;假设抓取失利则将该 urlToken 放置到 info_failed 调会合。下一个阶段,经过一段时间后,list_crawler 爬虫程序将从 info_success 调会合随机获取到该 urlToken,然后检验抓取该 urlToken 代表用户的注重者列表,假设注重者列表抓取成功,则将抓取到的全部注重者放入到 waiting 调会合,将该 urlToken 放到 list_success 调会合;假设抓取失利,将该 urlToken 放置到 list_failed 调会合。

  如此,主机维护的数据库,协作从机的 info_crawler 和 list_crawler 爬虫程序,便可以循环起来:info_crawler 不断从 waiting 调会合获取节点,抓取个人信息,存入数据库;list_crawler 不断的补偿 waiting 集结。

  知道了用户数据都藏在 date-state 中,我们 用 BeautifulSoup 把该特色的值取出来,然后作为 JSON 格式读取,再把数据会合存储用户数据的部分提取出来即可,看代码:

  # 解析htmls = BS(html,'html.parser')# 获得该用户藏在主页面中的json格式数据集data = s.find('div',attrs={'id':'data'})['src="https://mmbiz.qpic.cn/mmbiz_jpg/1hynXaOnIxwrw1xqn5lpe1o3Zj96OZ0kzHHCQZuaWiahm0QnCicSUiaSa8ibnQUh0KqGr54nhg3t1DAGFSQehR1IUg/640?wx_fmt=jpeg" />用Python写一个小白也能懂的分布式知乎爬虫(图一)

  和获取个人信息相同的方法,我们可以在该页面源码的 date-state 特色值中找到注重他的用户(一部分):

用Python写一个小白也能懂的分布式知乎爬虫(图二)

  名为 ids 的键值中存储有其时列表页的全部用户的 urlToken,默许列表的每一页闪现20个用户,所以我们写一个循环便可以获取其时页该用户的全部注重者的 urlToken。

  所以我们可以用拼接字符串的方法,得到我们待抓取页面的URL:

主机和从机的联络如下图:

用Python写一个小白也能懂的分布式知乎爬虫(图三)

  主机是一台外网/局域网可以访问的“服务器”,从机可以是PC/笔记本/Mac/服务器,这个架构可以安置在外网也可以安置在内网。

  http://www.zhihu.com + /people + /excited-vczh + /answer

投稿邮箱:qinli@it168.com

  废话不多说,下面我介绍一下怎样写一个简略的分布式知乎爬虫。

  html = c.get_html(url)

  查询一下这个URL的组成:

  可以发现只需 excited-vczh 这部分是会改动的,它代表着知乎用户的仅有ID,在知乎的数据格式中,它的键名叫做 urlToken。

抓取知乎用户的个人信息

本文转载自云栖社区,作者雁横

  # 解析其时页的 html url = '%s/people/%s/followers?page=%d'%(host,urlToken,page)

  最上面是我们的政策URL:https://www.zhihu.com/people/excited-vczh/answers。

  给我们举荐一个学习交流的当地,想要学习Python的小伙伴可以一起来学习,719+139+688,入坑需谨慎,对Python没啥喜好的就不要来凑热闹啦。我们要抓取知乎用户数据,首要要知道在哪个页面可以抓取到用户的数据。知乎用户的个人信息在哪里呢,当然是在用户的主页啦,我们以轮子哥为例 ~

用Python写一个小白也能懂的分布式知乎爬虫(图四)

  红框里的便我们要抓取的用户要害信息(的一部分)。

  页面URL有了,而且从上图我们可以发现 不登录 也可以访问用户主页,这说明我们可以不用考虑仿照登陆的问题,可以安闲的获取用户主页面源码。

  url = '%s/people/%s/answers'%(host,urlToken)

协作微信:zhaoyuyingycq

用Python写一个小白也能懂的分布式知乎爬虫(图五)

IT168文库APP

最专业的IT技术交流同享途径!扫码设备,与许多技术同好交流!

     IT168文库|我国最专业的IT文档同享途径,具有百万生动的IT技术精英!我们致力于有用帮忙IT人士进步作业本质。

关键字:

特约作者

推荐阅读 ^o^

只需2.5年  你的年薪将会令你惊叹!!!

只需2.5年 你的年薪将会令你惊叹!!!

『中國邊疆研究與歷史書寫』研討會日程安排

『中國邊疆研究與歷史書寫』研討會日程安排

过真伤己、过直伤人

过真伤己、过直伤人

中国人走得太远太快,灵魂跟不上了(深度好文)

中国人走得太远太快,灵魂跟不上了(深度好文)

他说第二,有人敢说第一吗?

他说第二,有人敢说第一吗?

微信扫一扫
分享到朋友圈

prve

华为智简网络引领分销事务再提高丨2018华为网络分销合作伙伴大会隆重举行

上一篇

next

对飙NVIDIA! 国产最强AI云处理器正式发布

下一篇