知乎爬虫过程详解(附完整代码)

磕盐需要,编写了一个爬虫程序,对知乎网站的数据进行爬取,关于知乎爬虫,我们分别从用户角度问题角度两个方向对其进行爬取。

项目流程:爬虫代码(Python)→非结构化数据(Mongo)→结构化数据(MySQL)→结构化数据(Access)

为了应对反爬机制,我们用Python编写爬虫爬取IP代理池,IP代理池程序源码地址:https://github.com/ambition-hb/Pool_Proxy
IP代理池
数据的爬取以知乎话题下内容为爬取对象。通过python设计实现了爬虫程序,对知乎问答社区的资料进行了爬取,作为研究问题文本分类的数据。这些数据的来源是用浏览器获得的,浏览器获取的其实是一系列的文件,其中包含有HTML格式部分、CSS样式部分以及JavaScript执行层部分。浏览器将加载和理解这些数据,并通过渲染就得到了图这边的显示。因此爬虫得到的就是这些文件,通过分析和过滤这些代码文件,就可以实现对图片和文字的爬取。

程序源码地址:

(1)从问题角度出发,我们在2018年暑期对知乎“英语学习”和“流行音乐”两个话题下的问题出发,对以下内容进行爬取:

  • 1、首先抽取话题下的问题,将QuestionURL(问题URL)保存起来;
  • 2、根据QuestionURL来获取QuestionAnswers(问题回答者)、QuestionContent(问题内容)、QUestionFollowers(问题关注者)、QuestionLog(问题日志),四个任务无顺序之分,前提是QuestionURL已抽取完毕;
  • 3、QuestionAnswer(问题回答者)程序运行完后通过user_filter.py抽取answers(回答者),QuestionFollowers(问题关注者)程序运行完后通过user_filter.py抽取followers(关注者),QuestionLog(问题日志)程序运行完后通过user_filter.py抽取editors(编辑者);
  • 4、在上一步抽取出answers(回答者)后,运行AnswerComments(回答评论者)、AnswerVoters(回答点赞者),AnswerComments(回答评论者)程序运行完后通过user_filter.py抽取commenters(评论者)、AnswerVoters(回答点赞者)程序运行完后通过user_filter.py抽取voters(点赞者);
  • 5、通过前四步,我们抽取出了answers(回答者)、followers(关注者)、editors(编辑者)、commenters(评论者)、voters(点赞者)五个者,接下来依次爬取每个者对应的相关信息;
  • 6、(answers(回答者)、followers(关注者)、editors(编辑者)、commenters(评论者)、voters(点赞者))Followers,爬取五个者的关注者;
  • 7、(answers(回答者)、followers(关注者)、editors(编辑者)、commenters(评论者)、voters(点赞者))Following,爬取五个者的关注了,也就是五个者所关注的人;
  • 8、(answers(回答者)、followers(关注者)、editors(编辑者)、commenters(评论者)、voters(点赞者))Info,爬取五个者的个人信息;
  • 9、(answers(回答者)、followers(关注者)、editors(编辑者)、commenters(评论者)、voters(点赞者))Topics,爬取五个者所关注的话题;
  • 10、(answers(回答者)、followers(关注者)、editors(编辑者)、commenters(评论者)、voters(点赞者))User Detail,爬取五个者的个人详细信息;

浏览器对资源文件的获取是通过请求URL实现的。URL是统一资源定位符,也就是常说的网址,利用它可以完成特定的访问方法从互联网中找到资源的位置并获取它。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。Python爬虫的原理就是模仿浏览器行为,对网络服务器请求信息还有对服务器的响应进行基本处理。本文中爬虫的爬取数据处理流程如图所示:
网络爬虫流程图
网络爬虫的基本框架一般有三部分组成:URL管理模块、网页下载模块、网页解析模块。URL管理模块是对要爬取的网页链接进行管理,防止重复爬取或是循环指向。由于本文中的数据爬取是有指向性的,爬虫作业基本是列表任务,因此本文的爬虫程序的URL管理模块比较简单,直接迭代列表内容即可,如果有很多动态信息的请求,需要对URL的参数进行管理。网页下载模块是将URL对应的网页或内容下载到本地或内存中,requests库提供了http所有的基本请求方式,本文中的爬虫程序主要通过requests模块实现对信息内容的请求和下载。网页解析模块是从已下载的网页或内容提取数据,由于下载内容是HTML格式的,而实际需要的数据是那些标签中的文本数据,BeautifulSoup工具是python的一个库,可以定位数据和解析标签数据中的内容,本文中的爬虫程序通过BeautifulSoup工具和正则表达式实现。最后将解析得到的数据保存,便于后面的处理和使用。

