前文介绍了python的scrapy爬虫框架和登录知乎的方法.
这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中.

首先,看一下我要爬取哪些内容:

如下图所示,我要爬取一个问题的6个信息:

  • 问题的id(question_id)
  • 标题(title)
  • 问题描述(intro)
  • 回答个数(answer_num)
  • 关注人数(attention_uv)
  • 浏览次数(read_pv) 

爬取结果我保存到mysql数据库中,表名为:zhihu_question
如下图中,红框里的就是上图是有人为我的穿着很轻浮,我该如何回应?问题的信息.
(回答个数,关注着和浏览次数数据不一致是因为我是在爬取文章信息之后的一段时间才抽出来时间写的文章,在这期间回答个数,关注着和浏览次数都会增长.)

爬取方法介绍

我用的是scrapy框架中自带的选择器selectors.
selectors通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。
XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。 CSS 是一门将HTML文档样式化的语言。
XPath最最直观的介绍:
例如:知乎问题页面上的标题的XPath如下:
图中红框里就是标题的XPath.(这只是一个直观的介绍,还有一些细节可以在代码中看到)

爬取代码:

爬取问题的相关信息只需要问题url即可,我这里把收集的问题url写到文件中,爬虫程序去遍历文件,然后依次爬取.
我是在登录成功知乎后的check_login这个方法里面构造的起始url,所以读文件的方法也在这里,代码如下:

def check_login(self, response):# 验证登录成功之后构造初始问题urlfile = open("/root/py_project/zhihu/zhihu/conf/start_questions.txt") while 1:line = file.readline()line = line.strip('\n')  #去掉最后的换行 if not line:breakif(line[0:1] == "#"):#如果是#开头的url, 跳过print linepasselse:print("current url :  " + line)yield scrapy.Request(line,callback=self.parse_question, headers=self.headers)file.close()

其中最重要的一行是:
yield scrapy.Request(line,callback=self.parse_question, headers=self.headers)

yield scrapy.Request 代表开始爬取一条url,如果有多个url就yield多次. 这里的次数等同于start_question.txt中非#开头的url
如下:

callback=self.parse_question 是请求url地址后,返回的response的回调处理函数,也是整个爬取过程中最核心的代码.
如下:

    def parse_question(self,response):item = QuestionItem()url = response.urlquestionid=url[url.rindex("/")+1:]item['questionid']=questioniditem['title']=response.selector.xpath('//*[@class="QuestionHeader-title"]/text()')[0].extract()descarr=response.selector.xpath('//span[@itemprop="text"]/text()')if len(descarr) > 0:item['desc']=descarr[0].extract()else:item['desc']="-"item['answer_num']=response.selector.xpath('//*[@id="QuestionAnswers-answers"]/div/div/div[1]/h4/span/text()[1]')[0].extract().replace(',','')item['attention_uv']=response.selector.xpath('//strong[@class="NumberBoard-itemValue"]/text()')[0].extract().replace(',','')item['read_pv']=response.selector.xpath('//strong[@class="NumberBoard-itemValue"]/text()')[1].extract().replace(',','')yield item

