最近学了一点网络爬虫,实现了一些用Python爬知乎的功能,这里做个小总结。网络爬虫是指通过一定的规则自动从互联网上抓取一些信息的程序或脚本。我们知道机器学习和数据挖掘都是从大量的数据开始,寻找一些有价值的、有规律的东西,而爬虫可以帮助我们解决数据获取难的问题,所以网络爬虫是我们应该掌握的一项技能。Python有很多开源工具包供我们使用。我这里使用了requests、BeautifulSoup4、json等包。requests模块帮助我们实现http请求,bs4模块和json模块帮助我们从获取的数据中提取一些想要的信息。几个模块的具体功能这里就不详述了。接下来介绍一下如何按功能爬取知乎。模拟登录如果要实现知乎的爬取,首先要实现模拟登录,因为如果不登录我们将无法访问很多信息,下面是登录功能。这里我直接使用知乎用户fireling的登录功能,如下。其中,你需要在函数中的数据中填写你的登录账号和密码,然后在爬虫之前执行这个函数。如果不出意外的话,就可以登录成功了,接下来就可以继续抓取想要的数据了。请注意,在***使用此功能时,程序会要求您手动输入验证码。输入后,当前文件夹下会多出cookiefile文件和zhihucaptcha.gif。前者保留cookie信息,后者保存验证码。当我们再次去模拟登录时,程序会自动为我们填写验证码。需要注意的是,登录函数中有一个全局变量s=reequests.session()。我们使用这个全局变量来访问知乎。在整个爬取过程中,这个对象会维护我们持续的模拟登录。获取用户基本信息知乎上的每个用户都有一个唯一的ID。比如我的ID是marcovaldong,那么我们可以访问地址https://www.zhihu.com/people/marcovaldong来访问我的主页。个人主页包含居住地、行业、性别、学历、点赞数、感谢数、关注过的人、被关注过的人等信息。因此,我先介绍一下如何通过爬虫获取知乎用户的一些信息。下面函数get_userInfo(userID)实现爬知乎用户个人信息。我们给用户传一个用户ID,函数会返回一个列表,包括昵称、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会抓取一个“GETvoters_profile”的包,把光标放在上面,会看到一个链接https://www.zhihu.com/answer/5430533/voters_profile,其中5430533是我们在抓取点赞列表时使用的唯一ID。请注意,此ID仅在回答被点赞后可用。(在这里安利《人间正道是沧桑》这部电视剧,该剧以杨立青兄妹三人的恩怨为线索,从大革命时期到解放战争时期,比较全面客观的呈现了国共主义斗争,每一次你都会有新的认识和体会。)得到唯一ID后,我们使用requests模块获取知乎返回的信息,里面有一个json语句,其中包含了喜欢的人。另外,我们在网页浏览点赞列表时,一次只能看到20条,而每次下拉到列表底部,又加载了20条消息,以及使用的请求地址loading20moremessages也包含在前面的json语句中。因此,我们需要从json语句中提取存点信息和下一次请求地址。在网页浏览点赞者列表时,我们可以看到他们的昵称、头像、点赞数和感谢数,以及提问和回答的问题数。这里我提取了每个点赞者的昵称和主页。地址(即用户ID)、点赞数、感谢、问答。关于头像的提取,我会在下面的函数中实现。提取喜欢者列表后,我将喜欢者的信息保存在一个以唯一ID命名的txt文件中。下面是函数的具体实现。注意点赞列表中会有匿名用户,或者已经注销的用户。目前,我们无法捕获该用户的信息。我在txt文件里加了一句“点赞者信息缺失”。使用相同的方法,我们可以获取用户的关注者列表和关注者列表。下面列出了这两个函数。但是follower列表抓取功能有问题。每次用来抓取一个大V的关注者列表,当抓取到第10020个关注者时,程序就会报错,好像知乎有访问限制。我还没有找到解决这个问题的办法,希望有解决办法的告诉我。因为没有用户关注过10020+个人,所以抓取关注者列表功能没有发现错误。提取用户头像,然后往下抓取用户头像。给定一个唯一的ID,下面的函数会自动解析它的主页,从中解析出用户头像的地址,抓取图片并保存到本地文件中。该文件以用户ID命名是唯一的。结合其他功能,我们可以抓取某个答案下所有点赞的头像,某个大V的所有关注者的头像等等。抓取一个问题的所有答案,并赋予唯一ID。以下功能有助于抓取问题的所有答案。注意这里只截取了答案的文字部分,省略了图片。答案保存在txt文件中,txt文件以回答者ID命名。数据库访问数据完成上述功能后,接下来就是将用户信息保存在数据库中,方便数据的读取和使用。刚刚接触sqlite3,只实现了将用户信息存储到表中。在熟悉了sqlite3的使用之后,我接下来的工作就是抓取大量的用户信息和用户之间的关注信息,尝试可视化大V之间的关注关系。接下来的工作应该是学习python的爬虫框架scrapy和爬取微博。另外,我在写这篇博文的时候,重新测试了一遍以上的功能,然后在火狐上访问知乎时,系统提示“因为账号被访问太频繁了”,要求输入验证码。看来知乎上已经开始限制爬虫了,所以需要用到一些反爬虫的技术,比如控制访问频率等,这个我们系统了解之后再补充。
