专栏首页Python专栏Python | Python爬虫爬取知乎小结

Python | Python爬虫爬取知乎小结

文章来源:

http://blog.csdn.net/qq_37267015/article/details/62217899

最近学习了一点网络爬虫,并实现了使用Python来爬取知乎的一些功能,这里做一个小的总结。网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本。我们知道机器学习和数据挖掘等都是从大量的数据出发,找到一些有价值有规律的东西,而爬虫则可以帮助我们解决获取数据难的问题,因此网络爬虫是我们应该掌握的一个技巧。

Python有很多开源工具包供我们使用,我这里使用了requests、BeautifulSoup4、json等包。requests模块帮助我们实现http请求,bs4模块和json模块帮助我们从获取到的数据中提取一些想要的信息,几个模块的具体功能这里不具体展开。下面我分功能来介绍如何爬取知乎。

模拟登录

要想实现对知乎的爬取,首先我们要实现模拟登录,因为不登录的话好多信息我们都无法访问。下面是登录函数,这里我直接使用了知乎用户fireling的登录函数,具体如下。其中你要在函数中的data里填上你的登录账号和密码,然后在爬虫之前先执行这个函数,不出意外的话你就登录成功了,这时你就可以继续抓取想要 的数据。注意,在首次使用该函数时,程序会要求你手动输入captcha码,输入之后当前文件夹会多出cookiefile文件和zhihucaptcha.gif,前者保留了cookie信息,后者则保存了验证码,之后再去模拟登录时,程序会自动帮我们填上验证码。

需要注意的是,在login函数中有一个全局变量s=reequests.session(),我们用这个全局变量来访问知乎,整个爬取过程中,该对象都会保持我们的持续模拟登录。

获取用户基本信息

知乎上每个用户都有一个唯一ID,例如我的ID是marcovaldong,那么我们就可以通过访问地址 https://www.zhihu.com/people/marcovaldong 来访问我的主页。个人主页中包含了居住地、所在行业、性别、教育情况、获得的赞数、感谢数、关注了哪些人、被哪些人关注等信息。因此,我首先介绍如何通过爬虫来获取某一个知乎用户的一些信息。下面的函数get_userInfo(userID)实现了爬取一个知乎用户的个人信息,我们传递给该用户一个用户ID,该函数就会返回一个 list,其中包含昵称、ID、居住地、所在行业、性别、所在公司、职位、毕业学校、专业、赞同数、感谢数、提问数、回答数、文章数、收藏数、公共编辑数量、关注的人数、被关注的人数、主页被多少个人浏览过等19个数据。

下图是我的主页的部分截图,从上面可以看到这19个数据,下面第二张图是终端上显示的我的这19个数据,我们可以作个对照,看看是否全部抓取到了。这个函数我用了很长时间来调试,因为不同人的主页的信息完整程度是不同的,如果你在使用过程中发现了错误,欢迎告诉我。

获取某个答案的所有点赞者名单

知乎上有一个问题是如何写个爬虫程序扒下知乎某个回答所有点赞用户名单?,我参考了段小草的这个答案如何入门Python爬虫,然后有了下面的这个函数。

这里先来大概的分析一下整个流程。我们要知道,知乎上的每一个问题都有一个唯一ID,这个可以从地址中看出来,例如问题2015 年有哪些书你读过以后觉得名不符实?的地址为 https://www.zhihu.com/question/38808048 ,其中38808048就是其ID。而每一个问题下的每一个答案也有一个唯一ID,例如该问题下的最高票答案2015 年有哪些书你读过以后觉得名不符实? - 余悦的回答 - 知乎的地址链接为https://www.zhihu.com/question/38808048/answer/81388411 ,末尾的81388411就是该答案在该问题下的唯一ID。不过我们这里用到的不是这两个ID,而是我们在抓取点赞者名单时的唯一ID,此ID的获得方法是这样:例如我们打算抓取如何评价《人间正道是沧桑》这部电视剧? - 老编辑的回答 - 知乎的点赞者名单,首先打开firebug,点击“5321 人赞同”时,firebug会抓取到一个“GET voters_profile”的一个包,把光标放在上面,会看到一个链接 https://www.zhihu.com/answer/5430533/voters_profile ,其中的5430533才是我们在抓取点赞者名单时用到的一个唯一ID。注意此ID只有在答案被赞过后才有。(在这安利一下《人间正道是沧桑》这部电视剧,该剧以杨立青三兄妹的恩怨情仇为线索,从大革命时期到解放战争,比较全面客观的展现了国共两党之间的主义之争,每一次看都会新的认识和体会。)

在拿到唯一ID后,我们用requests模块去get到知乎返回的信息,其中有一个json语句,该json语句中包含点赞者的信息。另外,我们在网页上浏览点赞者名单时,一次只能看到20条,每次下拉到名单底部时又加载出20条信息,再加载20条信息时所用的请求地址也包含在前面的json语句中。因此我们需要从json语句中提取出点攒着信息和下一个请求地址。在网页上浏览点赞者名单时,我们可以看到点赞者的昵称、头像、获得了多少赞同和感谢,以及提问和回答的问题数量,这里我提取了每个点赞者的昵称、主页地址(也就是用户ID)、赞同数、感谢数、提问数和回答数。关于头像的提取,我会在下面的函数中实现。

在提取到点赞者名单后,我将者信息保存了以唯一ID命名的txt文件中。下面是函数的具体实现。