其中主要代码是用selectors.xpath选取我们需要的问题信息(注意:这里的路径并不一定与 chrome的debug模式中复制的xpath一致,直接复制的xpath一般不太能用,自己看html代码结构写的),
获取到问题的信息之后放到item.py中定义好的QuestionItem对象中,然后yield 对象 , 会把对象传递到配置的pipelines中.
pipelines一般是在配置文件中配置,
因为这里爬取问题只保存到mysql数据库,并不下载图片,(而爬取答案需要下载图片)所以各自在在爬虫程序中定义的pipelines,如下:

 custom_settings = { 'ITEM_PIPELINES' : { 'zhihu.mysqlpipelines.MysqlPipeline': 5#'scrapy.pipelines.images.ImagesPipeline': 1,#这个是scrapy自带的图片下载pipelines}   }

以上是爬取知乎问题的整个大致过程.
后文介绍爬取收藏夹下的回答 和 问题下的回答(包括内容和图片).

python scrapy框架爬取知乎提问信息相关推荐

  1. 利用Scrapy框架爬取前途无忧招聘信息

    利用Scrapy框架爬取前途无忧招聘信息 关于安装和命令使用可参考:https://docs.scrapy.org/en/1.7/intro/install.html 先创建项目和爬虫文件 分析网站 ...

  2. python爬取知乎文章_大佬分享Python编程实现爬取知乎用户信息的例子

    有一天 , 我发现我心仪已久的妹子在朋友圈里分享了知乎专栏的文章 , 就知道她也刷知乎 . 如果在知乎上关注她 , 我就能知道 , 她最近关注什么 , 心里想些什么 , 了解了解她喜欢的方面 , 还能 ...

  3. 使用python scrapy爬取知乎提问信息

    前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...

  4. python+scrapy简单爬取淘宝商品信息

    python结合scrapy爬取淘宝商品信息 一.功能说明: 已实现功能: 通过scrapy接入selenium获取淘宝关键字搜索内容下的商品信息. 待扩展功能: 爬取商品中的全部其他商品信息. 二. ...

  5. Python Scrapy框架爬取微博数据

    -1.前言 最近导师接到了一个项目,要爬取社交网路的数据,其中有一部分是爬取微博,Twitter和Facebook.目前实现了微博部分.先写着. 整个工程是使用的python3.6+Scray框架+M ...

  6. scrapy框架爬取知乎用户

    实现爬取一个大V的知乎用户开始爬取开始,我选了轮子哥,然后通过爬取轮子哥的粉丝和他关注的用户信息,再逐一对爬取到的用户进行进一步地获取粉丝和关注的用户信息,这样一直爬下去就能爬到很多很多用户,相当于能 ...

  7. 利用Python Scrapy框架爬取“房天下”网站房源数据

    文章目录 分析网页 获取新房.二手房.租房数据 新房数据 租房数据: 二手房数据 反反爬虫 将数据保存至MongoDB数据库 JSON格式 CSV格式 MongoDB数据库 分析网页 "房天 ...

  8. Python爬虫实战+Scrapy框架 爬取当当网图书信息

    1.环境准备 1.在python虚拟环境终端使用 pip install scrapy下载scrapy依赖库 2.使用scrapy startproject book创建scrapy心目工程 3.使用 ...

  9. python scrapy框架爬取豆瓣top250电影篇一Windows下建立Scrapy项目,pycharm编辑

    1.打开cmd,进入到项目准备所放在的文件夹,执行命令: scrapy startproject douban 然后就可以使用pycharm打开项目了 2.建立spider文件 cmd命令行进入到项目 ...

最新文章

  1. C#中自定义类数组和结构数组的使用
  2. Lucene工具箱之OpenBitSet(一)
  3. linux退出编辑器命令,LINUX中,Vi编辑器的几种模式及保存、退出等命令
  4. 【Http】一文备忘Http状态码(406,415,422)
  5. java-web前端 CSS
  6. VSCode内npm run build编译打包时候报错:code ELIFECYCLE - (已解决)
  7. android获取程序名称,Android获取应用程序名称(ApplicationName)示例
  8. 在 Ubuntu 中使用 GDebi 快速安装 DEB 包
  9. [2018.10.23 T1] 战争
  10. 使用汉化版srvinstw.exe安装/卸载Windows系统服务
  11. 完美解决“运行引擎需要DX11特性等级10.0”
  12. 动易CMS如何能实现直接粘贴把图片上传到服务器中
  13. C语言lowB排序和NB排序
  14. 数据分析报告结构规范设计
  15. 适用计算机专业的电脑配置,适合大学生的组装电脑配置推荐
  16. jq中如何调用vue中的方法
  17. 学生动物网页设计模板下载 大学生宠物HTML网页制作作品 简单宠物狗网页设计成品 dreamweaver学生网站模板
  18. php百分比乘加,PHP学习笔记第一篇 基础知识
  19. YouCompleteMe + Ale异步检测语法
  20. IDEA插件-----FindBugs

热门文章

  1. 高财商的Maze迷宫勒索病毒组织,才出道一年就赚的盆满钵满
  2. 创建一个简单的Python服务器
  3. python翻页爬豆瓣影评_荐爬虫7_《隐秘的角落》豆瓣影评爬取及可视化分析
  4. 如何更新iPhone和iPad应用程序
  5. 《麻省理工科技评论》“全球十大突破性技术”年度系列榜单
  6. 【BP预测】基于鸟群算法优化BP神经网络实现数据预测附Matlab代码
  7. “货运版滴滴”货拉拉又获巨额融资,同城货运市场生变?
  8. [github上传项目:使用token]
  9. Code For Better 谷歌开发者之声—— 在 Windows 10 上对 Google Chrome 进行故障排除
  10. 开复老师自传《世界因你不同》!