由于知乎社区中问答文本都以话题的形式组织在数据库中,所以本文对数据的爬取是基于某个具体话题下的深度搜索爬取(我们爬取了英语学习和流行音乐话题)。爬取数据获取过程及数据内容如图:
爬虫数据获取过程及数据内容
在爬虫过程中,程序错误状态码主要是遇到以下几种情况:

200:请求已成功,请求所希望的响应或数据体将随此响应产生。

403:服务器已经理解请求,但是拒绝执行它。(解决方法:重新登录知乎账号,更换Cookie)

404:请求失败,请求所希望得到的资源未被在服务器上发现。(原因:网页丢失或被删除)

410:被请求资源在服务器上已经不再可用,而且没有任何已知转发地址。(原因:资源丢失)

500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题在服务器端的源代码出现错误时出现。

在上述几种错误码中,403、410、500会导致程序的中断,需要处理后重新运行起来。其中,403表示我们的Cookie过期或者因为访问太过频繁,被服务器端拒绝执行,但我们的账号没有被封,重新登录账号,更换新的cookie即可。410是由于资源不可再用,500表示内部服务错误,二者均是服务器端不可知的错误造成的。

(2)从用户角度出发,我们在2018年10月-11月以及2019年暑期,从知乎“英语学习”话题下的回答者出发,对以下内容进行爬取:

  • 数据准备阶段:确定爬取的用户ID,从之前的answers表里根据自己的需求对回答做约定,将符合要求的所有question_id挑选出来,将question_id下的所有answer_url找出来,删除重复项(方法:set集合)、删除空白项(比对后删除匿名用户),最后留下的anthor_url就是我们所需要的用户ID。数据抽取过程如下所示:
    抽取数据
  • 模块一:1、爬取内容:用户个人信息(用户ID、用户回答数、用户提问数、知乎收录文章数、获赞同数、感谢数、收藏数、关注了数、关注者数、关注的话题数、用户详细资料);2、网址地址:https://www.zhihu.com/people/(用户ID)/answers;3、实现方式:Info(直接爬去)+UserDetail(由于详细信息需要点击“详细信息”才能显示出来,模拟点击,已试验成功);
    模块一
  • 模块二:1、爬取内容:关注话题的标签;2、网页地址:https://www.zhihu.com/people/(用户ID)/following/topics;3、实现方式:使用sub实现翻页功能,先抓大再抓小,定位爬取数据;
    模块二
    程序运行结果如下图所示:

在这里插入图片描述

  • 模块三:1、爬取内容:用户ID、回答的href信息(Href解析:href=”/question/(question_id)/answer/(answer_id)”);2、网页地址:https://www.zhihu.com/people/(用户ID)/answers;3、实现方式:在回答内容进行翻页,获取所有回答的href信息,组装成模块四所要访问的网页地址;
    模块三
  • 模块四:1、爬取内容:用户ID、回答内容、回答创建时间、回答更新时间、获赞同数、评论数;2、网页地址:https://www.zhihu.com/question/(question_id)/answer(answer_id);3、实现方式:Topics(爬取回答所属话题)+定位爬取内容;4、备注:如果一条回答发布后没修改过,显示的是两个“发布于”。所以回答创建时间和回答更新时间的获取不看前面是“发布于”还是“编辑于”,而是看位置;从代码角度来看:回答更新时间;
    模块四
  • 模块五:1、爬取内容:提问内容、问题回答数、问题提出时间、提问的href信息(Href解析:href=”/question/(question_id)”);2、网页地址:https://www.zhihu.com/people/(用户ID)/asks;3、实现方式:定位直接爬取;

模块五-1
模块五-2
程序运行结果如下图所示:
在这里插入图片描述

  • 模块六:1、爬取内容:提问所属的话题标签;2、网页地址:https://www.zhihu.com/question/(question_id);3、实现方式:Topics(爬取提问所属话题);
    模块六
    爬虫内容如上所示,没有使用Scrapy框架,代码简单,欢迎留言交流!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页