注意,点赞者名单中会有匿名用户,或者有用户被注销,这时我们抓取不到此用户的信息,我这里在txt文件中添加了一句“有点赞者的信息缺失”。

使用同样的方法,我们就可以抓取到一个用户的关注者名单和被关注者名单,下面列出了这两个函数。但是关注者名单抓取函数有一个问题,每次使用其抓取大V的关注者名单时,当抓取到第10020个follower的时候程序就会报错,好像知乎有访问限制一般。这个问题,我还没有找到解决办法,希望有solution的告知一下。因为没有看到有用户关注10020+个人,因此抓取被关注者名单函数暂时未发现报错。

提取用户头像

再往下就是抓取用户头像了,给出某个唯一ID,下面的函数自动解析其主页,从中解析出该用户头像地址,抓取到图片并保存到本地文件,文件以用户唯一ID命名。

结合其他函数,我们就可以抓取到某个答案下所有点赞者的头像,某个大V所有followers的头像等。

抓取某个问题的所有答案

给出某个唯一ID,下面的函数帮助爬取到该问题下的所有答案。注意,答案内容只抓取文字部分,图片省略,答案保存在txt文件中,txt文件以答主ID命名。

数据库存取数据

在完成了上面的这些功能后,下一步要做的是将用户信息保存在数据库中,方便数据的读取使用。我刚刚接触了一下sqlite3,仅仅实现了将用户信息存储在表格中。

等熟悉了sqlite3的使用,我的下一步工作是抓取大量用户信息和用户之间的follow信息,尝试着将大V间的follow关系进行可视化。再下面的工作应该就是学习python的爬虫框架scrapy和爬取微博了。

另外,在写这篇博客的时候我又重新测试了一下上面的这些函数,然后我再在火狐上访问知乎时,系统提示“因为该账户过度频繁访问”而要求输入验证码,看来知乎已经开始限制爬虫了,这样以来我们就需要使用一些反反爬虫技巧了,比如控制访问频率等等,这个等以后有了系统的了解之后再作补充吧。

本文分享自微信公众号 - Python专栏(xpchuiit)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫爬取知乎小结

    最近学习了一点网络爬虫,并实现了使用Python来爬取知乎的一些功能,这里做一个小的总结。网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本。我们知...

    小小科
  • Python爬虫爬取知乎小结

    最近学习了一点网络爬虫,并实现了使用Python来爬取知乎的一些功能,这里做一个小的总结。网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本。我们知...

    小小科
  • Python爬虫教程:爬取知乎网

    Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取...

    python学习教程
  • 在知乎上学 Python - 爬虫篇

    知乎是个好地方。虽然近年来,为了吸引更多的用户,知乎的定位与早期略有点偏离。但从内容质量和专业性来说,知乎仍然是国内数一数二的知识型社区。不少同学都是通过知乎发...

    Crossin先生
  • 有了她,谁敢阻止我学习

    公众号 1、Python爱好者社区,微信号:python_shequ 人生苦短,我用Python。分享Python相关的技术文章、工具资源、精选课程、视频教程、...

    小歪
  • 一个简单的python爬虫,爬取知乎

    python学习教程
  • Python爬虫框架:scrapy爬取知乎数据

    基础环境沿用之前的环境,只是增加了MongoDB(非关系型数据库)和PyMongo(Python 的 MongoDB 连接库),默认我认为大家都已经安装好并启动...

    python学习教程
  • 学习python爬虫的平凡之路

    luanhz
  • 关于Python爬虫,这里有一条高效的学习路径

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 ? 如果你仔细观察,就不难发现,懂爬...

    昱良
  • 你为什么学爬虫?(赠书活动第③期)

    之前应邀转载了一个小伙伴的文章《爬取了陈奕迅新歌《我们》10万条评论数据发现:原来,有些人只适合遇见》,十分好评!小詹就想着爬一下曾经一度流行的那些青春校园电影...

    小小詹同学
  • python爬虫可以爬什么

    如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,...

    砸漏
  • Python爬虫:如何在一个月内学会爬取大规模数据?

    如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具...

    IT派
  • 找python爬虫小项目?github给你准备好了!

    即使我们都是程序员,但我们也并非都会修电脑,都会做酷炫的ppt,都会优化系统卡顿。其实程序员也是分行业、分专业的,就像医生也分内外科、呼吸科、神经科神的。

    efonfighting
  • GitHub 上有哪些好用的爬虫?

    在开发实际项目的时候,你经常没有足够多的数据,需要自己去想办法获取,这个时候常常需要用到爬虫。然而找来找去,很可能找了很久都找不到既免费又好用的爬虫,今天就从好...

    GitHubDaily
  • 如何在一个月内学会Python爬取大规模数据

    慕白
  • 关于Python爬虫,这里有一条高效的学习路径

    如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,...

    Python进阶者
  • 5个火爆 GitHub 的 Python 练习项目,快来收藏!

    今天我们继续分享 G 站上的火爆 Pyhton 项目,既有适合小白的基础 Python 教程,也有适合有基础的 Python 进阶项目。

    周萝卜
  • 我是如何零基础开始能写爬虫的

    利用这些数据,可以做很多领域的分析、市场调研,获得很多有价值的信息,可以应用在很多的工作场景,于是果断开始学习。

    Python中文社区
  • 学好Python爬取京东知乎价值数据

    如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,...

    华章科技

扫码关注云+社区

领取腾讯云代金券